ld ignores used libraries (especially libc) with --as-needed
Bug #1194051 reported by
Matthias Klose
This bug affects 1 person
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Linaro Binutils |
Invalid
|
Undecided
|
Unassigned | ||
binutils |
Confirmed
|
Medium
|
|||
binutils (Debian) |
Fix Released
|
Unknown
|
|||
binutils (Ubuntu) |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
see the debian and upstream issues
Changed in binutils (Debian): | |
status: | Unknown → Confirmed |
Changed in binutils: | |
importance: | Unknown → Medium |
status: | Unknown → Confirmed |
Changed in binutils (Debian): | |
status: | Confirmed → Fix Released |
Changed in binutils-linaro: | |
status: | New → Invalid |
To post a comment you must log in.
[forwarded from http:// bugs.debian. org/712081]
Compiling a trivial int a() {return 17;} file with
g++ -v -Wl,--as-needed t.c --shared -o libt${n}.so
With binutils 2.23.52.20130612-1:
$ readelf -d /tmp/libt3.so | grep NEEDED
$ objdump -T libt3.so | grep _cxa_fin
0000000000000000 w D *UND* 0000000000000000 __cxa_finalize
While with binutils 2.22-8 and 2.23.2:
$ readelf -d libt2.so | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
$ objdump -T libt2.so | grep _cxa_fin
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize
i.e. the dependency on libc.so.6 is missing and what is worse:
the libc6 symbol is not properly versioned, which might mean that that
library might cause programs segfault with future libc versions.
g++ says it does: GCC_OPTIONS= '-v' '-shared' '-o' 'libt3.so' '-shared-libgcc' gcc/x86_ 64-linux- gnu/4.7/ collect2 --sysroot=/ --build-id gcc/x86_ 64-linux- gnu/4.7/ ../../. ./x86_64- linux-gnu/ crti.o gcc/x86_ 64-linux- gnu/4.7/ crtbeginS. o lib/gcc/ x86_64- linux-gnu/ 4.7 lib/gcc/ x86_64- linux-gnu/ 4.7/../ ../../x86_ 64-linux- gnu lib/gcc/ x86_64- linux-gnu/ 4.7/../ ../../. ./lib x86_64- linux-gnu -L/lib/../lib -L/usr/ lib/x86_ 64-linux- gnu lib/gcc/ x86_64- linux-gnu/ 4.7/../ ../.. gcc/x86_ 64-linux- gnu/4.7/ crtendS. o gcc/x86_ 64-linux- gnu/4.7/ ../../. ./x86_64- linux-gnu/ crtn.o
COLLECT_
'-mtune=generic' '-march=x86-64'
/usr/lib/
--eh-frame-hdr -m elf_x86_64 --hash-style=gnu -shared -o libt3.so
/usr/lib/
/usr/lib/
-L/usr/
-L/usr/
-L/usr/
-L/lib/
-L/usr/lib/../lib -L/usr/
--as-needed /tmp/cc8CjUQJ.o -lstdc++ -lm -lgcc_s -lc -lgcc_s
/usr/lib/
/usr/lib/
with the need for symbol __cxa_finalize coming from crtbeginS.o:
$ objdump -t /usr/lib/ gcc/x86_ 64-linux- gnu/4.7/ crtbeginS. o | grep _cxa_fi
0000000000000000 w *UND* 0000000000000000 __cxa_finalize
gcc unlike g++ is not affected because it puts a --no-as-needed before -lc