[Clfs-support] Clang -m32 passing incorrect crt1.o crti.o crtn.o paths to ld for 32-bit build.
Roger Frost
frostrl at hotmail.com
Mon Jan 30 08:03:30 PST 2017
Greetings,
I make several deviation, but I hope that someone here has experienced
the issue I'm having and is able to help.
I've built a x86_64 multilib system based on LFS 7.10 (package versions)
and referencing CLFS 3.0.0 (build procedure). I also use Package Users.
I'm now building BLFS 7.10 packages.
I've been fighting with LLVM + Clang + Compiler-RT version 3.8.1 for a
couple of weeks now and have finally identified the cause of my problem.
In a nutshell, Clang doesn't play well with multilib GCC, at least newer
version of one or both.
The problem is that 'clang -m32 ...' is unable to link 32-bit binaries
because it passes incorrect paths to ld, specifically for crt{1,i,n}.o:
"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker
/lib/ld-linux.so.2 -o a.out
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../crt1.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../crti.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/32/crtbegin.o
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/32
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../..
-L/usr/bin/../lib -L/lib -L/usr/lib /tmp/dummy-07e884.o -lgcc
--as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-needed
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/32/crtend.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../crtn.o
In contrast, the 'clang -m64 ...' ld call looks like this, and is correct:
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker
/lib64/ld-linux-x86-64.so.2 -o a.out
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib64/crt1.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib64/crti.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/crtbegin.o
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib64
-L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../..
-L/usr/bin/../lib -L/lib -L/usr/lib /tmp/dummy-4c0643.o -lgcc
--as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-needed
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/crtend.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib64/crtn.o
The correct 32-bit call would be like this, after inserting /../lib in
those 3 paths:
"/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker
/lib/ld-linux.so.2 -o a.out
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crt1.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crti.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/32/crtbegin.o
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/32
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2
-L/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../..
-L/usr/bin/../lib -L/lib -L/usr/lib /tmp/dummy-07e884.o -lgcc
--as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-needed
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/32/crtend.o
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crtn.o
This seems to be an on-going issue in clang development, I think the
earliest post that I seen mention it was from about 2011 or so.
Just for kicks, I also built the newest LLVM release, 3.9.1, and the
issue remains.
Is anyone here able to get 32-bit output from recent versions of Clang/GCC?
Thanks,
Roger
More information about the Clfs-support
mailing list