Description of problem: 2.19.51.0.11-24.fc12 ld creates STT_GNU_IFUNC SHN_UNDEF symbols. How reproducible: extern __SIZE_TYPE__ strlen (const char *); int foo (const char *p) { return strlen (p); } gcc -shared -fpic -o /tmp/x.so /tmp/x.c readelf -Ws /tmp/x.so | grep IFUNC 4: 0000000000000000 0 IFUNC GLOBAL DEFAULT UND strlen.5 (2) 47: 0000000000000000 0 IFUNC GLOBAL DEFAULT UND strlen@@GLIBC_2.2.5 Haven't checked trunk binutils. STT_GNU_IFUNC should be used solely on symbol definitions, not when a symbol is undefined. Whether it will bind to STT_GNU_IFUNC or normal STT_FUNC is unclear at runtime, and STT_FUNC should be used. It would be very good if this could be fixed before the mass rebuild starts (I believe 2009-07-23).
*** Bug 512078 has been marked as a duplicate of this bug. ***
Here is a reproducer in the binutils tree: BINUTILS_OBJ=/usr/src/binutils/obj BINUTILS_SRC=/usr/src/binutils gcc -B$BINUTILS_OBJ/ld/tmpdir/gas/ -I$BINUTILS_SRC/ld/testsuite/ld-ifunc -g -O2 \ -c -fPIC -DWITH_IFUNC -c $BINUTILS_SRC/ld/testsuite/ld-ifunc/lib.c \ -o shared_ifunc.o $BINUTILS_OBJ/ld/ld-new -o libshared_ifunc.so -shared shared_ifunc.o echo 'extern int library_func2 (void);' > test.c echo 'int main (void) { library_func2 (); return 0; }' >> test.c gcc -B $BINUTILS_OBJ/ld/tmpdir/ld/ -o test test.c ./libshared_ifunc.so $BINUTILS_OBJ/binutils/readelf -Ws test | grep IFUNC.*UND echo 'extern int library_func2 (void);' > test2.c echo 'int (*fn) (void) = library_func2;' >> test2.c echo 'int main (void) { fn (); return 0; }' >> test2.c gcc -B $BINUTILS_OBJ/ld/tmpdir/ld/ -o test2 test2.c ./libshared_ifunc.so $BINUTILS_OBJ/binutils/readelf -Ws test2 | grep IFUNC.*UND test2 is what is fatal for gnome-panel, but both cases are wrong, no SHN_UNDEF symbols should be ever STT_GNU_IFUNC, the should be STT_FUNC instead.
It is fixed in the Linux binutils 2.19.51.0.13.
Thanks, HJ. NickC, please build a new RPM right away. We need it for the mass rebuild.
New RPMS should be ready: binutils-2.19.51.0.13-28.fc12.src.rpm Cheers Nick
The current linker may be broken: http://sourceware.org/ml/binutils/2009-07/msg00220.html