Bug 512937
| Summary: | Invalid STT_GNU_IFUNC SHN_UNDEF symbols | ||
|---|---|---|---|
| Product: | [Fedora] Fedora | Reporter: | Jakub Jelinek <jakub> |
| Component: | binutils | Assignee: | Nick Clifton <nickc> |
| Status: | CLOSED RAWHIDE | QA Contact: | Fedora Extras Quality Assurance <extras-qa> |
| Severity: | high | Docs Contact: | |
| Priority: | high | ||
| Version: | rawhide | CC: | drepper, hongjiu.lu, jakub, jan.kratochvil, jfrieben, nickc, nicolas.mailhot |
| Target Milestone: | --- | ||
| Target Release: | --- | ||
| Hardware: | All | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Fixed In Version: | Doc Type: | Bug Fix | |
| Doc Text: | Story Points: | --- | |
| Clone Of: | Environment: | ||
| Last Closed: | 2009-07-22 08:37:33 UTC | Type: | --- |
| Regression: | --- | Mount Type: | --- |
| Documentation: | --- | CRM: | |
| Verified Versions: | Category: | --- | |
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
| Cloudforms Team: | --- | Target Upstream Version: | |
| Embargoed: | |||
| Bug Depends On: | |||
| Bug Blocks: | 473303 | ||
*** 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 |
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).