[hjl@gnu-6 ifunc-global]$ cat foo.c static int two (void) { return 2; } void * foo_ifunc (void) __asm__ ("foo1") __attribute__ ((visibility ("hidden"))); __asm__(".type foo, %gnu_indirect_function"); __asm__("foo = foo1"); __asm__(".hidden foo"); __asm__(".global foo"); void * foo_ifunc (void) { return two; } extern int foo (void); int bar (void) { return foo (); } [hjl@gnu-6 ifunc-global]$ cat bar.c extern int foo (void); int (*foo1_ptr) (void) = foo; [hjl@gnu-6 ifunc-global]$ cat main.c #include <stdlib.h> extern int (*foo1_ptr) (void); int main (void) { int foo1; foo1 = foo1_ptr (); if (foo1 != 2) abort (); return 0; } [hjl@gnu-6 ifunc-global]$ make gcc -g -c -o main.o main.c gcc -g -fPIC -c -o bar.o bar.c gcc -g -fPIC -c -o foo.o foo.c ./ld --shared -o libfoo.so -z nocombreloc bar.o foo.o gcc -o main main.o libfoo.so -Wl,-rpath,. readelf -r --wide libfoo.so Relocation section '.rela.plt' at offset 0x220 contains 1 entries: Offset Info Type Symbol's Value Symbol's Name + Addend 0000000000200430 0000000000000025 R_X86_64_IRELATIVE 26b ./main make: *** [all] Segmentation fault [hjl@gnu-6 ifunc-global]$
CVSROOT: /cvs/src Module name: src Changes by: hjl@sourceware.org 2012-12-16 20:31:08 Modified files: bfd : ChangeLog elf32-i386.c elf64-x86-64.c ld/testsuite : ChangeLog Added files: ld/testsuite/ld-ifunc: ifunc-18a-i386.d ifunc-18a-x86-64.d ifunc-18a.s ifunc-18b-i386.d ifunc-18b-x86-64.d ifunc-18b.s ifunc-19a-i386.d ifunc-19a-x86-64.d ifunc-19a.s ifunc-19b-i386.d ifunc-19b-x86-64.d ifunc-19b.s Log message: Also check local IFUNC references bfd/ PR ld/14968 * elf32-i386.c (elf_i386_adjust_dynamic_symbol): Also check local IFUNC references. * elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise. ld/testsuite/ PR ld/14968 * ld-ifunc/ifunc-18a-i386.d: New file. * ld-ifunc/ifunc-18a-x86-64.d: Likewise. * ld-ifunc/ifunc-18a.s: Likewise. * ld-ifunc/ifunc-18b-i386.d: Likewise. * ld-ifunc/ifunc-18b-x86-64.d: Likewise. * ld-ifunc/ifunc-18b.s: Likewise. * ld-ifunc/ifunc-19a-i386.d: Likewise. * ld-ifunc/ifunc-19a-x86-64.d: Likewise. * ld-ifunc/ifunc-19a.s: Likewise. * ld-ifunc/ifunc-19b-i386.d: Likewise. * ld-ifunc/ifunc-19b-x86-64.d: Likewise. * ld-ifunc/ifunc-19b.s: Likewise. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/ChangeLog.diff?cvsroot=src&r1=1.5882&r2=1.5883 http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf32-i386.c.diff?cvsroot=src&r1=1.287&r2=1.288 http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf64-x86-64.c.diff?cvsroot=src&r1=1.279&r2=1.280 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ChangeLog.diff?cvsroot=src&r1=1.1646&r2=1.1647 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18a-i386.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18a.s.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18b-i386.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18b.s.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19a-i386.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19a-x86-64.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19a.s.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19b-i386.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19b-x86-64.d.diff?cvsroot=src&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19b.s.diff?cvsroot=src&r1=NONE&r2=1.1
Fixed for 2.24.
CVSROOT: /cvs/src Module name: src Branch: binutils-2_23-branch Changes by: hjl@sourceware.org 2012-12-20 18:52:21 Modified files: bfd : ChangeLog elf32-i386.c elf64-x86-64.c ld/testsuite : ChangeLog Added files: ld/testsuite/ld-ifunc: ifunc-18a-i386.d ifunc-18a-x86-64.d ifunc-18a.s ifunc-18b-i386.d ifunc-18b-x86-64.d ifunc-18b.s ifunc-19a-i386.d ifunc-19a-x86-64.d ifunc-19a.s ifunc-19b-i386.d ifunc-19b-x86-64.d ifunc-19b.s Log message: Also check local IFUNC references bfd/ PR ld/14968 * elf32-i386.c (elf_i386_adjust_dynamic_symbol): Also check local IFUNC references. * elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise. ld/testsuite/ PR ld/14968 * ld-ifunc/ifunc-18a-i386.d: New file. * ld-ifunc/ifunc-18a-x86-64.d: Likewise. * ld-ifunc/ifunc-18a.s: Likewise. * ld-ifunc/ifunc-18b-i386.d: Likewise. * ld-ifunc/ifunc-18b-x86-64.d: Likewise. * ld-ifunc/ifunc-18b.s: Likewise. * ld-ifunc/ifunc-19a-i386.d: Likewise. * ld-ifunc/ifunc-19a-x86-64.d: Likewise. * ld-ifunc/ifunc-19a.s: Likewise. * ld-ifunc/ifunc-19b-i386.d: Likewise. * ld-ifunc/ifunc-19b-x86-64.d: Likewise. * ld-ifunc/ifunc-19b.s: Likewise. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/ChangeLog.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=1.5758.2.34&r2=1.5758.2.35 http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf32-i386.c.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=1.279.4.1&r2=1.279.4.2 http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf64-x86-64.c.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=1.270.4.1&r2=1.270.4.2 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ChangeLog.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=1.1579.2.13&r2=1.1579.2.14 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18a-i386.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18a.s.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18b-i386.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-18b.s.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19a-i386.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19a-x86-64.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19a.s.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19b-i386.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19b-x86-64.d.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-19b.s.diff?cvsroot=src&only_with_tag=binutils-2_23-branch&r1=NONE&r2=1.1.2.1