diff options
author | Alan Modra <amodra@gmail.com> | 2018-08-29 13:28:21 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-08-31 22:15:05 +0930 |
commit | 4a9699735b04d4629bd3dc418c265e7f0bc1f9ce (patch) | |
tree | 6f92e1b94b3aa09e8a36e65d8d83823c94278ec3 /bfd/elf64-ppc.c | |
parent | f891966ff66639673a5207b94bd68ec928fb68bc (diff) | |
download | gdb-4a9699735b04d4629bd3dc418c265e7f0bc1f9ce.zip gdb-4a9699735b04d4629bd3dc418c265e7f0bc1f9ce.tar.gz gdb-4a9699735b04d4629bd3dc418c265e7f0bc1f9ce.tar.bz2 |
PowerPC64 higher REL16 relocations
There are occasions where someone might want to build a 64-bit
pc-relative offset from 16-bit pieces. This adds the necessary REL16
relocs corresponding to existing ADDR16 relocs that can be used to
build 64-bit absolute values.
include/
* elf/ppc64.h (R_PPC64_REL16_HIGH, R_PPC64_REL16_HIGHA),
(R_PPC64_REL16_HIGHER, R_PPC64_REL16_HIGHERA),
(R_PPC64_REL16_HIGHEST, R_PPC64_REL16_HIGHESTA): Define.
(R_PPC64_LO_DS_OPT, R_PPC64_16DX_HA): Bump value.
bfd/
* reloc.c (BFD_RELOC_PPC64_REL16_HIGH, BFD_RELOC_PPC64_REL16_HIGHA),
(BFD_RELOC_PPC64_REL16_HIGHER, BFD_RELOC_PPC64_REL16_HIGHERA),
(BFD_RELOC_PPC64_REL16_HIGHEST, BFD_RELOC_PPC64_REL16_HIGHESTA):
Define.
* elf64-ppc.c (ppc64_elf_howto_raw): Add new REL16 howtos.
(ppc64_elf_reloc_type_lookup): Translate new REL16 relocs.
(ppc64_elf_check_relocs, ppc64_elf_relocate_section): Handle them.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.
gas/
* config/tc-ppc.h (TC_FORCE_RELOCATION_SUB_LOCAL): Allow ADDR16
HIGH, HIGHA, HIGHER, HIGHERA, HIGHEST, and HIGHESTA relocs.
Group 16-bit relocs.
* config/tc-ppc.c (md_apply_fix): Translate those ADDR16 relocs
to REL16 when pcrel. Sort relocs.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r-- | bfd/elf64-ppc.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index e6fe260..5826c22 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -820,6 +820,24 @@ static reloc_howto_type ppc64_elf_howto_raw[] = HOW (R_PPC64_REL16_HA, 1, 16, 0xffff, 16, TRUE, signed, ppc64_elf_ha_reloc), + HOW (R_PPC64_REL16_HIGH, 1, 16, 0xffff, 16, TRUE, dont, + bfd_elf_generic_reloc), + + HOW (R_PPC64_REL16_HIGHA, 1, 16, 0xffff, 16, TRUE, dont, + ppc64_elf_ha_reloc), + + HOW (R_PPC64_REL16_HIGHER, 1, 16, 0xffff, 32, TRUE, dont, + bfd_elf_generic_reloc), + + HOW (R_PPC64_REL16_HIGHERA, 1, 16, 0xffff, 32, TRUE, dont, + ppc64_elf_ha_reloc), + + HOW (R_PPC64_REL16_HIGHEST, 1, 16, 0xffff, 48, TRUE, dont, + bfd_elf_generic_reloc), + + HOW (R_PPC64_REL16_HIGHESTA, 1, 16, 0xffff, 48, TRUE, dont, + ppc64_elf_ha_reloc), + /* Like R_PPC64_REL16_HA but for split field in addpcis. */ HOW (R_PPC64_REL16DX_HA, 2, 16, 0x1fffc1, 16, TRUE, signed, ppc64_elf_ha_reloc), @@ -1129,6 +1147,18 @@ ppc64_elf_reloc_type_lookup (bfd *abfd, break; case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA; break; + case BFD_RELOC_PPC64_REL16_HIGH: r = R_PPC64_REL16_HIGH; + break; + case BFD_RELOC_PPC64_REL16_HIGHA: r = R_PPC64_REL16_HIGHA; + break; + case BFD_RELOC_PPC64_REL16_HIGHER: r = R_PPC64_REL16_HIGHER; + break; + case BFD_RELOC_PPC64_REL16_HIGHERA: r = R_PPC64_REL16_HIGHERA; + break; + case BFD_RELOC_PPC64_REL16_HIGHEST: r = R_PPC64_REL16_HIGHEST; + break; + case BFD_RELOC_PPC64_REL16_HIGHESTA: r = R_PPC64_REL16_HIGHESTA; + break; case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA; break; case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA; @@ -4474,6 +4504,12 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_PPC64_REL16_LO: case R_PPC64_REL16_HI: case R_PPC64_REL16_HA: + case R_PPC64_REL16_HIGH: + case R_PPC64_REL16_HIGHA: + case R_PPC64_REL16_HIGHER: + case R_PPC64_REL16_HIGHERA: + case R_PPC64_REL16_HIGHEST: + case R_PPC64_REL16_HIGHESTA: case R_PPC64_REL16DX_HA: break; @@ -14557,6 +14593,12 @@ ppc64_elf_relocate_section (bfd *output_bfd, case R_PPC64_REL16_LO: case R_PPC64_REL16_HI: case R_PPC64_REL16_HA: + case R_PPC64_REL16_HIGH: + case R_PPC64_REL16_HIGHA: + case R_PPC64_REL16_HIGHER: + case R_PPC64_REL16_HIGHERA: + case R_PPC64_REL16_HIGHEST: + case R_PPC64_REL16_HIGHESTA: case R_PPC64_REL16DX_HA: break; @@ -15038,6 +15080,9 @@ ppc64_elf_relocate_section (bfd *output_bfd, break; case R_PPC64_REL16_HA: + case R_PPC64_REL16_HIGHA: + case R_PPC64_REL16_HIGHERA: + case R_PPC64_REL16_HIGHESTA: case R_PPC64_REL16DX_HA: case R_PPC64_ADDR16_HA: case R_PPC64_ADDR16_HIGHA: |