[GOLD] PowerPC64 huge branch dynamic relocs
authorAlan Modra <amodra@gmail.com>
Fri, 23 Jun 2023 01:07:53 +0000 (10:37 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 23 Jun 2023 11:32:48 +0000 (21:02 +0930)
commit5a97377e55134b585a4f92569e9b6bf958af8daf
tree24d5910a07f7fcd9a301b7207d85597ce10f50ab
parentbdad2ad579f7e7a6307f61e67ef70315506a26f6
[GOLD] PowerPC64 huge branch dynamic relocs

PowerPC64 gold and ld.bfd implement an indirect branch trampoline,
used when the destination of a branch exceeds a bounce through another
"b" instruction.  When generating PIEs or shared libraries, the
addresses need dynamic relocations.  This was implemented in gold
using a dedicated relocation section, but this means the relative
relocations for these addresses are not sorted properly with other
dynamic relative relocations: gold doesn't support merging relocation
sections, then sorting.  Instead we need to use a single .rela.dyn
section.

This is done by increasing the size of rela_dyn_ during do_relax to
account for needed dynamic relocations, delaying adding the actual
relocations until the end of relaxation once the layout has
stabilised.

* powerpc.cc (Target_powerpc): Add rela_dyn_size_;
(update_current_size): New function.
(Target_powerpc::do_relax): Capture the size of rela_dyn_ at
the start of relaxation.  Artifically increase its size during
relaxation to account for needed indirect branches, and add
those relocations at the end.
(Output_data_brlt_powerpc::rel_, reset_brlt_sizes),
(finalize_brlt_sizes, add_reloc, set_current_size): Delete.
(Target_powerpc::make_brlt_section): Don't make reloc section.
gold/powerpc.cc