https://sourceware.org/bugzilla/show_bug.cgi?id=32006
Bug ID: 32006
Summary: ld pulls symbols from wrong library
Product: binutils
Version: 2.41
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: binutils
Assignee: unassigned at sourceware dot org
Reporter: felix-glibc at fefe dot de
Target Milestone: ---
I'm not quite sure what is going on here.
Basically, I'm linking a program like this:
$ diet -v gcc -o t test.c -pthread -Wl,-Map,mapfile
diet is a wrapper from dietlibc and it will transform the command line to this:
$ gcc -nostdlib -static -L/opt/diet/lib-x86_64 /opt/diet/lib-x86_64/start.o
-o t test.c -D_REENTRANT -lpthread -Wl,-Map,mapfile -isystem /opt/diet/include
-D__dietlibc__ /opt/diet/lib-x86_64/libc.a -lgcc /opt/diet/lib-x86_64/crtend.o
Now, there is a symbol called __stdio_init_file that is exported by fdglue2.o
in libc.a and it is also exported from pthread_fdglue2.o in libpthread.a.
My understanding is that ld should always satisfy references from the first
library on the command line that has an export under that name (leaving
trickery like weak symbols aside for now).
Here's the load list from the mapfile:
LOAD /opt/diet/lib-x86_64/start.o
LOAD /tmp/ccnyXICz.o
LOAD /opt/diet/lib-x86_64/libpthread.a
LOAD /opt/diet/lib-x86_64/libc.a
LOAD /usr/lib64/gcc/x86_64-pc-linux-gnu/14.1.0/libgcc.a
LOAD /opt/diet/lib-x86_64/crtend.o
libpthread.a is named first, then libc.a.
Here's what nm says about libpthread.a:
pthread_fdglue2.o:
0000000000000000 T __stdio_init_file
U __stdio_init_file_nothreads
Here's what nm says about libc.a:
fdglue2.o:
U _GLOBAL_OFFSET_TABLE_
U __errno_location
U __libc_close
U __stdio_atexit
U __stdio_flushall
0000000000000000 W __stdio_init_file
0000000000000000 T __stdio_init_file_nothreads
U __stdio_root
U atexit
U free
U fstat
U malloc
Making __stdio_init_file weak is my current attempt to fix the situation but it
is not helping. So both libraries export __stdio_init_file and libpthread.a is
named first, yet ld takes the one from libc instead:
/opt/diet/lib-x86_64/libc.a(fdglue2.o)
/opt/diet/lib-x86_64/libc.a(fopen.o) (__stdio_init_file)
What the hell is going on? Is this a bug in binutils ld?
For good measure I tried -fuse-ld=gold (same behavior) and -fuse-ld=lld (pulls
in pthread_fdglue2.o) and -fuse-ld=mold (also pulls in pthread_fdglue2.o).
Have I been relying on undefined behaviour for over a decade?
--
You are receiving this mail because:
You are on the CC list for the bug.