diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2018-03-08 06:36:40 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2018-03-08 06:36:52 -0800 |
commit | 347a87745eab23d8427349787bde4a938a1e8c3e (patch) | |
tree | 61bd3dccb63977b684ce6097e55953e3dd3c3de6 /bfd/elf32-i386.c | |
parent | x86: Remove support for old (<= 2.8.1) versions of gcc (diff) | |
download | binutils-gdb-347a87745eab23d8427349787bde4a938a1e8c3e.tar.gz binutils-gdb-347a87745eab23d8427349787bde4a938a1e8c3e.tar.bz2 binutils-gdb-347a87745eab23d8427349787bde4a938a1e8c3e.zip |
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/elf32-i386.c')
-rw-r--r-- | bfd/elf32-i386.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 61a14097b06..557084647cb 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2221,6 +2221,10 @@ elf_i386_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. */ @@ -2440,6 +2444,7 @@ do_ifunc_pointer: } } +skip_ifunc: resolved_to_zero = (eh != NULL && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh)); |