diff options
author | Richard Earnshaw <richard.earnshaw@arm.com> | 2012-09-12 16:25:51 +0000 |
---|---|---|
committer | Richard Earnshaw <richard.earnshaw@arm.com> | 2012-09-12 16:25:51 +0000 |
commit | f41aef5f6e10edcded9a747dc2bdc9832b940dc7 (patch) | |
tree | 0bf2b26ce0a0a473aa97b09e7a195ce29ab6d155 /bfd/elf64-aarch64.c | |
parent | a67fa328adaa260bc9293d4ea9058e12e2176cbc (diff) | |
download | fsf-binutils-gdb-f41aef5f6e10edcded9a747dc2bdc9832b940dc7.zip fsf-binutils-gdb-f41aef5f6e10edcded9a747dc2bdc9832b940dc7.tar.gz fsf-binutils-gdb-f41aef5f6e10edcded9a747dc2bdc9832b940dc7.tar.bz2 |
2012-09-11 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
bfd/
* bfd-in2.h: Regenerated.
* elf64-aarch64.c
(elf64_aarch64_howto_table): Add R_AARCH64_GOT_LD_PREL19 reloc to HOWTO.
(elf64_aarch64_reloc_map): Add reloc entry.
(aarch64_resolve_relocation): Likewise.
(bfd_elf_aarch64_put_addend): Likewise.
(aarch64_reloc_got_type): Likewise.
(elf64_aarch64_final_link_relocate): Likewise.
(lf64_aarch64_check_relocs): Likewise.
(elf64_aarch64_check_relocs): New case for R_AARCH64_ADR_PREL_LO21
reloc.
* libbfd.h: Regenerated.
* reloc.c (R_AARCH64_GOT_LD_PREL19): New reloc.
gas/
* config/tc-aarch64.c
(reloc_table): Add reloc to table entry.
(parse_address_main): Add support for #:<reloc_op>:<symbol>.
(parse_operands): Check for unused reloc.
(md_apply_fix): New case for reloc.
(aarch64_force_relocation): Likewise.
gas/testsuite
* gas/aarch64/reloc-insn.d
(BFD_RELOC_AARCH64_GOT_LD_PREL19): Add expected asm for new reloc test.
* gas/aarch64/reloc-insn.s
(BFD_RELOC_AARCH64_GOT_LD_PREL19): Add test for reloc.
include/
* elf/aarch64.h (R_AARCH64_GOT_LD_PREL19): New reloc.
ld/testsuite
* ld-aarch64/aarch64-elf.exp: New reloc tests.
* ld-aarch64/emit-relocs-309-low-bad.d: New file. Expected asm for test
failure (lower bound overflow).
* ld-aarch64/emit-relocs-309-low.d: New file. Expected asm for test
success (lower bound).
* ld-aarch64/emit-relocs-309-up-bad.d: New file. Expected asm for test
failure (upper bound overflow).
* ld-aarch64/emit-relocs-309-up.d: New file. Expected asm for test
success (upper bound).
* ld-aarch64/emit-relocs-309.s: New file. Asm for new reloc tests.
Diffstat (limited to 'bfd/elf64-aarch64.c')
-rw-r--r-- | bfd/elf64-aarch64.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/bfd/elf64-aarch64.c b/bfd/elf64-aarch64.c index 648ca7f..0607b3a 100644 --- a/bfd/elf64-aarch64.c +++ b/bfd/elf64-aarch64.c @@ -908,7 +908,23 @@ static reloc_howto_type elf64_aarch64_howto_table[] = EMPTY_HOWTO (306), EMPTY_HOWTO (307), EMPTY_HOWTO (308), - EMPTY_HOWTO (309), + + /* Set a load-literal immediate field to bits + 0x1FFFFC of G(S)-P */ + HOWTO (R_AARCH64_GOT_LD_PREL19, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte,1 = short,2 = long) */ + 19, /* bitsize */ + TRUE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_AARCH64_GOT_LD_PREL19", /* name */ + FALSE, /* partial_inplace */ + 0xffffe0, /* src_mask */ + 0xffffe0, /* dst_mask */ + TRUE), /* pcrel_offset */ + EMPTY_HOWTO (310), /* Get to the page for the GOT entry for the symbol @@ -1427,6 +1443,7 @@ static const struct elf64_aarch64_reloc_map elf64_aarch64_reloc_map[] = {BFD_RELOC_AARCH64_CALL26, R_AARCH64_CALL26}, /* Relocations for PIC. */ + {BFD_RELOC_AARCH64_GOT_LD_PREL19, R_AARCH64_GOT_LD_PREL19}, {BFD_RELOC_AARCH64_ADR_GOT_PAGE, R_AARCH64_ADR_GOT_PAGE}, {BFD_RELOC_AARCH64_LD64_GOT_LO12_NC, R_AARCH64_LD64_GOT_LO12_NC}, @@ -2143,6 +2160,10 @@ aarch64_resolve_relocation (unsigned int r_type, bfd_vma place, bfd_vma value, value = PG (value + addend) - PG (place); break; + case R_AARCH64_GOT_LD_PREL19: + value = value + addend - place; + break; + case R_AARCH64_ADR_GOT_PAGE: case R_AARCH64_TLSDESC_ADR_PAGE: case R_AARCH64_TLSGD_ADR_PAGE21: @@ -3362,6 +3383,7 @@ bfd_elf_aarch64_put_addend (bfd *abfd, break; case R_AARCH64_LD_PREL_LO19: + case R_AARCH64_GOT_LD_PREL19: if (old_addend & ((1 << howto->rightshift) - 1)) return bfd_reloc_overflow; contents = reencode_ld_lit_ofs_19 (contents, addend); @@ -3570,6 +3592,7 @@ aarch64_reloc_got_type (unsigned int r_type) { case R_AARCH64_LD64_GOT_LO12_NC: case R_AARCH64_ADR_GOT_PAGE: + case R_AARCH64_GOT_LD_PREL19: return GOT_NORMAL; case R_AARCH64_TLSGD_ADR_PAGE21: @@ -3992,6 +4015,7 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto, case R_AARCH64_LD64_GOT_LO12_NC: case R_AARCH64_ADR_GOT_PAGE: + case R_AARCH64_GOT_LD_PREL19: if (globals->root.sgot == NULL) BFD_ASSERT (h != NULL); @@ -5116,6 +5140,7 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, /* RR: We probably want to keep a consistency check that there are no dangling GOT_PAGE relocs. */ case R_AARCH64_LD64_GOT_LO12_NC: + case R_AARCH64_GOT_LD_PREL19: case R_AARCH64_ADR_GOT_PAGE: case R_AARCH64_TLSGD_ADR_PAGE21: case R_AARCH64_TLSGD_ADD_LO12_NC: @@ -5201,6 +5226,7 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_AARCH64_ADR_PREL_PG_HI21_NC: case R_AARCH64_ADR_PREL_PG_HI21: + case R_AARCH64_ADR_PREL_LO21: if (h != NULL && info->executable) { /* If this reloc is in a read-only section, we might |