[ELDK] Binutils error - Building a 3.x kernel with ELDK 5.1

Wolfgang Denk wd at denx.de
Mon Mar 19 20:40:43 CET 2012

Dear Fernando Carrio Argos,

In message <862116BDE7CDFD459FBA2837D571B41132EFC0BB at CERNXCHG22.cern.ch> you wrote:
> I applied the sequent commands:
> root at fcarrio-VirtualBox# source /opt/eldk-5.1/powerpc-4xx-softfloat/environment-setup-ppc405-linux

I see two problems here:

- First: thee is absolutely no reason that justifies running these
  commands as root.  It is a very, very bad idea to always work as
  root - please restict this to the very few administrative commands
  that really need it, and work as a normal user otherwise.

- Second: you are building for a 44x system, so you should use a tool
  chain configuration for these, and not one for 40x systems.  Please
  use "powerpc-4xx" instead of "powerpc-4xx-softfloat".

However, none of these items cause the problem you see.

> If I don't specify the ARCH I obtain the next error:
> ...# make 44x/> virtex5_defconfig
> *** Can't find default configuration "arch/x86/configs/44x/virtex5_defconfig"!

I recommend to export ARCH, i. e. run

	$ export ARCH=powerpc

so you can run "make" without adding an "ARCH=" argument on each
command line.

However, this also does not cause your problem.

I tested the very same commands you used, it's working fine for me.

> And when I use the male command it crashes but only for 3.x kernels:
> root at fcarrio-VirtualBox:/home/fcarrio/work/linux1/linux-2.6-xlnx# make -s -j8 ARCH=powerpc simpleImage.initrd.virtex440-ml507
> *** 3.0 kernels no longer build correctly with old versions of binutils.
> *** Please upgrade your binutils to 2.12.1 or newer

OK - there is a significant differenc here.  I did my tests with the
latest stable 3.x kernel (v3.2.9), while you used some 3.0.x version.

The relevant code has changed between these releases - in 3.2.9,
there is no such test any more.  It has been removed with commit

commit a9a8f77ac72d6dd3c92ea268291678836f77681c
Author: Kyle Moffett <Kyle.D.Moffett at boeing.com>
Date:   Mon Nov 7 13:30:43 2011 +0000

    powerpc: Remove buggy 9-year-old test for binutils < 2.12.1
    Recent binutils refuses to assemble AltiVec opcodes when in e500/SPE
    mode, as some of those opcodes alias the "SPE" instructions.  This
    triggers an ancient binutils version check even when building a kernel
    with CONFIG_ALTIVEC disabled.
    In theory, the check could be conditionalized on CONFIG_ALTIVEC, but in
    practice it has long outlived its utility.  It is virtually impossible
    to find binutils older than 2.12.1 (released 2002) in the wild anymore.
    Even ancient RedHat Enterprise Linux 4 has binutils-2.14.
    To fix the kernel build when done natively on e500 systems with this new
    binutils, the test is simply removed.
    Signed-off-by: Kyle Moffett <Kyle.D.Moffett at boeing.com>
    Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>

diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 57af16e..70ba0c0 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -255,12 +255,6 @@ checkbin:
                echo 'disable kernel modules' ; \
                false ; \
-       @if ! /bin/echo dssall | $(AS) -many -o $(TOUT) >/dev/null 2>&1 ; then \
-               echo -n '*** ${VERSION}.${PATCHLEVEL} kernels no longer build ' ; \
-               echo 'correctly with old versions of binutils.' ; \
-               echo '*** Please upgrade your binutils to 2.12.1 or newer' ; \
-               false ; \
-       fi

It would be safe to apply the same patch to your kernel tree.

However, this is also NOT the cause of your problems, because I can build
the latest stable 3.0 release (v3.0.23) just fine, like all others.

As we can see from above patch, the failing test is simple:

	/bin/echo dssall | $(AS) -many -o $(TOUT)

It just tests if the assembler digests a single "dssall" instruction.

The tools for Power Architecture(R) systems in ELDK 5.1 definitely do.

So is there any chance you do NOT run the ELDK assembler?

$(AS) is set in the top level Makefile as "$(CROSS_COMPILE)as" ; to
pick up the wrong version either your PATH or your CROSS_COMPILE
settings would have to be incorrect.

I am positively sure that you set PATH correctly becuase you source the 
"environment-setup-*" script.  However... this does not set CROSS_COMPILE...

Let's try...

-> make -s -j8 ARCH=powerpc simpleImage.initrd.virtex440-ml507
*** 3.0 kernels no longer build correctly with old versions of binutils.
*** Please upgrade your binutils to 2.12.1 or newer
make: *** [checkbin] Error 1


Your problems are caused by not setting CROSS_COMPILE as needed.

Please try:

	$ export ARCH=powerpc
	$ export CROSS_COMPILE=powerpc-linux-

Then retry your build.

I realize that this is a shortcoming of our documentation. I will try
and improve that.

You might also look into using the "eldk-switch" tool which makes all
this stuff much easier - I've always used it, so I never ran into the
issue as you did.

Best regards,

Wolfgang Denk

DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Computers are not intelligent.  They only think they are.

More information about the eldk mailing list