Skip to content
  • Alan Modra's avatar
    PowerPC PLT16 relocations · 08be3224
    Alan Modra authored
    The PowerPC64 ELFv2 ABI and the PowerPC SysV ABI support a number of
    relocations that can be used to create and access a PLT entry.
    However, the relocs are not well defined.  The PLT16 family of relocs
    talk about "the section offset or address of the procedure linkage
    table entry".  It's plain that we do need a relative address when PIC
    as otherwise we'd have dynamic text relocations, but "section offset"
    doesn't specify which section.  The most obvious one, ".plt", isn't
    that useful because there is no readily available way of addressing
    the start of the ".plt" section.  Much more useful would be "the
    GOT/TOC-pointer relative offset of the procedure linkage table entry",
    and I suppose you could argue that is a "section offset" of sorts.
    For PowerPC64 it is better to use the same TOC-pointer relative
    addressing even when non-PIC, since ".plt" may be located outside the
    range of a 32-bit address.  However, for ppc32 we do want an absolute
    address when non-PIC as a GOT pointer may not be set up.  Also, for
    ppc32 PIC we have a similar situation to R_PPC_PLTREL24 in that the
    GOT pointer is set to a location in the .got2 section and we need to
    specify the .got2 offset in the PLT16 reloc addend.
    
    This patch supports PLT16 relocations using these semantics.  This is
    not an ABI change for ppc32 since the relocations were not previously
    supported by GNU ld, but is for ppc64 where some of the PLT16 relocs
    were supported.  I'm not particularly concerned since the old ppc64
    PLT16 reloc semantics made them almost completely useless.
    
    bfd/
    	* elf32-ppc.c (ppc_elf_check_relocs): Handle PLT16 relocs.
    	(ppc_elf_relocate_section): Likewise.
    	* elf64-ppc.c (ppc64_elf_check_relocs): Handle PLT16_LO_DS.
    	(ppc64_elf_relocate_section): Likewise.  Correct PLT16
    	resolution to plt entry relative to toc pointer.
    gold/
    	* powerpc.cc (Target_powerpc::plt_off): New functions.
    	(is_plt16_reloc): New function.
    	(Stub_table::plt_off): Use Target_powerpc::plt_off.
    	(Stub_table::plt_call_size): Use plt_off.
    	(Stub_table::do_write): Likewise.
    	(Target_powerpc::Scan::get_reference_flags): Return RELATIVE_REF
    	for PLT16 relocations.
    	(Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Return true
    	for PLT16 relocations.
    	(Target_powerpc::Scan::global): Make a PLT entry for PLT16 relocations.
    	(Target_powerpc::Relocate::relocate): Support PLT16 relocations.
    	(Powerpc_scan_relocatable_reloc::global_strategy): Return RELOC_SPECIAL
    	for ppc32 plt16 relocs.
    08be3224
To find the state of this project's repository at the time of any of these versions, check out the tags.