mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
233cc9c13a
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. |
||
---|---|---|
.. | ||
binutils.exp | ||
dummy.c | ||
ifunc-1-local-x86.d | ||
ifunc-1-local-x86.s | ||
ifunc-1-x86.d | ||
ifunc-1-x86.s | ||
ifunc-2-i386.d | ||
ifunc-2-i386.s | ||
ifunc-2-local-i386.d | ||
ifunc-2-local-i386.s | ||
ifunc-2-local-x86-64.d | ||
ifunc-2-local-x86-64.s | ||
ifunc-2-x86-64.d | ||
ifunc-2-x86-64.s | ||
ifunc-3-x86.s | ||
ifunc-3a-x86.d | ||
ifunc-3b-x86.d | ||
ifunc-4-local-x86.d | ||
ifunc-4-local-x86.s | ||
ifunc-4-x86.d | ||
ifunc-4-x86.s | ||
ifunc-4a-x86.d | ||
ifunc-5-i386.s | ||
ifunc-5-local-i386.s | ||
ifunc-5-local-x86-64.s | ||
ifunc-5-x86-64.s | ||
ifunc-5a-i386.d | ||
ifunc-5a-local-i386.d | ||
ifunc-5a-local-x86-64.d | ||
ifunc-5a-x86-64.d | ||
ifunc-5b-i386.d | ||
ifunc-5b-local-i386.d | ||
ifunc-5b-local-x86-64.d | ||
ifunc-5b-x86-64.d | ||
ifunc-5r-local-i386.d | ||
ifunc-5r-local-x86-64.d | ||
ifunc-6-i386.s | ||
ifunc-6-x86-64.s | ||
ifunc-6a-i386.d | ||
ifunc-6a-x86-64.d | ||
ifunc-6b-i386.d | ||
ifunc-6b-x86-64.d | ||
ifunc-7-i386.s | ||
ifunc-7-x86-64.s | ||
ifunc-7a-i386.d | ||
ifunc-7a-x86-64.d | ||
ifunc-7b-i386.d | ||
ifunc-7b-x86-64.d | ||
ifunc-8-i386.d | ||
ifunc-8-x86-64.d | ||
ifunc-8a-i386.s | ||
ifunc-8a-x86-64.s | ||
ifunc-8b-i386.s | ||
ifunc-8b-x86-64.s | ||
ifunc-9-x86.d | ||
ifunc-9-x86.s | ||
ifunc-10-i386.d | ||
ifunc-10-i386.s | ||
ifunc-10-x86-64.d | ||
ifunc-10-x86-64.s | ||
ifunc-11-i386.d | ||
ifunc-11-i386.s | ||
ifunc-11-x86-64.d | ||
ifunc-11-x86-64.s | ||
ifunc-12-i386.d | ||
ifunc-12-i386.s | ||
ifunc-12-x86-64.d | ||
ifunc-12-x86-64.s | ||
ifunc-13-i386.d | ||
ifunc-13-x86-64.d | ||
ifunc-13a-i386.s | ||
ifunc-13a-x86-64.s | ||
ifunc-13b-i386.s | ||
ifunc-13b-x86-64.s | ||
ifunc-14a-i386.d | ||
ifunc-14a-x86-64.d | ||
ifunc-14a.s | ||
ifunc-14b-i386.d | ||
ifunc-14b-x86-64.d | ||
ifunc-14b.s | ||
ifunc-14c-i386.d | ||
ifunc-14c-x86-64.d | ||
ifunc-14c.s | ||
ifunc-14d-i386.d | ||
ifunc-14d-x86-64.d | ||
ifunc-14e-i386.d | ||
ifunc-14e-x86-64.d | ||
ifunc-14f-i386.d | ||
ifunc-14f-x86-64.d | ||
ifunc-15-i386.d | ||
ifunc-15-i386.s | ||
ifunc-15-x86-64.d | ||
ifunc-15-x86-64.s | ||
ifunc-16-i386.d | ||
ifunc-16-x86-64.d | ||
ifunc-16-x86.s | ||
ifunc-17a-i386.d | ||
ifunc-17a-x86-64.d | ||
ifunc-17a.s | ||
ifunc-17b-i386.d | ||
ifunc-17b-x86-64.d | ||
ifunc-17b.s | ||
ifunc-18a-i386.d | ||
ifunc-18a-x86-64.d | ||
ifunc-18a.s | ||
ifunc-18b-i386.d | ||
ifunc-18b-x86-64.d | ||
ifunc-18b.s | ||
ifunc-19a-i386.d | ||
ifunc-19a-x86-64.d | ||
ifunc-19a.s | ||
ifunc-19b-i386.d | ||
ifunc-19b-x86-64.d | ||
ifunc-19b.s | ||
ifunc-20-i386.d | ||
ifunc-20-x86-64.d | ||
ifunc-20.s | ||
ifunc-21-i386.d | ||
ifunc-21-i386.s | ||
ifunc-21-x86-64.d | ||
ifunc-21-x86-64.s | ||
ifunc-22-i386.d | ||
ifunc-22-i386.s | ||
ifunc-22-x86-64.d | ||
ifunc-22-x86-64.s | ||
ifunc-23-x86.s | ||
ifunc-23a-x86.d | ||
ifunc-23b-x86.d | ||
ifunc-23c-x86.d | ||
ifunc-24-x86.s | ||
ifunc-24a-x86.d | ||
ifunc-24b-x86.d | ||
ifunc-24c-x86.d | ||
ifunc-25-x86.s | ||
ifunc-25a-x86.d | ||
ifunc-25b-x86.d | ||
ifunc-25c-x86.d | ||
ifunc-common-1.out | ||
ifunc-common-1a.c | ||
ifunc-common-1b.c | ||
ifunc-lib.c | ||
ifunc-main.c | ||
ifunc-main.out | ||
ifunc.exp | ||
lib.c | ||
pass.out | ||
pr16467.out | ||
pr16467a.c | ||
pr16467a.map | ||
pr16467b.c | ||
pr16467b.map | ||
pr16467c.c | ||
pr17154-i386.d | ||
pr17154-x86-64.d | ||
pr17154-x86.s | ||
pr18808.out | ||
pr18808a.c | ||
pr18808b.c | ||
pr18841.out | ||
pr18841a.c | ||
pr18841b.c | ||
pr18841c.c | ||
pr19784a.c | ||
pr19784b.c | ||
pr19784c.c | ||
prog.c | ||
test-1.c | ||
test-2.c |