PowerPC64 DT_RELR
authorAlan Modra <amodra@gmail.com>
Thu, 6 Jan 2022 21:19:16 +0000 (07:49 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 18 Jan 2022 00:48:45 +0000 (11:18 +1030)
commit1657026ccd8aa05a97cb35f1d9bff646937a244e
treeb21238f5d3e2c272a9d6a27642d7047a99b29a92
parent97da0e2677c4a38df2406576428ec27d1da26e7c
PowerPC64 DT_RELR

PowerPC64 takes a more traditional approach to DT_RELR than x86.  Count
relative relocs in check_relocs, allocate space for them and output in
the usual places but not doing so when enable_dt_relr.  DT_RELR is
sized in the existing ppc stub relaxation machinery, run via the
linker's ldemul_after_allocation hook.  DT_RELR is output in the same
function that writes ppc stubs, run via ldemul_finish.

This support should be considered experimental.

bfd/
* elf64-ppc.c (struct ppc_local_dyn_relocs): Renamed from
ppc_dyn_relocs.  Add rel_count field.  Update uses.
(struct ppc_dyn_relocs): New.  Replace all uses of elf_dyn_relocs.
(struct ppc_link_hash_table): Add relr_alloc, relr_count and
relr_addr.
(ppc64_elf_copy_indirect_symbol): Merge rel_count.
(ppc64_elf_check_relocs): Init rel_count for global and local syms.
(dec_dynrel_count): Change r_info param to reloc pointer.  Update
all callers.  Handle decrementing rel_count.
(allocate_got): Don't allocate space for relative relocs when
enable_dt_relr.
(allocate_dynrelocs): Likewise.
(ppc64_elf_size_dynamic_sections): Likewise.  Handle srelrdyn.
(ppc_build_one_stub): Don't emit relative relocs on .branch_lt.
(compare_relr_address, append_relr_off): New functions.
(got_and_plt_relr_for_local_syms, got_and_plt_relr): Likewise.
(ppc64_elf_size_stubs): Size .relr.syn.
(ppc64_elf_build_stubs): Emit .relr.dyn.
(build_global_entry_stubs_and_plt): Don't output relative relocs
when enable_dt_relr.
(write_plt_relocs_for_local_syms): Likewise.
(ppc64_elf_relocate_section): Likewise.
binutils/
* testsuite/lib/binutils-common.exp (supports_dt_relr): Add
powerpc64.
ld/
* emulparams/elf64ppc.sh: Source dt-relr.sh.
* testsuite/ld-elf/dt-relr-2b.d: Adjust for powerpc.
* testsuite/ld-elf/dt-relr-2c.d: Likewise.
* testsuite/ld-elf/dt-relr-2d.d: Likewise.
* testsuite/ld-elf/dt-relr-2e.d: Likewise.
bfd/elf64-ppc.c
binutils/testsuite/lib/binutils-common.exp
ld/emulparams/elf64ppc.sh
ld/testsuite/ld-elf/dt-relr-2b.d
ld/testsuite/ld-elf/dt-relr-2c.d
ld/testsuite/ld-elf/dt-relr-2d.d
ld/testsuite/ld-elf/dt-relr-2e.d