New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 655320 link

Starred by 1 user

Issue metadata

Status: Verified
Owner:
Last visit > 30 days ago
Closed: Oct 2016
Cc:
EstimatedDays: ----
NextAction: ----
OS: Chrome
Pri: 2
Type: Bug



Sign in to add a comment

clang passes incorrect files to the linker during cross-compile

Project Member Reported by rahulchaudhry@chromium.org, Oct 12 2016

Issue description

Download the attached files main0.o and libgo.so in a ChromeOS chroot.

$ file main0.o libgo.so 
main0.o:  ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
libgo.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=4b3a029e95b331263e6898a31ddf7558e4c3bfb2, not stripped

$ armv7a-cros-linux-gnueabi-gcc -o testp main0.o libgo.so
<success>

$ armv7a-cros-linux-gnueabi-clang -o testp main0.o libgo.so
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: error: /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o: incompatible target
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: error: main0.o: incompatible target
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: error: libgo.so: incompatible target
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: error: /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o: incompatible target
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: warning: skipping incompatible /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/libgcc_s.so.1 while searching for libgcc_s.so.1
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: warning: skipping incompatible /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/libgcc_s.so.1 while searching for libgcc_s.so.1
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: error: cannot find libgcc_s.so.1
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: warning: skipping incompatible /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/libgcc_s.so.1 while searching for libgcc_s.so.1
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: warning: skipping incompatible /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/libgcc_s.so.1 while searching for libgcc_s.so.1
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/binutils-bin/2.25.51/ld.gold.real: error: cannot find libgcc_s.so.1
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/Scrt1.o(.text+0x20): error: undefined reference to 'main'
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)

 
main0.o
2.1 KB Download
libgo.so
1.1 MB Download
You need to specify sysroot to make it work.
Looking at verbose output (-v) from gcc invocation, "armv7a-cros-linux-gnueabi-gcc" invokes the linker like this:

/usr/libexec/gcc/armv7a-cros-linux-gnueabi/4.9.x/collect2 \
        -plugin /usr/libexec/gcc/armv7a-cros-linux-gnueabi/4.9.x/liblto_plugin.so \
        -plugin-opt=/usr/libexec/gcc/armv7a-cros-linux-gnueabi/4.9.x/lto-wrapper \
        -plugin-opt=-fresolution=/tmp/ccevi8BB.res \
        -plugin-opt=-pass-through=-lgcc \
        -plugin-opt=-pass-through=-lgcc_s \
        -plugin-opt=-pass-through=-lc \
        -plugin-opt=-pass-through=-lgcc \
        -plugin-opt=-pass-through=-lgcc_s \
        --sysroot=/usr/armv7a-cros-linux-gnueabi \
        --build-id \  
        --eh-frame-hdr \
        -dynamic-linker /lib/ld-linux-armhf.so.3 \
        -X \
        -m armelf_linux_eabi \
        -pie \
        -o testp \
        /usr/armv7a-cros-linux-gnueabi/usr/lib/Scrt1.o \
        /usr/armv7a-cros-linux-gnueabi/usr/lib/crti.o \
        /usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o \
        --warn-poison-system-directories \
        -L/usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x \
        -L/usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../armv7a-cros-linux-gnueabi/lib \
        -L/usr/armv7a-cros-linux-gnueabi/lib \
        -L/usr/armv7a-cros-linux-gnueabi/usr/lib \
        main0.o \
        libgo.so \
        -lgcc \
        --as-needed \
        -lgcc_s \
        --no-as-needed \
        -lc \
        -lgcc \
        --as-needed \
        -lgcc_s \
        --no-as-needed \
        /usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o \
        /usr/armv7a-cros-linux-gnueabi/usr/lib/crtn.o


Inspecting all the files passed to the collect2 program:

$ file /usr/armv7a-cros-linux-gnueabi/usr/lib/Scrt1.o \
       /usr/armv7a-cros-linux-gnueabi/usr/lib/crti.o \
       /usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o \
       main0.o \
       libgo.so \
       /usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o \
       /usr/armv7a-cros-linux-gnueabi/usr/lib/crtn.o
/usr/armv7a-cros-linux-gnueabi/usr/lib/Scrt1.o:           ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), for GNU/Linux 2.6.16, not stripped
/usr/armv7a-cros-linux-gnueabi/usr/lib/crti.o:            ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
/usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
main0.o:                                                  ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
libgo.so:                                                 ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=4b3a029e95b331263e6898a31ddf7558e4c3bfb2, not stripped
/usr/lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o:   ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
/usr/armv7a-cros-linux-gnueabi/usr/lib/crtn.o:            ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped

They're all 32-bit ARM objects (as expected).

Looking at verbose output (-v) from clang invocation, "armv7a-cros-linux-gnueabi-clang" invokes the linker like this:

/usr/libexec/gcc/armv7a-cros-linux-gnueabi/ld \
        -pie \
        -X \
        --build-id \
        --eh-frame-hdr \
        -m armelf_linux_eabi \
        -dynamic-linker /lib/ld-linux-armhf.so.3 \
        -o testp \
        /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/Scrt1.o \
        /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/crti.o \
        /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o \
        -L/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x \
        -L/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../armv7a-cros-linux-gnueabi/lib/../lib \
        -L/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib \
        -L/usr/bin/../lib \
        -L/lib/../lib \
        -L/usr/lib/../lib \
        -L/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../armv7a-cros-linux-gnueabi/lib \
        -L/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../.. \
        -L/usr/bin/../lib \
        -L/lib \
        -L/usr/lib \
        main0.o \
        libgo.so \
        -lgcc \
        --as-needed \
        -lgcc_s \
        --no-as-needed \
        -lc \
        -lgcc \
        --as-needed \
        -lgcc_s \
        --no-as-needed \
        /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o \
        /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/crtn.o


Inspecting all the files passed to the linker:

$ file /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/Scrt1.o \
       /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/crti.o \
       /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o \
       main0.o \
       libgo.so \
       /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o \
       /usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/crtn.o
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/Scrt1.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.16, not stripped
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/crti.o:  ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtbeginS.o:             ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
main0.o:                                                                                                                                                    ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
libgo.so:                                                                                                                                                   ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=4b3a029e95b331263e6898a31ddf7558e4c3bfb2, not stripped
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/crtendS.o:               ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
/usr/x86_64-pc-linux-gnu/armv7a-cros-linux-gnueabi/gcc-bin/4.9.x/../../../../../usr/bin/../lib/gcc/armv7a-cros-linux-gnueabi/4.9.x/../../../../lib/crtn.o:  ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

These are a mix of x86-64 and 32 bit ARM objects!
Hmm.. Setting sysroot to /build/daisy (or /usr/armv7a-cros-linux-gnueabi) seems to fix this.
Shouldn't this be the default, though?
We specify --with-sysroot=/usr/armv7a-cros-linux-gnueabi when configuring armv7a-cros-linux-gnueabi-gcc.
Is there something similar for clang?
Should we set the default properly in sysroot_wrapper if not set in the environment?

Cc: cmt...@chromium.org vapier@chromium.org llozano@chromium.org
Currently the logic is if the user does not specify the sysroot, it will print some warning message. Any opinions about whether should we set default sysroot?

Comment 6 by vapier@chromium.org, Oct 12 2016

imo, gcc/clang should behave the same out of the box, including using the existing default sysroot

Comment 7 by cmt...@chromium.org, Oct 13 2016

One problem I see with trying to set the sysroot by default:  How do we know which arm (or aarch64 or i386) board the user actually set up?  You specify the compiler by architecture, not by board...

Comment 8 by vapier@chromium.org, Oct 13 2016

the default sysroot doesn't use a board.  gcc defaults to /usr/$CTARGET, and the $CTARGET is encoded in the argv[0].
Project Member

Comment 9 by bugdroid1@chromium.org, Oct 24 2016

The following revision refers to this bug:
  https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/c17f3ff9fd9c9f6abecb75d64945c3acea81c0c7

commit c17f3ff9fd9c9f6abecb75d64945c3acea81c0c7
Author: Rahul Chaudhry <rahulchaudhry@chromium.org>
Date: Fri Oct 14 21:17:00 2016

sys-devel/gcc: set the default sysroot for clang in the sysroot wrapper.

Default sysroot for gcc is set during configure.

BUG= chromium:655320 
TEST=Running armv7a-cros-linux-gnueabi-clang without SYSROOT environment
variable picks the right default sysroot.

Change-Id: I3f055d320c89cecc927f7ac3e2898883330a6f76
Reviewed-on: https://chromium-review.googlesource.com/399399
Commit-Ready: Rahul Chaudhry <rahulchaudhry@chromium.org>
Tested-by: Rahul Chaudhry <rahulchaudhry@chromium.org>
Reviewed-by: Rahul Chaudhry <rahulchaudhry@chromium.org>

[modify] https://crrev.com/c17f3ff9fd9c9f6abecb75d64945c3acea81c0c7/sys-devel/gcc/files/sysroot_wrapper.hardened
[rename] https://crrev.com/c17f3ff9fd9c9f6abecb75d64945c3acea81c0c7/sys-devel/gcc/gcc-4.9.2-r144.ebuild

Owner: rahulchaudhry@chromium.org
Status: Fixed (was: Untriaged)

Comment 11 by dchan@google.com, Jan 21 2017

Labels: VerifyIn-57

Comment 12 by dchan@google.com, Mar 4 2017

Labels: VerifyIn-58

Comment 13 by dchan@google.com, Apr 17 2017

Labels: VerifyIn-59

Comment 14 by dchan@google.com, May 30 2017

Labels: VerifyIn-60
Labels: VerifyIn-61
Status: Verified (was: Fixed)
Closing. Please reopen it if its not fixed. Thanks!

Sign in to add a comment