Don't generate PLT for IFUNC GOT/pointer reference
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 18 Jun 2016 16:16:52 +0000 (09:16 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 18 Jun 2016 16:17:25 +0000 (09:17 -0700)
commit233cc9c13af8e8182d0ce5b306526b59f5b11f37
tree6381519cd959d8a585cd640de586e6aab3ca715b
parent854594f5ce00381eb0ed57e3c7fa08b5971eabec
Don't generate PLT for IFUNC GOT/pointer reference

If a backend supports it, PLT entry isn't needed when all references
to a STT_GNU_IFUNC symbols are done via GOT or static function pointers.
For GOT entries, We generate dynamic R_*_GLOB_DAT relocations for
preemptable symbols and R_*_IRELATIVE relocations for non-preemptable
symbols to update them with real function address.  For static pointer
pointers, we generate dynamic pointer relocations and store them in:

1. .rel[a].ifunc section in PIC object.
2. .rel[a].got section in dynamic executable.
3. .rel[a].iplt section in static executable.

We don't allocate GOT entry if it isn't used.

bfd/

PR ld/20253
* elf-bfd.h (_bfd_elf_allocate_ifunc_dyn_relocs): Add an
bfd_boolean argument.
* elf-ifunc.c (_bfd_elf_create_ifunc_sections): Replace
"shared object" with "PIC object" in comments.
(_bfd_elf_allocate_ifunc_dyn_relocs): Updated.  Replace
"shared object" with "PIC object" in comments.  Avoid PLT if
requested.  Generate dynamic relocations for non-GOT references.
Make room for the special first entry in PLT and allocate PLT
entry only for PLT and PC-relative references.  Store dynamic
GOT relocations in .rel[a].iplt section for static executables.
If PLT isn't used, always use GOT for symbol value.  Don't
allocate GOT entry if it isn't used.
* elf32-i386.c (elf_i386_check_relocs): Increment PLT reference
count only in the code section.  Allocate dynamic pointer
relocation against STT_GNU_IFUNC symbol in the non-code section.
(elf_i386_adjust_dynamic_symbol): Increment PLT reference count
only for PC-relative references.
(elf_i386_allocate_dynrelocs): Pass TRUE to
_bfd_elf_allocate_ifunc_dyn_relocs.
(elf_i386_relocate_section): Allow R_386_GOT32/R_386_GOT32X
relocations against STT_GNU_IFUNC symbols without PLT.  Generate
dynamic pointer relocation against STT_GNU_IFUNC symbol in
the non-code section and store it in the proper REL section.
Don't allow non-pointer relocation against STT_GNU_IFUNC symbol
without PLT.
(elf_i386_finish_dynamic_symbol): Generate dynamic
R_386_IRELATIVE and R_386_GLOB_DAT GOT relocations against
STT_GNU_IFUNC symbols without PLT.
(elf_i386_finish_dynamic_sections): Don't handle local
STT_GNU_IFUNC symbols here.
(elf_i386_output_arch_local_syms): Handle local STT_GNU_IFUNC
symbols here.
(elf_backend_output_arch_local_syms): New.
* elf32-x86-64.c (elf_i386_check_relocs): Increment PLT reference
count only in the code section.  Allocate dynamic pointer
relocation against STT_GNU_IFUNC symbol in the non-code section.
(elf_x86_64_adjust_dynamic_symbol): Increment PLT reference
count only for PC-relative references.
(elf_x86_64_allocate_dynrelocs): Pass TRUE to
_bfd_elf_allocate_ifunc_dyn_relocs.
(elf_x86_64_relocate_section): Allow R_X86_64_GOTPCREL,
R_X86_64_GOTPCRELX, R_X86_64_REX_GOTPCRELX and
R_X86_64_GOTPCREL64 relocations against STT_GNU_IFUNC symbols
without PLT.  Generate dynamic pointer relocation against
STT_GNU_IFUNC symbol in the non-code section and store it in
the proper RELA section.  Don't allow non-pointer relocation
against STT_GNU_IFUNC symbol without PLT.
(elf_x86_64_finish_dynamic_symbol): Generate dynamic
R_X86_64_IRELATIVE and R_X86_64_GLOB_DAT GOT relocations against
STT_GNU_IFUNC symbols without PLT.
(elf_x86_64_finish_dynamic_sections): Don't handle local
STT_GNU_IFUNC symbols here.
(elf_x86_64_output_arch_local_syms): Handle local STT_GNU_IFUNC
symbols here.
(elf_backend_output_arch_local_syms): New.
* elfnn-aarch64.c (elfNN_aarch64_allocate_ifunc_dynrelocs):
Pass FALSE to _bfd_elf_allocate_ifunc_dyn_relocs.

ld/

PR ld/20253
* testsuite/ld-i386/i386.exp: Run PR ld/20253 tests.
* testsuite/ld-i386/no-plt.exp: Likewise.
* testsuite/ld-x86-64/no-plt.exp: Likewise.
* testsuite/ld-i386/pr13302.d: Remove .rel.plt section.
* testsuite/ld-ifunc/ifunc-13-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-13-x86-64.d: Likewise.
* testsuite/ld-ifunc/ifunc-15-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-15-x86-64.d: Likewise.
* testsuite/ld-x86-64/pr13082-5a.d: Likewise.
* testsuite/ld-x86-64/pr13082-5b.d: Likewise.
* testsuite/ld-x86-64/pr13082-6a.d: Likewise.
* testsuite/ld-x86-64/pr13082-6b.d: Likewise.
* testsuite/ld-i386/pr20244-2a.d: Remove .plt section.
* testsuite/ld-ifunc/ifunc-21-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-21-x86-64.d: Likewise.
* testsuite/ld-ifunc/ifunc-22-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-22-x86-64.d: Likewise.
* testsuite/ld-i386/pr20244-2b.d: Updated.
* testsuite/ld-i386/pr20244-2c.d: Likewise.
* testsuite/ld-ifunc/ifunc-18a-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-18a-x86-64.d: Likewise.
* testsuite/ld-ifunc/ifunc-18b-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-18b-x86-64.d: Likewise.
* testsuite/ld-i386/pr20253-1a.c: New file.
* testsuite/ld-i386/pr20253-1b.S: Likewise.
* testsuite/ld-i386/pr20253-1c.S: Likewise.
* testsuite/ld-i386/pr20253-1d.S: Likewise.
* testsuite/ld-i386/pr20253-2a.c: Likewise.
* testsuite/ld-i386/pr20253-2b.S: Likewise.
* testsuite/ld-i386/pr20253-2c.S: Likewise.
* testsuite/ld-i386/pr20253-2d.S: Likewise.
* testsuite/ld-i386/pr20253-3.d: Likewise.
* testsuite/ld-i386/pr20253-3.s: Likewise.
* testsuite/ld-i386/pr20253-4.s: Likewise.
* testsuite/ld-i386/pr20253-4a.d: Likewise.
* testsuite/ld-i386/pr20253-4b.d: Likewise.
* testsuite/ld-i386/pr20253-4c.d: Likewise.
* testsuite/ld-i386/pr20253-5.d: Likewise.
* testsuite/ld-i386/pr20253-5.s: Likewise.
* testsuite/ld-ifunc/ifunc-23-x86.s: Likewise.
* testsuite/ld-ifunc/ifunc-23a-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-23b-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-23c-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-24-x86.s: Likewise.
* testsuite/ld-ifunc/ifunc-24a-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-24b-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-24c-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-25-x86.s: Likewise.
* testsuite/ld-ifunc/ifunc-25a-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-25b-x86.d: Likewise.
* testsuite/ld-ifunc/ifunc-25c-x86.d: Likewise.
* testsuite/ld-x86-64/pr20253-1.s: Likewise.
* testsuite/ld-x86-64/pr20253-1a.d: Likewise.
* testsuite/ld-x86-64/pr20253-1b.d: Likewise.
* testsuite/ld-x86-64/pr20253-1c.d: Likewise.
* testsuite/ld-x86-64/pr20253-1d.d: Likewise.
* testsuite/ld-x86-64/pr20253-1e.d: Likewise.
* testsuite/ld-x86-64/pr20253-1f.d: Likewise.
* testsuite/ld-x86-64/pr20253-1g.d: Likewise.
* testsuite/ld-x86-64/pr20253-1h.d: Likewise.
* testsuite/ld-x86-64/pr20253-1i.d: Likewise.
* testsuite/ld-x86-64/pr20253-1j.d: Likewise.
* testsuite/ld-x86-64/pr20253-1k.d: Likewise.
* testsuite/ld-x86-64/pr20253-1l.d: Likewise.
* testsuite/ld-x86-64/pr20253-2a.c: Likewise.
* testsuite/ld-x86-64/pr20253-2b.S: Likewise.
* testsuite/ld-x86-64/pr20253-2c.S: Likewise.
* testsuite/ld-x86-64/pr20253-2d.S: Likewise.
* testsuite/ld-x86-64/pr20253-3.d: Likewise.
* testsuite/ld-x86-64/pr20253-3.s: Likewise.
* testsuite/ld-x86-64/pr20253-4.s: Likewise.
* testsuite/ld-x86-64/pr20253-4a.d: Likewise.
* testsuite/ld-x86-64/pr20253-4b.d: Likewise.
* testsuite/ld-x86-64/pr20253-4c.d: Likewise.
* testsuite/ld-x86-64/pr20253-4d.d: Likewise.
* testsuite/ld-x86-64/pr20253-4e.d: Likewise.
* testsuite/ld-x86-64/pr20253-4f.d: Likewise.
* testsuite/ld-x86-64/pr20253-5.s: Likewise.
* testsuite/ld-x86-64/pr20253-5a.d: Likewise.
* testsuite/ld-x86-64/pr20253-5b.d: Likewise.
* testsuite/ld-ifunc/ifunc-18a-i386.d: Remove extra IRELATIVE
relocation.
* testsuite/ld-ifunc/ifunc-18a-x86-64.d: Likewise.
* testsuite/ld-ifunc/ifunc-18b-i386.d: Likewise.
* testsuite/ld-ifunc/ifunc-18b-x86-64.d: Likewise.
* testsuite/ld-ifunc/ifunc-18a.s: Fix a typo.
* testsuite/ld-x86-64/x86-64.exp: Run pr20253-1 tests.
89 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf-ifunc.c
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfnn-aarch64.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/no-plt.exp
ld/testsuite/ld-i386/pr13302.d
ld/testsuite/ld-i386/pr20244-2a.d
ld/testsuite/ld-i386/pr20244-2b.d
ld/testsuite/ld-i386/pr20244-2c.d
ld/testsuite/ld-i386/pr20253-1a.c [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-1b.S [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-1c.S [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-1d.S [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-2a.c [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-2b.S [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-2c.S [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-2d.S [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-3.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-3.s [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-4.s [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-4a.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-4b.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-4c.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-5.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20253-5.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-13-i386.d
ld/testsuite/ld-ifunc/ifunc-13-x86-64.d
ld/testsuite/ld-ifunc/ifunc-15-i386.d
ld/testsuite/ld-ifunc/ifunc-15-x86-64.d
ld/testsuite/ld-ifunc/ifunc-18a-i386.d
ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d
ld/testsuite/ld-ifunc/ifunc-18a.s
ld/testsuite/ld-ifunc/ifunc-18b-i386.d
ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d
ld/testsuite/ld-ifunc/ifunc-21-i386.d
ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
ld/testsuite/ld-ifunc/ifunc-22-i386.d
ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
ld/testsuite/ld-ifunc/ifunc-23-x86.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-23a-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-23b-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-23c-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-24-x86.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-24a-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-24b-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-24c-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-25-x86.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-25a-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-25b-x86.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-25c-x86.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/no-plt.exp
ld/testsuite/ld-x86-64/pr13082-5a.d
ld/testsuite/ld-x86-64/pr13082-5b.d
ld/testsuite/ld-x86-64/pr13082-6a.d
ld/testsuite/ld-x86-64/pr13082-6b.d
ld/testsuite/ld-x86-64/pr20253-1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1c.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1d.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1e.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1f.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1g.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1h.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1i.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1j.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1k.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-1l.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-2a.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-2b.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-2c.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-2d.S [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-3.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4c.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4d.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4e.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-4f.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-5.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-5a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20253-5b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp