PowerPC64 GOT reloc optimisation
Alan Modra
amodra@gmail.com
Thu Apr 16 06:14:07 GMT 2020
More information about the Binutils mailing list
Thu Apr 16 06:14:07 GMT 2020
- Previous message (by thread): [PATCH 1/2] i386: Generate lfence with load/indirect branch/ret [CVE-2020-0551]
- Next message (by thread): PowerPC64 GOT reloc reserving PLT entry for ifunc
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
When the symbol referenced by a GOT reloc is an ifunc, we can't optimise away the GOT indirection. Well, we can, but only if a global entry stub is created with the ifunc symbol redefined to the stub. But that results in slower code and an indirection via the PLT so there isn't much to like about that solution. * elf64-ppc.c (ppc64_elf_edit_toc): Exclude ifunc from GOT optimisation. (ppc64_elf_relocate_section): Likewise. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 945f83c7e6..25a3e468a7 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -9371,6 +9371,9 @@ ppc64_elf_edit_toc (struct bfd_link_info *info) || discarded_section (sym_sec)) continue; + if ((h ? h->type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC) + continue; + if (!SYMBOL_REFERENCES_LOCAL (info, h)) continue; @@ -15886,6 +15889,8 @@ ppc64_elf_relocate_section (bfd *output_bfd, break; case R_PPC64_GOT16_DS: + if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC) + break; from = TOCstart + htab->sec_info[input_section->id].toc_off; if (relocation + addend - from + 0x8000 < 0x10000 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)) @@ -15903,6 +15908,8 @@ ppc64_elf_relocate_section (bfd *output_bfd, case R_PPC64_GOT16_LO_DS: case R_PPC64_GOT16_HA: + if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC) + break; from = TOCstart + htab->sec_info[input_section->id].toc_off; if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL && SYMBOL_REFERENCES_LOCAL (info, &h->elf)) @@ -15924,6 +15931,8 @@ ppc64_elf_relocate_section (bfd *output_bfd, break; case R_PPC64_GOT_PCREL34: + if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC) + break; from = (rel->r_offset + input_section->output_section->vma + input_section->output_offset); -- Alan Modra Australia Development Lab, IBM
- Previous message (by thread): [PATCH 1/2] i386: Generate lfence with load/indirect branch/ret [CVE-2020-0551]
- Next message (by thread): PowerPC64 GOT reloc reserving PLT entry for ifunc
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list