From bf52d7c72035679e6b3ab601133c56a4388f4dc9 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 15 Jun 2016 10:35:38 -0700 Subject: [PATCH] Don't check undefined symbol for IFUNC reloc Since x86 elf_*_check_relocs is called after all symbols have been resolved, there is no need to check undefined symbols for relocations against IFUNC symbols. bfd/ * elf32-i386.c (elf_i386_check_relocs): Don't check undefined symbols for relocations against IFUNC symbols. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. ld/ * testsuite/ld-i386/i386.exp: Run pr19636-2e-nacl. * testsuite/ld-i386/pr19636-2e.d: Skip for NaCl targets. Remove .rel.plt section. * testsuite/ld-i386/pr19636-2e-nacl.d: New file. --- bfd/elf32-i386.c | 11 ++++------- bfd/elf64-x86-64.c | 11 ++++------- ld/testsuite/ld-i386/i386.exp | 1 + ld/testsuite/ld-i386/pr19636-2e-nacl.d | 21 +++++++++++++++++++++ ld/testsuite/ld-i386/pr19636-2e.d | 5 +---- 5 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 ld/testsuite/ld-i386/pr19636-2e-nacl.d diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index a519778..2b7de33 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2149,15 +2149,12 @@ elf_i386_check_relocs (bfd *abfd, if (eh != NULL && (sec->flags & SEC_CODE) != 0) eh->has_non_got_reloc = 1; do_relocation: - /* 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. */ + /* We are called after all symbols have been resolved. Only + relocation against STT_GNU_IFUNC symbol must go through + PLT. */ 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)))) + || h->type == STT_GNU_IFUNC)) { /* If this reloc is in a read-only section, we might need a copy reloc. We can't check reliably at this diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 9044aab..57a3c73 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2541,15 +2541,12 @@ 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; - /* 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. */ + /* We are called after all symbols have been resolved. Only + relocation against STT_GNU_IFUNC symbol must go through + PLT. */ 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)))) + || h->type == STT_GNU_IFUNC)) { /* If this reloc is in a read-only section, we might need a copy reloc. We can't check reliably at this diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 8468920..98f0b1c 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -372,6 +372,7 @@ 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" diff --git a/ld/testsuite/ld-i386/pr19636-2e-nacl.d b/ld/testsuite/ld-i386/pr19636-2e-nacl.d new file mode 100644 index 0000000..f791128 --- /dev/null +++ b/ld/testsuite/ld-i386/pr19636-2e-nacl.d @@ -0,0 +1,21 @@ +#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 diff --git a/ld/testsuite/ld-i386/pr19636-2e.d b/ld/testsuite/ld-i386/pr19636-2e.d index c985242..148e306 100644 --- a/ld/testsuite/ld-i386/pr19636-2e.d +++ b/ld/testsuite/ld-i386/pr19636-2e.d @@ -2,6 +2,7 @@ #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 @@ -9,10 +10,6 @@ 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 #... -- 2.7.4