diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-09-16 07:11:16 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-09-16 07:11:31 -0700 |
commit | 36068e2fa5460e6cfa1f5f359df6f37c497aab50 (patch) | |
tree | 9852e7ae898e51e89bb77fbab30606d76c6acf74 /bfd/reloc.c | |
parent | 337882d477675296a22fd8c1f7412ca30c70d9b0 (diff) | |
download | gdb-36068e2fa5460e6cfa1f5f359df6f37c497aab50.zip gdb-36068e2fa5460e6cfa1f5f359df6f37c497aab50.tar.gz gdb-36068e2fa5460e6cfa1f5f359df6f37c497aab50.tar.bz2 |
elf/x86-64: Adjust relocation for PE/x86-64 inputs
PE linker calls _bfd_relocate_contents to resolve relocation, instead of
bfd_perform_relocation. But ELF linker calls bfd_perform_relocation, not
_bfd_relocate_contents. When linking PE/x86-64 inputs to generate ELF
output, we need to adjust PE/x86-64 relocations in bfd_perform_relocation.
Enable PE/x86-64 in bfd together with PEI/x86-64. Update run_ld_link_tests
to handle bzip2 binary inputs.
bfd/
PR ld/26583
* config.bfd (targ64_selvecs, targ_selvecs): Add x86_64_pe_vec
to x86_64_pei_vec.
* reloc.c: Include "coff/internal.h".
(bfd_perform_relocation): Adjust relocation for PE/x86-64 inputs.
ld/
PR ld/26583
* testsuite/ld-x86-64/pe-x86-64-1.od: New file.
* testsuite/ld-x86-64/pe-x86-64-1a.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-1b.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-1c.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-2.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-2a.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-2b.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-2c.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-3.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-3a.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-3b.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-3c.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-3d.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-4.od: Likewise.
* testsuite/ld-x86-64/pe-x86-64-4a.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-4b.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-4c.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64-4d.obj.bz2: Likewise.
* testsuite/ld-x86-64/pe-x86-64.exp: Likewise.
* testsuite/lib/ld-lib.exp (run_ld_link_tests): Handle bz2 binary
inputs.
Diffstat (limited to 'bfd/reloc.c')
-rw-r--r-- | bfd/reloc.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/bfd/reloc.c b/bfd/reloc.c index dc923fe..9639ad2 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -51,6 +51,7 @@ SECTION #include "bfdlink.h" #include "libbfd.h" #include "bfdver.h" +#include "coff/internal.h" /* DOCDD INODE @@ -904,6 +905,23 @@ space consuming. For each target: } } } + else if (abfd->xvec->flavour == bfd_target_coff_flavour + && (input_section->output_section->owner->xvec->flavour + == bfd_target_elf_flavour) + && strcmp (abfd->xvec->name, "pe-x86-64") == 0 + && strcmp (input_section->output_section->owner->xvec->name, + "elf64-x86-64") == 0) + { + /* NB: bfd_perform_relocation isn't called to generate PE binary. + _bfd_relocate_contents is called instead. When linking PE + object files to generate ELF output, _bfd_relocate_contents + isn't called and bfd_perform_relocation is used. We need to + adjust relocation here. */ + relocation -= reloc_entry->addend; + if (howto->type >= R_AMD64_PCRLONG_1 + && howto->type <= R_AMD64_PCRLONG_5) + relocation -= (bfd_vma)(howto->type - R_AMD64_PCRLONG); + } /* FIXME: This overflow checking is incomplete, because the value might have overflowed before we get here. For a correct check we |