aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-x86-64.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-03-08 06:36:40 -0800
committerH.J. Lu <hjl.tools@gmail.com>2018-03-08 06:36:52 -0800
commit347a87745eab23d8427349787bde4a938a1e8c3e (patch)
tree61bd3dccb63977b684ce6097e55953e3dd3c3de6 /bfd/elf64-x86-64.c
parentbd5dea8822e515faf305690ca5c5281132d95587 (diff)
downloadgdb-347a87745eab23d8427349787bde4a938a1e8c3e.zip
gdb-347a87745eab23d8427349787bde4a938a1e8c3e.tar.gz
gdb-347a87745eab23d8427349787bde4a938a1e8c3e.tar.bz2
x86: Treat relocation against IFUNC symbol as FUNC
When resolving a relocation against IFUNC symbol in a SHT_NOTE section without SHF_ALLOC, we treat it as relocation against FUNC symbol since it needs the address of IFUNC symbol, not the address returned by IFUNC function. bfd/ PR ld/22929 * elf32-i386.c (elf_i386_relocate_section): Treat relocation against IFUNC symbol in SHT_NOTE section without SHF_ALLOC as relocation against FUNC symbol. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. ld/ PR ld/22929 * testsuite/ld-i386/i386.exp: Run PR ld/22929 test. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr22929.d: New file. * testsuite/ld-i386/pr22929.s: Likewise. * testsuite/ld-x86-64/pr22929.d: Likewise. * testsuite/ld-x86-64/pr22929.s: Likewise.
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r--bfd/elf64-x86-64.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 7016964..a964316 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -2503,6 +2503,10 @@ elf_x86_64_relocate_section (bfd *output_bfd,
if ((input_section->flags & SEC_ALLOC) == 0)
{
+ /* If this is a SHT_NOTE section without SHF_ALLOC, treat
+ STT_GNU_IFUNC symbol as STT_FUNC. */
+ if (elf_section_type (input_section) == SHT_NOTE)
+ goto skip_ifunc;
/* Dynamic relocs are not propagated for SEC_DEBUGGING
sections because such sections are not SEC_ALLOC and
thus ld.so will not process them. */
@@ -2726,6 +2730,7 @@ do_ifunc_pointer:
}
}
+skip_ifunc:
resolved_to_zero = (eh != NULL
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));