+2016-03-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/19784
+ * elf32-i386.c (elf_i386_check_relocs): Increment PLT reference
+ count for locally defined local IFUNC symbols in shared object.
+ * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
+
2016-03-08 H.J. Lu <hongjiu.lu@intel.com>
PR ld/19579
if (eh != NULL && (sec->flags & SEC_CODE) != 0)
eh->has_non_got_reloc = 1;
do_relocation:
- if (h != NULL && bfd_link_executable (info))
+ /* STT_GNU_IFUNC symbol must go through PLT even if it is
+ locally defined and undefined symbol may turn out to be
+ a STT_GNU_IFUNC symbol later. */
+ if (h != NULL
+ && (bfd_link_executable (info)
+ || ((h->type == STT_GNU_IFUNC
+ || h->root.type == bfd_link_hash_undefweak
+ || h->root.type == bfd_link_hash_undefined)
+ && SYMBOLIC_BIND (info, h))))
{
/* If this reloc is in a read-only section, we might
need a copy reloc. We can't check reliably at this
pointer:
if (eh != NULL && (sec->flags & SEC_CODE) != 0)
eh->has_non_got_reloc = 1;
- if (h != NULL && bfd_link_executable (info))
+ /* STT_GNU_IFUNC symbol must go through PLT even if it is
+ locally defined and undefined symbol may turn out to be
+ a STT_GNU_IFUNC symbol later. */
+ if (h != NULL
+ && (bfd_link_executable (info)
+ || ((h->type == STT_GNU_IFUNC
+ || h->root.type == bfd_link_hash_undefweak
+ || h->root.type == bfd_link_hash_undefined)
+ && SYMBOLIC_BIND (info, h))))
{
/* If this reloc is in a read-only section, we might
need a copy reloc. We can't check reliably at this
+2016-03-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/19784
+ * testsuite/ld-i386/i386.exp: Remove pr19636-2e-nacl test.
+ * testsuite/ld-i386/pr19636-2e-nacl.d: Moved to ...
+ * testsuite/ld-i386/pr19636-2e.d: Here. Remove notarget.
+ * testsuite/ld-ifunc/ifunc.exp: Run PR ld/19784 tests.
+ * testsuite/ld-ifunc/pass.out: New file.
+ * testsuite/ld-ifunc/pr19784a.c: Likewise.
+ * testsuite/ld-ifunc/pr19784b.c: Likewise.
+ * testsuite/ld-ifunc/pr19784c.c: Likewise.
+
2016-03-08 H.J. Lu <hongjiu.lu@intel.com>
PR ld/19774
run_dump_test "pr19636-2d"
run_dump_test "pr19636-2d-nacl"
run_dump_test "pr19636-2e"
-run_dump_test "pr19636-2e-nacl"
run_dump_test "pr19636-3a"
run_dump_test "pr19636-3b"
run_dump_test "pr19636-3c"
+++ /dev/null
-#source: pr19636-2.s
-#as: --32 -mrelax-relocations=no
-#ld: -shared -Bsymbolic -m elf_i386
-#readelf : -r --wide --dyn-syms
-#target: i?86-*-nacl* x86_64-*-nacl*
-
-Relocation section '\.rel\.dyn' at offset [0x0-9a-f]+ contains 3 entries:
- +Offset +Info +Type +Sym. Value +Symbol's Name
-[0-9a-f]+ +[0-9a-f]+ +R_386_32 +0+ +func
-[0-9a-f]+ +[0-9a-f]+ +R_386_PC32 +0+ +func
-[0-9a-f]+ +[0-9a-f]+ +R_386_GLOB_DAT +0+ +func
-
-Relocation section '\.rel\.plt' at offset [0x0-9a-f]+ contains 1 entries:
- +Offset +Info +Type +Sym. Value +Symbol's Name
-[0-9a-f]+ +[0-9a-f]+ +R_386_JUMP_SLOT +0+ +func
-
-Symbol table '\.dynsym' contains [0-9]+ entries:
- +Num: +Value +Size Type +Bind +Vis +Ndx Name
-#...
- +[0-9]+: +[a-f0-9]+ +0 +NOTYPE +WEAK +DEFAULT +UND +func
-#pass
#as: --32 -mrelax-relocations=no
#ld: -shared -Bsymbolic -m elf_i386
#readelf : -r --wide --dyn-syms
-#notarget: i?86-*-nacl* x86_64-*-nacl*
Relocation section '\.rel\.dyn' at offset [0x0-9a-f]+ contains 3 entries:
+Offset +Info +Type +Sym. Value +Symbol's Name
[0-9a-f]+ +[0-9a-f]+ +R_386_PC32 +0+ +func
[0-9a-f]+ +[0-9a-f]+ +R_386_GLOB_DAT +0+ +func
+Relocation section '\.rel\.plt' at offset [0x0-9a-f]+ contains 1 entries:
+ +Offset +Info +Type +Sym. Value +Symbol's Name
+[0-9a-f]+ +[0-9a-f]+ +R_386_JUMP_SLOT +0+ +func
+
Symbol table '\.dynsym' contains [0-9]+ entries:
+Num: +Value +Size Type +Bind +Vis +Ndx Name
#...
{} \
"libpr18841c.so" \
] \
+ [list \
+ "Build libpr19784a.so" \
+ "-shared -Wl,-Bsymbolic-functions" \
+ "-fPIC -O2 -g" \
+ { pr19784b.c pr19784c.c } \
+ {} \
+ "libpr19784a.so" \
+ ] \
+ [list \
+ "Build libpr19784b.so" \
+ "-shared -Wl,-Bsymbolic-functions" \
+ "-fPIC -O2 -g" \
+ { pr19784c.c pr19784b.c } \
+ {} \
+ "libpr19784b.so" \
+ ] \
+ [list \
+ "Build pr19784a.o" \
+ "" \
+ "" \
+ { pr19784a.c } \
+ "" \
+ "" \
+ ] \
]
run_ld_link_exec_tests [] [list \
"pr18841c" \
"pr18841.out" \
] \
+ [list \
+ "Run pr19784a" \
+ "tmpdir/pr19784a.o tmpdir/libpr19784a.so" \
+ "" \
+ { dummy.c } \
+ "pr19784a" \
+ "pass.out" \
+ ] \
+ [list \
+ "Run pr19784b" \
+ "--as-needed tmpdir/pr19784a.o tmpdir/libpr19784b.so" \
+ "" \
+ { dummy.c } \
+ "pr19784b" \
+ "pass.out" \
+ ] \
]
--- /dev/null
+void bar(void);
+int main(void)
+{
+ bar();
+ return 0;
+}
--- /dev/null
+int foo (int x) __attribute__ ((ifunc ("resolve_foo")));
+
+static int foo_impl(int x)
+{
+ return x;
+}
+
+void *resolve_foo (void)
+{
+ return (void *) foo_impl;
+}
--- /dev/null
+#include <stdio.h>
+
+extern void abort (void);
+extern int foo (int) __attribute__ ((visibility("hidden")));
+
+int bar()
+{
+ if (foo (5) != 5)
+ abort ();
+ printf("PASS\n");
+}