Move x86_64 PE changes out of bfd_perform_relocation
authorAlan Modra <amodra@gmail.com>
Thu, 4 Mar 2021 12:28:54 +0000 (22:58 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 5 Mar 2021 04:27:42 +0000 (14:57 +1030)
commitb01b5d9a0b16fd81cc5535ba70c3ed267d9d7ac0
treecd3d250769b4e3e0341c9d6a71b0a0a6aa7c4022
parent7a39bd53dcc1753d69d3c1216883e59dce366176
Move x86_64 PE changes out of bfd_perform_relocation

bfd_perform_relocation should not have special case target code.  This
patch moves the code that was there for x86_64 PE linking to ELF
output into the x86_64 PE howto special function, correcting that
function for linking to targets other than ELF too.  The fixes in
bfd_perform_relocation were over-complicated due to needing to
compensate for things that had already gone wrong in coff_amd64_reloc.
In particular, an adjustment for pc-relative relocs was done in a way
that meant adjustment for things related to symbol offsets was lost.
I think those two things are orthogonal, but who knows with COFF where
addends and symbol values are found randomly in the section contents.

Note that linking natively to an x86_64 PE output relocates by
coff_pe_amd64_relocate_section, which does not use arelent relocs or
bfd_perform_relocation, but be aware of coff_amd64_rtype_to_howto
hacking addends for relocations.  The adjustments for a particular
relocation type there and in coff_amd64_reloc ought to match after
taking into consideration CALC_ADDEND.  They don't.  For example,
the pc-relative adjustment for R_PCRWORD is 2 bytes in
coff_amd64_reloc and 4 bytes in coff_amd64_rtype_to_howto.

* reloc.c (bfd_perform_relocation): Revert 2021-01-12 and
2020-09-16 changes.
* coff-x86_64.c (coff_amd64_reloc): Do more or less the same
adjustments here instead.  Separate pc-relative adjustments
from symbol related adjustments.  Tidy comments and formatting.
bfd/ChangeLog
bfd/coff-x86_64.c
bfd/reloc.c