x86-64: Use PLT address for PC-relative reloc
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 14 Feb 2018 11:50:40 +0000 (03:50 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 14 Feb 2018 11:50:55 +0000 (03:50 -0800)
commit451875b4f976a527395e9303224c7881b65e12ed
tree15ebc416aa1dd49b234ad02dfdf8a9ebe4f92f11
parentf98b2e334fcca666afaee3c6546b9fc91a4963d4
x86-64: Use PLT address for PC-relative reloc

Since PLT in PDE and PC-relative PLT in PIE can be used as function
address, there is no need for dynamic PC-relative relocation against
a dynamic function definition in PIE.  Linker should resolve PC-relative
reference to its PLT address.

NB: i386 has non-PIC PLT and PIC PLT.  Only non-PIC PLT in PDE can
be used as function address.  PIC PLT in PIE can't be used as
function address.

bfd/

PR ld/22842
* elf32-i386.c (elf_i386_check_relocs): Pass FALSE for non
PC-relative PLT to NEED_DYNAMIC_RELOCATION_P.
* elf64-x86-64.c (elf_x86_64_check_relocs): Create PLT for
R_X86_64_PC32 reloc against dynamic function in data section.
Pass TRUE for PC-relative PLT to NEED_DYNAMIC_RELOCATION_P.
(elf_x86_64_relocate_section): Use PLT for R_X86_64_PC32 reloc
against dynamic function in data section.
* elfxx-x86.c (elf_x86_allocate_dynrelocs): Use PLT in PIE as
function address only if pcrel_plt is true.
(_bfd_x86_elf_link_hash_table_create): Set pcrel_plt.
* elfxx-x86.h (NEED_DYNAMIC_RELOCATION_P): Add PCREL_PLT for
PC-relative PLT.  If PLT is PC-relative, don't generate dynamic
PC-relative relocation against a function definition in data
secton in PIE.  Remove the obsolete comments.
(elf_x86_link_hash_table): Add pcrel_plt.

ld/

PR ld/22842
* testsuite/ld-i386/i386.exp: Run PR ld/22842 tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr22842a.c: New file.
* testsuite/ld-i386/pr22842b.S: Likewise.
* testsuite/ld-x86-64/pr22842a.c: Likewise.
* testsuite/ld-x86-64/pr22842a.rd: Likewise.
* testsuite/ld-x86-64/pr22842b.S: Likewise.
* testsuite/ld-x86-64/pr22842b.rd: Likewise.
14 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.c
bfd/elfxx-x86.h
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr22842a.c [new file with mode: 0644]
ld/testsuite/ld-i386/pr22842b.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22842a.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22842a.rd [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22842b.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22842b.rd [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp