clang passes incorrect files to the linker during cross-compile |
|||||||||
Issue descriptionDownload 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)
,
Oct 12 2016
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).
,
Oct 12 2016
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!
,
Oct 12 2016
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?
,
Oct 12 2016
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?
,
Oct 12 2016
imo, gcc/clang should behave the same out of the box, including using the existing default sysroot
,
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...
,
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].
,
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
,
Oct 24 2016
,
Jan 21 2017
,
Mar 4 2017
,
Apr 17 2017
,
May 30 2017
,
Aug 1 2017
,
Aug 3 2017
Closing. Please reopen it if its not fixed. Thanks! |
|||||||||
►
Sign in to add a comment |
|||||||||
Comment 1 by yunlian@chromium.org
, Oct 12 2016