mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
Handle local IFUNC symbols in shared object
Increment PLT reference count for locally defined local IFUNC symbols in shared object since 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. bfd/ 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. ld/ 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.
This commit is contained in:
@ -1,3 +1,10 @@
|
||||
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
|
||||
|
@ -1808,7 +1808,15 @@ elf_i386_check_relocs (bfd *abfd,
|
||||
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
|
||||
|
@ -1999,7 +1999,15 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
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
|
||||
|
12
ld/ChangeLog
12
ld/ChangeLog
@ -1,3 +1,15 @@
|
||||
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
|
||||
|
@ -337,7 +337,6 @@ run_dump_test "pr19636-2c-nacl"
|
||||
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"
|
||||
|
@ -1,21 +0,0 @@
|
||||
#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
|
@ -2,7 +2,6 @@
|
||||
#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
|
||||
@ -10,6 +9,10 @@ Relocation section '\.rel\.dyn' at offset [0x0-9a-f]+ contains 3 entries:
|
||||
[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
|
||||
#...
|
||||
|
@ -505,6 +505,30 @@ run_cc_link_tests [list \
|
||||
{} \
|
||||
"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 \
|
||||
@ -532,4 +556,20 @@ 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" \
|
||||
] \
|
||||
]
|
||||
|
1
ld/testsuite/ld-ifunc/pass.out
Normal file
1
ld/testsuite/ld-ifunc/pass.out
Normal file
@ -0,0 +1 @@
|
||||
PASS
|
6
ld/testsuite/ld-ifunc/pr19784a.c
Normal file
6
ld/testsuite/ld-ifunc/pr19784a.c
Normal file
@ -0,0 +1,6 @@
|
||||
void bar(void);
|
||||
int main(void)
|
||||
{
|
||||
bar();
|
||||
return 0;
|
||||
}
|
11
ld/testsuite/ld-ifunc/pr19784b.c
Normal file
11
ld/testsuite/ld-ifunc/pr19784b.c
Normal file
@ -0,0 +1,11 @@
|
||||
int foo (int x) __attribute__ ((ifunc ("resolve_foo")));
|
||||
|
||||
static int foo_impl(int x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
void *resolve_foo (void)
|
||||
{
|
||||
return (void *) foo_impl;
|
||||
}
|
11
ld/testsuite/ld-ifunc/pr19784c.c
Normal file
11
ld/testsuite/ld-ifunc/pr19784c.c
Normal file
@ -0,0 +1,11 @@
|
||||
#include <stdio.h>
|
||||
|
||||
extern void abort (void);
|
||||
extern int foo (int) __attribute__ ((visibility("hidden")));
|
||||
|
||||
int bar()
|
||||
{
|
||||
if (foo (5) != 5)
|
||||
abort ();
|
||||
printf("PASS\n");
|
||||
}
|
Reference in New Issue
Block a user