summaryrefslogtreecommitdiff
path: root/bfd/elfnn-aarch64.c
diff options
context:
space:
mode:
authorYufeng Zhang <yufeng.zhang@arm.com>2013-06-26 10:47:05 +0000
committerYufeng Zhang <yufeng.zhang@arm.com>2013-06-26 10:47:05 +0000
commitb4fc7833db256aa9dbcff4e389bc8ac240ea7195 (patch)
treea7f52babbcc6909ae3074cee3da44779e7edcb07 /bfd/elfnn-aarch64.c
parentd66a510d9bc25d82d0a419f9e1389e78c0d773f3 (diff)
downloadbinutils-redhat-b4fc7833db256aa9dbcff4e389bc8ac240ea7195.tar.gz
[AArch64, ILP32] 3/6 Support for ELF32 relocs and refactor reloc handling
bfd/ * bfd-in2.h: Re-generated. * elfnn-aarch64.c (HOWTO64, HOWTO32): New define. (IS_AARCH64_TLS_RELOC): Change to be based on the bfd reloc enumerators. (IS_AARCH64_TLSDESC_RELOC): Likewise. (PG, PG_OFFSET): Cast literal to bfd_vma. (elf64_aarch64_howto_table): Removed. (elf64_aarch64_howto_dynrelocs): Removed. (elf64_aarch64_tls_howto_table): Removed. (elf64_aarch64_tlsdesc_howto_table): Removed. (elfNN_aarch64_howto_table): New table to host all howto entires.. (R_AARCH64_*): Replaced by AARCH64_R (*) and AARCH64_R_STR (*). (elfNN_aarch64_bfd_reloc_from_howto): New function. (elfNN_aarch64_bfd_reloc_from_type): Ditto. (struct elf_aarch64_reloc_map): New. (elf_aarch64_reloc_map): New table. (elfNN_aarch64_howto_from_bfd_reloc): New function. (elfNN_aarch64_howto_from_type): Update to look up the new table elfNN_aarch64_howto_table. (struct elf64_aarch64_reloc_map): Remove. (elf64_aarch64_reloc_map): Remove. (elfNN_aarch64_reloc_type_lookup): Change to call elfNN_aarch64_howto_from_bfd_reloc. (elfNN_aarch64_reloc_name_lookup): Change to look up the new table elfNN_aarch64_howto_table. (aarch64_resolve_relocation): Refactor to switch on the bfd reloc enumerators. (bfd_elf_aarch64_put_addend): Likewise. (elfNN_aarch64_final_link_relocate): Likewise. (aarch64_tls_transition_without_check): Likewise. (aarch64_reloc_got_type): Likewise. (aarch64_can_relax_tls): Likewise. (aarch64_tls_transition): Likewise. (elfNN_aarch64_tls_relax): Likewise. (elfNN_aarch64_final_link_relocate): Likewise. (elfNN_aarch64_relocate_section): Likewise. (elfNN_aarch64_gc_sweep_hook): Likewise. (elfNN_aarch64_check_relocs): Likewise. (aarch64_tls_transition): Change to return a bfd reloc enumerator. * libbfd.h: Re-generated. * reloc.c: Re-order the AArch64 bfd reloc enumerators. (BFD_RELOC_AARCH64_RELOC_START) (BFD_RELOC_AARCH64_RELOC_END) (BFD_RELOC_AARCH64_LD_GOT_LO12_NC) (BFD_RELOC_AARCH64_LD32_GOT_LO12_NC) (BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC) (BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC) (BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC) (BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC) (BFD_RELOC_AARCH64_IRELATIVE): New relocs. gas/ * config/tc-aarch64.c (reloc_table): Replace BFD_RELOC_AARCH64_LD64_GOT_LO12_NC with BFD_RELOC_AARCH64_LD_GOT_LO12_NC; likewise to BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC and BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC. (md_apply_fix): Handle BFD_RELOC_AARCH64_LD_GOT_LO12_NC, BFD_RELOC_AARCH64_LD32_GOT_LO12_NC, BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC, BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC, BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC and BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC. (aarch64_force_relocation): Likewise. gas/testsuite/ * gas/aarch64/ilp32-basic.d: New file. * gas/aarch64/ilp32-basic.s: New file. include/elf/ * aarch64.h: Add ELF32 reloc codes and remove fake ELF64 ones. (R_AARCH64_IRELATIVE): New reloc.
Diffstat (limited to 'bfd/elfnn-aarch64.c')
-rw-r--r--bfd/elfnn-aarch64.c1647
1 files changed, 850 insertions, 797 deletions
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 60a8558e7e..27b67859cf 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -50,7 +50,7 @@
indicate that foo is thread local and should be accessed via the
traditional TLS mechanims.
- The relocations R_AARCH64_TLSDESC_{ADR_PAGE,LD64_LO12_NC,ADD_LO12_NC}
+ The relocations R_AARCH64_TLSDESC_{ADR_PAGE21,LD64_LO12_NC,ADD_LO12_NC}
against foo indicate that 'foo' is thread local and should be accessed
via a TLS descriptor mechanism.
@@ -64,12 +64,12 @@
In the traditional TLS mechanism, the double GOT entry is used to
provide the tls_index structure, containing module and offset
- entries. The static linker places the relocation R_AARCH64_TLS_DTPMOD64
+ entries. The static linker places the relocation R_AARCH64_TLS_DTPMOD
on the module entry. The loader will subsequently fixup this
relocation with the module identity.
For global traditional TLS symbols the static linker places an
- R_AARCH64_TLS_DTPREL64 relocation on the offset entry. The loader
+ R_AARCH64_TLS_DTPREL relocation on the offset entry. The loader
will subsequently fixup the offset. For local TLS symbols the static
linker fixes up offset.
@@ -97,7 +97,7 @@
This function is invoked for each relocation.
The TLS relocations R_AARCH64_TLSGD_{ADR_PREL21,ADD_LO12_NC} and
- R_AARCH64_TLSDESC_{ADR_PAGE,LD64_LO12_NC,ADD_LO12_NC} are
+ R_AARCH64_TLSDESC_{ADR_PAGE21,LD64_LO12_NC,ADD_LO12_NC} are
spotted. One time creation of local symbol data structures are
created when the first local symbol is seen.
@@ -149,12 +149,16 @@
#if ARCH_SIZE == 64
#define AARCH64_R(NAME) R_AARCH64_ ## NAME
#define AARCH64_R_STR(NAME) "R_AARCH64_" #NAME
+#define HOWTO64(...) HOWTO (__VA_ARGS__)
+#define HOWTO32(...) EMPTY_HOWTO (0)
#define LOG_FILE_ALIGN 3
#endif
#if ARCH_SIZE == 32
#define AARCH64_R(NAME) R_AARCH64_P32_ ## NAME
#define AARCH64_R_STR(NAME) "R_AARCH64_P32_" #NAME
+#define HOWTO64(...) EMPTY_HOWTO (0)
+#define HOWTO32(...) HOWTO (__VA_ARGS__)
#define LOG_FILE_ALIGN 2
#endif
@@ -163,39 +167,41 @@ bfd_elf_aarch64_put_addend (bfd *abfd,
bfd_byte *address,
reloc_howto_type *howto, bfd_signed_vma addend);
-#define IS_AARCH64_TLS_RELOC(R_TYPE) \
- ((R_TYPE) == R_AARCH64_TLSGD_ADR_PAGE21 \
- || (R_TYPE) == R_AARCH64_TLSGD_ADD_LO12_NC \
- || (R_TYPE) == R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 \
- || (R_TYPE) == R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC \
- || (R_TYPE) == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 \
- || (R_TYPE) == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC \
- || (R_TYPE) == R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 \
- || (R_TYPE) == R_AARCH64_TLSLE_ADD_TPREL_LO12 \
- || (R_TYPE) == R_AARCH64_TLSLE_ADD_TPREL_HI12 \
- || (R_TYPE) == R_AARCH64_TLSLE_ADD_TPREL_LO12_NC \
- || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G2 \
- || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G1 \
- || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G1_NC \
- || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G0 \
- || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G0_NC \
- || (R_TYPE) == R_AARCH64_TLS_DTPMOD64 \
- || (R_TYPE) == R_AARCH64_TLS_DTPREL64 \
- || (R_TYPE) == R_AARCH64_TLS_TPREL64 \
+#define IS_AARCH64_TLS_RELOC(R_TYPE) \
+ ((R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLS_DTPMOD \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLS_DTPREL \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLS_TPREL \
|| IS_AARCH64_TLSDESC_RELOC ((R_TYPE)))
-#define IS_AARCH64_TLSDESC_RELOC(R_TYPE) \
- ((R_TYPE) == R_AARCH64_TLSDESC_LD_PREL19 \
- || (R_TYPE) == R_AARCH64_TLSDESC_ADR_PREL21 \
- || (R_TYPE) == R_AARCH64_TLSDESC_ADR_PAGE21 \
- || (R_TYPE) == R_AARCH64_TLSDESC_ADD_LO12_NC \
- || (R_TYPE) == R_AARCH64_TLSDESC_LD64_LO12_NC \
- || (R_TYPE) == R_AARCH64_TLSDESC_OFF_G1 \
- || (R_TYPE) == R_AARCH64_TLSDESC_OFF_G0_NC \
- || (R_TYPE) == R_AARCH64_TLSDESC_LDR \
- || (R_TYPE) == R_AARCH64_TLSDESC_ADD \
- || (R_TYPE) == R_AARCH64_TLSDESC_CALL \
- || (R_TYPE) == R_AARCH64_TLSDESC)
+#define IS_AARCH64_TLSDESC_RELOC(R_TYPE) \
+ ((R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G1 \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LDR \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_CALL \
+ || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC)
#define ELIMINATE_COPY_RELOCS 0
@@ -210,8 +216,8 @@ bfd_elf_aarch64_put_addend (bfd *abfd,
#define PLT_TLSDESC_ENTRY_SIZE (32)
/* Take the PAGE component of an address or offset. */
-#define PG(x) ((x) & ~ 0xfff)
-#define PG_OFFSET(x) ((x) & 0xfff)
+#define PG(x) ((x) & ~ (bfd_vma) 0xfff)
+#define PG_OFFSET(x) ((x) & (bfd_vma) 0xfff)
/* Encoding of the nop instruction */
#define INSN_NOP 0xd503201f
@@ -269,146 +275,32 @@ elfNN_aarch64_tlsdesc_small_plt_entry[PLT_TLSDESC_ENTRY_SIZE] =
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
#define ALL_ONES (~ (bfd_vma) 0)
-static reloc_howto_type elf64_aarch64_howto_none =
- HOWTO (R_AARCH64_NONE, /* type */
- 0, /* rightshift */
- 0, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_dont,/* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_NONE", /* name */
- FALSE, /* partial_inplace */
- 0, /* src_mask */
- 0, /* dst_mask */
- FALSE); /* pcrel_offset */
+/* Indexed by the bfd interal reloc enumerators.
+ Therefore, the table needs to be synced with BFD_RELOC_AARCH64_*
+ in reloc.c. */
-static reloc_howto_type elf64_aarch64_howto_dynrelocs[] =
+static reloc_howto_type elfNN_aarch64_howto_table[] =
{
- HOWTO (R_AARCH64_COPY, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_bitfield, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_COPY", /* name */
- TRUE, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
-
- HOWTO (R_AARCH64_GLOB_DAT, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_bitfield, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_GLOB_DAT", /* name */
- TRUE, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
-
- HOWTO (R_AARCH64_JUMP_SLOT, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_bitfield, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_JUMP_SLOT", /* name */
- TRUE, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
-
- HOWTO (R_AARCH64_RELATIVE, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_bitfield, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_RELATIVE", /* name */
- TRUE, /* partial_inplace */
- ALL_ONES, /* src_mask */
- ALL_ONES, /* dst_mask */
- FALSE), /* pcrel_offset */
+ EMPTY_HOWTO (0),
- HOWTO (R_AARCH64_TLS_DTPMOD64, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLS_DTPMOD64", /* name */
- FALSE, /* partial_inplace */
- 0, /* src_mask */
- ALL_ONES, /* dst_mask */
- FALSE), /* pc_reloffset */
-
- HOWTO (R_AARCH64_TLS_DTPREL64, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLS_DTPREL64", /* name */
- FALSE, /* partial_inplace */
- 0, /* src_mask */
- ALL_ONES, /* dst_mask */
- FALSE), /* pcrel_offset */
-
- HOWTO (R_AARCH64_TLS_TPREL64, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLS_TPREL64", /* name */
- FALSE, /* partial_inplace */
- 0, /* src_mask */
- ALL_ONES, /* dst_mask */
- FALSE), /* pcrel_offset */
+ /* Basic data relocations. */
- HOWTO (R_AARCH64_TLSDESC, /* type */
+#if ARCH_SIZE == 64
+ HOWTO (R_AARCH64_NULL, /* type */
0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC", /* name */
+ "R_AARCH64_NULL", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
- ALL_ONES, /* dst_mask */
+ 0, /* dst_mask */
FALSE), /* pcrel_offset */
-
-};
-
-/* Note: code such as elf64_aarch64_reloc_type_lookup expect to use e.g.
- R_AARCH64_PREL64 as an index into this, and find the R_AARCH64_PREL64 HOWTO
- in that slot. */
-
-static reloc_howto_type elf64_aarch64_howto_table[] =
-{
- /* Basic data relocations. */
-
- HOWTO (R_AARCH64_NULL, /* type */
+#else
+ HOWTO (R_AARCH64_NONE, /* type */
0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
@@ -416,14 +308,15 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_NULL", /* name */
+ "R_AARCH64_NONE", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
FALSE), /* pcrel_offset */
+#endif
/* .xword: (S+A) */
- HOWTO (R_AARCH64_ABS64, /* type */
+ HOWTO64 (AARCH64_R (ABS64), /* type */
0, /* rightshift */
4, /* size (4 = long long) */
64, /* bitsize */
@@ -431,14 +324,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ABS64", /* name */
+ AARCH64_R_STR (ABS64), /* name */
FALSE, /* partial_inplace */
ALL_ONES, /* src_mask */
ALL_ONES, /* dst_mask */
FALSE), /* pcrel_offset */
/* .word: (S+A) */
- HOWTO (R_AARCH64_ABS32, /* type */
+ HOWTO (AARCH64_R (ABS32), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
@@ -446,14 +339,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ABS32", /* name */
+ AARCH64_R_STR (ABS32), /* name */
FALSE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* .half: (S+A) */
- HOWTO (R_AARCH64_ABS16, /* type */
+ HOWTO (AARCH64_R (ABS16), /* type */
0, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -461,14 +354,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ABS16", /* name */
+ AARCH64_R_STR (ABS16), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* .xword: (S+A-P) */
- HOWTO (R_AARCH64_PREL64, /* type */
+ HOWTO64 (AARCH64_R (PREL64), /* type */
0, /* rightshift */
4, /* size (4 = long long) */
64, /* bitsize */
@@ -476,14 +369,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_PREL64", /* name */
+ AARCH64_R_STR (PREL64), /* name */
FALSE, /* partial_inplace */
ALL_ONES, /* src_mask */
ALL_ONES, /* dst_mask */
TRUE), /* pcrel_offset */
/* .word: (S+A-P) */
- HOWTO (R_AARCH64_PREL32, /* type */
+ HOWTO (AARCH64_R (PREL32), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
@@ -491,14 +384,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_PREL32", /* name */
+ AARCH64_R_STR (PREL32), /* name */
FALSE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* .half: (S+A-P) */
- HOWTO (R_AARCH64_PREL16, /* type */
+ HOWTO (AARCH64_R (PREL16), /* type */
0, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -506,7 +399,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_PREL16", /* name */
+ AARCH64_R_STR (PREL16), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
@@ -516,7 +409,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
unsigned data or abs address inline. */
/* MOVZ: ((S+A) >> 0) & 0xffff */
- HOWTO (R_AARCH64_MOVW_UABS_G0, /* type */
+ HOWTO (AARCH64_R (MOVW_UABS_G0), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -524,14 +417,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G0", /* name */
+ AARCH64_R_STR (MOVW_UABS_G0), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOVK: ((S+A) >> 0) & 0xffff [no overflow check] */
- HOWTO (R_AARCH64_MOVW_UABS_G0_NC, /* type */
+ HOWTO (AARCH64_R (MOVW_UABS_G0_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -539,14 +432,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G0_NC", /* name */
+ AARCH64_R_STR (MOVW_UABS_G0_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOVZ: ((S+A) >> 16) & 0xffff */
- HOWTO (R_AARCH64_MOVW_UABS_G1, /* type */
+ HOWTO (AARCH64_R (MOVW_UABS_G1), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -554,14 +447,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G1", /* name */
+ AARCH64_R_STR (MOVW_UABS_G1), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOVK: ((S+A) >> 16) & 0xffff [no overflow check] */
- HOWTO (R_AARCH64_MOVW_UABS_G1_NC, /* type */
+ HOWTO64 (AARCH64_R (MOVW_UABS_G1_NC), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -569,14 +462,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G1_NC", /* name */
+ AARCH64_R_STR (MOVW_UABS_G1_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOVZ: ((S+A) >> 32) & 0xffff */
- HOWTO (R_AARCH64_MOVW_UABS_G2, /* type */
+ HOWTO64 (AARCH64_R (MOVW_UABS_G2), /* type */
32, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -584,14 +477,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G2", /* name */
+ AARCH64_R_STR (MOVW_UABS_G2), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOVK: ((S+A) >> 32) & 0xffff [no overflow check] */
- HOWTO (R_AARCH64_MOVW_UABS_G2_NC, /* type */
+ HOWTO64 (AARCH64_R (MOVW_UABS_G2_NC), /* type */
32, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -599,14 +492,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G2_NC", /* name */
+ AARCH64_R_STR (MOVW_UABS_G2_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOVZ: ((S+A) >> 48) & 0xffff */
- HOWTO (R_AARCH64_MOVW_UABS_G3, /* type */
+ HOWTO64 (AARCH64_R (MOVW_UABS_G3), /* type */
48, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -614,7 +507,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_unsigned, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_UABS_G3", /* name */
+ AARCH64_R_STR (MOVW_UABS_G3), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
@@ -625,7 +518,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
to MOVN or MOVZ depending on sign of calculated value. */
/* MOV[ZN]: ((S+A) >> 0) & 0xffff */
- HOWTO (R_AARCH64_MOVW_SABS_G0, /* type */
+ HOWTO (AARCH64_R (MOVW_SABS_G0), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -633,14 +526,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_SABS_G0", /* name */
+ AARCH64_R_STR (MOVW_SABS_G0), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOV[ZN]: ((S+A) >> 16) & 0xffff */
- HOWTO (R_AARCH64_MOVW_SABS_G1, /* type */
+ HOWTO64 (AARCH64_R (MOVW_SABS_G1), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -648,14 +541,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_SABS_G1", /* name */
+ AARCH64_R_STR (MOVW_SABS_G1), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MOV[ZN]: ((S+A) >> 32) & 0xffff */
- HOWTO (R_AARCH64_MOVW_SABS_G2, /* type */
+ HOWTO64 (AARCH64_R (MOVW_SABS_G2), /* type */
32, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -663,7 +556,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_MOVW_SABS_G2", /* name */
+ AARCH64_R_STR (MOVW_SABS_G2), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
@@ -673,7 +566,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
addresses: PG(x) is (x & ~0xfff). */
/* LD-lit: ((S+A-P) >> 2) & 0x7ffff */
- HOWTO (R_AARCH64_LD_PREL_LO19, /* type */
+ HOWTO (AARCH64_R (LD_PREL_LO19), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
19, /* bitsize */
@@ -681,14 +574,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LD_PREL_LO19", /* name */
+ AARCH64_R_STR (LD_PREL_LO19), /* name */
FALSE, /* partial_inplace */
0x7ffff, /* src_mask */
0x7ffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* ADR: (S+A-P) & 0x1fffff */
- HOWTO (R_AARCH64_ADR_PREL_LO21, /* type */
+ HOWTO (AARCH64_R (ADR_PREL_LO21), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -696,14 +589,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ADR_PREL_LO21", /* name */
+ AARCH64_R_STR (ADR_PREL_LO21), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
- HOWTO (R_AARCH64_ADR_PREL_PG_HI21, /* type */
+ HOWTO (AARCH64_R (ADR_PREL_PG_HI21), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -711,14 +604,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ADR_PREL_PG_HI21", /* name */
+ AARCH64_R_STR (ADR_PREL_PG_HI21), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff [no overflow check] */
- HOWTO (R_AARCH64_ADR_PREL_PG_HI21_NC, /* type */
+ HOWTO64 (AARCH64_R (ADR_PREL_PG_HI21_NC), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -726,14 +619,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ADR_PREL_PG_HI21_NC", /* name */
+ AARCH64_R_STR (ADR_PREL_PG_HI21_NC), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* ADD: (S+A) & 0xfff [no overflow check] */
- HOWTO (R_AARCH64_ADD_ABS_LO12_NC, /* type */
+ HOWTO (AARCH64_R (ADD_ABS_LO12_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -741,14 +634,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
10, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ADD_ABS_LO12_NC", /* name */
+ AARCH64_R_STR (ADD_ABS_LO12_NC), /* name */
FALSE, /* partial_inplace */
0x3ffc00, /* src_mask */
0x3ffc00, /* dst_mask */
FALSE), /* pcrel_offset */
/* LD/ST8: (S+A) & 0xfff */
- HOWTO (R_AARCH64_LDST8_ABS_LO12_NC, /* type */
+ HOWTO (AARCH64_R (LDST8_ABS_LO12_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -756,7 +649,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LDST8_ABS_LO12_NC", /* name */
+ AARCH64_R_STR (LDST8_ABS_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
@@ -765,7 +658,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
/* Relocations for control-flow instructions. */
/* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff */
- HOWTO (R_AARCH64_TSTBR14, /* type */
+ HOWTO (AARCH64_R (TSTBR14), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
14, /* bitsize */
@@ -773,14 +666,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TSTBR14", /* name */
+ AARCH64_R_STR (TSTBR14), /* name */
FALSE, /* partial_inplace */
0x3fff, /* src_mask */
0x3fff, /* dst_mask */
TRUE), /* pcrel_offset */
/* B.cond: ((S+A-P) >> 2) & 0x7ffff */
- HOWTO (R_AARCH64_CONDBR19, /* type */
+ HOWTO (AARCH64_R (CONDBR19), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
19, /* bitsize */
@@ -788,16 +681,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_CONDBR19", /* name */
+ AARCH64_R_STR (CONDBR19), /* name */
FALSE, /* partial_inplace */
0x7ffff, /* src_mask */
0x7ffff, /* dst_mask */
TRUE), /* pcrel_offset */
- EMPTY_HOWTO (281),
-
/* B: ((S+A-P) >> 2) & 0x3ffffff */
- HOWTO (R_AARCH64_JUMP26, /* type */
+ HOWTO (AARCH64_R (JUMP26), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
26, /* bitsize */
@@ -805,14 +696,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_JUMP26", /* name */
+ AARCH64_R_STR (JUMP26), /* name */
FALSE, /* partial_inplace */
0x3ffffff, /* src_mask */
0x3ffffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* BL: ((S+A-P) >> 2) & 0x3ffffff */
- HOWTO (R_AARCH64_CALL26, /* type */
+ HOWTO (AARCH64_R (CALL26), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
26, /* bitsize */
@@ -820,14 +711,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_CALL26", /* name */
+ AARCH64_R_STR (CALL26), /* name */
FALSE, /* partial_inplace */
0x3ffffff, /* src_mask */
0x3ffffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* LD/ST16: (S+A) & 0xffe */
- HOWTO (R_AARCH64_LDST16_ABS_LO12_NC, /* type */
+ HOWTO (AARCH64_R (LDST16_ABS_LO12_NC), /* type */
1, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -835,14 +726,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LDST16_ABS_LO12_NC", /* name */
+ AARCH64_R_STR (LDST16_ABS_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xffe, /* src_mask */
0xffe, /* dst_mask */
FALSE), /* pcrel_offset */
/* LD/ST32: (S+A) & 0xffc */
- HOWTO (R_AARCH64_LDST32_ABS_LO12_NC, /* type */
+ HOWTO (AARCH64_R (LDST32_ABS_LO12_NC), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -850,14 +741,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LDST32_ABS_LO12_NC", /* name */
+ AARCH64_R_STR (LDST32_ABS_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xffc, /* src_mask */
0xffc, /* dst_mask */
FALSE), /* pcrel_offset */
/* LD/ST64: (S+A) & 0xff8 */
- HOWTO (R_AARCH64_LDST64_ABS_LO12_NC, /* type */
+ HOWTO (AARCH64_R (LDST64_ABS_LO12_NC), /* type */
3, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -865,27 +756,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LDST64_ABS_LO12_NC", /* name */
+ AARCH64_R_STR (LDST64_ABS_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xff8, /* src_mask */
0xff8, /* dst_mask */
FALSE), /* pcrel_offset */
- EMPTY_HOWTO (287),
- EMPTY_HOWTO (288),
- EMPTY_HOWTO (289),
- EMPTY_HOWTO (290),
- EMPTY_HOWTO (291),
- EMPTY_HOWTO (292),
- EMPTY_HOWTO (293),
- EMPTY_HOWTO (294),
- EMPTY_HOWTO (295),
- EMPTY_HOWTO (296),
- EMPTY_HOWTO (297),
- EMPTY_HOWTO (298),
-
/* LD/ST128: (S+A) & 0xff0 */
- HOWTO (R_AARCH64_LDST128_ABS_LO12_NC, /* type */
+ HOWTO (AARCH64_R (LDST128_ABS_LO12_NC), /* type */
4, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -893,25 +771,15 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LDST128_ABS_LO12_NC", /* name */
+ AARCH64_R_STR (LDST128_ABS_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xff0, /* src_mask */
0xff0, /* dst_mask */
FALSE), /* pcrel_offset */
- EMPTY_HOWTO (300),
- EMPTY_HOWTO (301),
- EMPTY_HOWTO (302),
- EMPTY_HOWTO (303),
- EMPTY_HOWTO (304),
- EMPTY_HOWTO (305),
- EMPTY_HOWTO (306),
- EMPTY_HOWTO (307),
- EMPTY_HOWTO (308),
-
/* Set a load-literal immediate field to bits
0x1FFFFC of G(S)-P */
- HOWTO (R_AARCH64_GOT_LD_PREL19, /* type */
+ HOWTO (AARCH64_R (GOT_LD_PREL19), /* type */
2, /* rightshift */
2, /* size (0 = byte,1 = short,2 = long) */
19, /* bitsize */
@@ -919,17 +787,15 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_GOT_LD_PREL19", /* name */
+ AARCH64_R_STR (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
(G(S) - P) using an ADRP instruction. */
- HOWTO (R_AARCH64_ADR_GOT_PAGE, /* type */
+ HOWTO (AARCH64_R (ADR_GOT_PAGE), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -937,14 +803,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_ADR_GOT_PAGE", /* name */
+ AARCH64_R_STR (ADR_GOT_PAGE), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
TRUE), /* pcrel_offset */
- /* LDNN: GOT offset G(S) & 0xff8 */
- HOWTO (R_AARCH64_LDNN_GOT_LO12_NC, /* type */
+ /* LD64: GOT offset G(S) & 0xff8 */
+ HOWTO64 (AARCH64_R (LD64_GOT_LO12_NC), /* type */
3, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -952,20 +818,30 @@ static reloc_howto_type elf64_aarch64_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_LDNN_GOT_LO12_NC", /* name */
+ AARCH64_R_STR (LD64_GOT_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xff8, /* src_mask */
0xff8, /* dst_mask */
- FALSE) /* pcrel_offset */
-};
+ FALSE), /* pcrel_offset */
-static reloc_howto_type elf64_aarch64_tls_howto_table[] =
-{
- EMPTY_HOWTO (512),
+ /* LD32: GOT offset G(S) & 0xffc */
+ HOWTO32 (AARCH64_R (LD32_GOT_LO12_NC), /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (LD32_GOT_LO12_NC), /* name */
+ FALSE, /* partial_inplace */
+ 0xffc, /* src_mask */
+ 0xffc, /* dst_mask */
+ FALSE), /* pcrel_offset */
/* Get to the page for the GOT entry for the symbol
(G(S) - P) using an ADRP instruction. */
- HOWTO (R_AARCH64_TLSGD_ADR_PAGE21, /* type */
+ HOWTO (AARCH64_R (TLSGD_ADR_PAGE21), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -973,14 +849,14 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSGD_ADR_PAGE21", /* name */
+ AARCH64_R_STR (TLSGD_ADR_PAGE21), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* ADD: GOT offset G(S) & 0xff8 [no overflow check] */
- HOWTO (R_AARCH64_TLSGD_ADD_LO12_NC, /* type */
+ HOWTO (AARCH64_R (TLSGD_ADD_LO12_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -988,38 +864,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSGD_ADD_LO12_NC", /* name */
+ AARCH64_R_STR (TLSGD_ADD_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
FALSE), /* pcrel_offset */
- EMPTY_HOWTO (515),
- EMPTY_HOWTO (516),
- EMPTY_HOWTO (517),
- EMPTY_HOWTO (518),
- EMPTY_HOWTO (519),
- EMPTY_HOWTO (520),
- EMPTY_HOWTO (521),
- EMPTY_HOWTO (522),
- EMPTY_HOWTO (523),
- EMPTY_HOWTO (524),
- EMPTY_HOWTO (525),
- EMPTY_HOWTO (526),
- EMPTY_HOWTO (527),
- EMPTY_HOWTO (528),
- EMPTY_HOWTO (529),
- EMPTY_HOWTO (530),
- EMPTY_HOWTO (531),
- EMPTY_HOWTO (532),
- EMPTY_HOWTO (533),
- EMPTY_HOWTO (534),
- EMPTY_HOWTO (535),
- EMPTY_HOWTO (536),
- EMPTY_HOWTO (537),
- EMPTY_HOWTO (538),
-
- HOWTO (R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, /* type */
+ HOWTO64 (AARCH64_R (TLSIE_MOVW_GOTTPREL_G1), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
@@ -1027,13 +878,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSIE_MOVW_GOTTPREL_G1", /* name */
+ AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G1), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, /* type */
+ HOWTO64 (AARCH64_R (TLSIE_MOVW_GOTTPREL_G0_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
@@ -1041,13 +892,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC", /* name */
+ AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G0_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, /* type */
+ HOWTO (AARCH64_R (TLSIE_ADR_GOTTPREL_PAGE21), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -1055,13 +906,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21", /* name */
+ AARCH64_R_STR (TLSIE_ADR_GOTTPREL_PAGE21), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, /* type */
+ HOWTO64 (AARCH64_R (TLSIE_LD64_GOTTPREL_LO12_NC), /* type */
3, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1069,13 +920,27 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", /* name */
+ AARCH64_R_STR (TLSIE_LD64_GOTTPREL_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xff8, /* src_mask */
0xff8, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, /* type */
+ HOWTO32 (AARCH64_R (TLSIE_LD32_GOTTPREL_LO12_NC), /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (TLSIE_LD32_GOTTPREL_LO12_NC), /* name */
+ FALSE, /* partial_inplace */
+ 0xffc, /* src_mask */
+ 0xffc, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (TLSIE_LD_GOTTPREL_PREL19), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -1083,13 +948,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSIE_LD_GOTTPREL_PREL19", /* name */
+ AARCH64_R_STR (TLSIE_LD_GOTTPREL_PREL19), /* name */
FALSE, /* partial_inplace */
0x1ffffc, /* src_mask */
0x1ffffc, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G2, /* type */
+ HOWTO64 (AARCH64_R (TLSLE_MOVW_TPREL_G2), /* type */
32, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1097,13 +962,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_MOVW_TPREL_G2", /* name */
+ AARCH64_R_STR (TLSLE_MOVW_TPREL_G2), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G1, /* type */
+ HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G1), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1111,13 +976,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_MOVW_TPREL_G1", /* name */
+ AARCH64_R_STR (TLSLE_MOVW_TPREL_G1), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, /* type */
+ HOWTO64 (AARCH64_R (TLSLE_MOVW_TPREL_G1_NC), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1125,13 +990,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_MOVW_TPREL_G1_NC", /* name */
+ AARCH64_R_STR (TLSLE_MOVW_TPREL_G1_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G0, /* type */
+ HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G0), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1139,13 +1004,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_MOVW_TPREL_G0", /* name */
+ AARCH64_R_STR (TLSLE_MOVW_TPREL_G0), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, /* type */
+ HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G0_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1153,13 +1018,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_MOVW_TPREL_G0_NC", /* name */
+ AARCH64_R_STR (TLSLE_MOVW_TPREL_G0_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_ADD_TPREL_HI12, /* type */
+ HOWTO (AARCH64_R (TLSLE_ADD_TPREL_HI12), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1167,13 +1032,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_ADD_TPREL_HI12", /* name */
+ AARCH64_R_STR (TLSLE_ADD_TPREL_HI12), /* name */
FALSE, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_ADD_TPREL_LO12, /* type */
+ HOWTO (AARCH64_R (TLSLE_ADD_TPREL_LO12), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1181,13 +1046,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_ADD_TPREL_LO12", /* name */
+ AARCH64_R_STR (TLSLE_ADD_TPREL_LO12), /* name */
FALSE, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, /* type */
+ HOWTO (AARCH64_R (TLSLE_ADD_TPREL_LO12_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1195,16 +1060,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSLE_ADD_TPREL_LO12_NC", /* name */
+ AARCH64_R_STR (TLSLE_ADD_TPREL_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
FALSE), /* pcrel_offset */
-};
-static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
-{
- HOWTO (R_AARCH64_TLSDESC_LD_PREL19, /* type */
+ HOWTO (AARCH64_R (TLSDESC_LD_PREL19), /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -1212,13 +1074,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_LD_PREL19", /* name */
+ AARCH64_R_STR (TLSDESC_LD_PREL19), /* name */
FALSE, /* partial_inplace */
0x1ffffc, /* src_mask */
0x1ffffc, /* dst_mask */
TRUE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSDESC_ADR_PREL21, /* type */
+ HOWTO (AARCH64_R (TLSDESC_ADR_PREL21), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -1226,7 +1088,7 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_ADR_PREL21", /* name */
+ AARCH64_R_STR (TLSDESC_ADR_PREL21), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
@@ -1234,7 +1096,7 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
/* Get to the page for the GOT entry for the symbol
(G(S) - P) using an ADRP instruction. */
- HOWTO (R_AARCH64_TLSDESC_ADR_PAGE21, /* type */
+ HOWTO (AARCH64_R (TLSDESC_ADR_PAGE21), /* type */
12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
@@ -1242,14 +1104,14 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_ADR_PAGE21", /* name */
+ AARCH64_R_STR (TLSDESC_ADR_PAGE21), /* name */
FALSE, /* partial_inplace */
0x1fffff, /* src_mask */
0x1fffff, /* dst_mask */
TRUE), /* pcrel_offset */
- /* LD64: GOT offset G(S) & 0xfff. */
- HOWTO (R_AARCH64_TLSDESC_LD64_LO12_NC, /* type */
+ /* LD64: GOT offset G(S) & 0xff8. */
+ HOWTO64 (AARCH64_R (TLSDESC_LD64_LO12_NC), /* type */
3, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1257,14 +1119,29 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_LD64_LO12_NC", /* name */
+ AARCH64_R_STR (TLSDESC_LD64_LO12_NC), /* name */
FALSE, /* partial_inplace */
- 0xfff, /* src_mask */
- 0xfff, /* dst_mask */
+ 0xff8, /* src_mask */
+ 0xff8, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* LD32: GOT offset G(S) & 0xffc. */
+ HOWTO32 (AARCH64_R (TLSDESC_LD32_LO12_NC), /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (TLSDESC_LD32_LO12_NC), /* name */
+ FALSE, /* partial_inplace */
+ 0xffc, /* src_mask */
+ 0xffc, /* dst_mask */
FALSE), /* pcrel_offset */
/* ADD: GOT offset G(S) & 0xfff. */
- HOWTO (R_AARCH64_TLSDESC_ADD_LO12_NC, /* type */
+ HOWTO (AARCH64_R (TLSDESC_ADD_LO12_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1272,13 +1149,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_ADD_LO12_NC", /* name */
+ AARCH64_R_STR (TLSDESC_ADD_LO12_NC), /* name */
FALSE, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSDESC_OFF_G1, /* type */
+ HOWTO64 (AARCH64_R (TLSDESC_OFF_G1), /* type */
16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1286,13 +1163,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_OFF_G1", /* name */
+ AARCH64_R_STR (TLSDESC_OFF_G1), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSDESC_OFF_G0_NC, /* type */
+ HOWTO64 (AARCH64_R (TLSDESC_OFF_G0_NC), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1300,13 +1177,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_OFF_G0_NC", /* name */
+ AARCH64_R_STR (TLSDESC_OFF_G0_NC), /* name */
FALSE, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSDESC_LDR, /* type */
+ HOWTO64 (AARCH64_R (TLSDESC_LDR), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1314,13 +1191,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_LDR", /* name */
+ AARCH64_R_STR (TLSDESC_LDR), /* name */
FALSE, /* partial_inplace */
0x0, /* src_mask */
0x0, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSDESC_ADD, /* type */
+ HOWTO64 (AARCH64_R (TLSDESC_ADD), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1328,13 +1205,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_ADD", /* name */
+ AARCH64_R_STR (TLSDESC_ADD), /* name */
FALSE, /* partial_inplace */
0x0, /* src_mask */
0x0, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_AARCH64_TLSDESC_CALL, /* type */
+ HOWTO (AARCH64_R (TLSDESC_CALL), /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
@@ -1342,16 +1219,254 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_AARCH64_TLSDESC_CALL", /* name */
+ AARCH64_R_STR (TLSDESC_CALL), /* name */
FALSE, /* partial_inplace */
0x0, /* src_mask */
0x0, /* dst_mask */
FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (COPY), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (COPY), /* name */
+ TRUE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (GLOB_DAT), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (GLOB_DAT), /* name */
+ TRUE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (JUMP_SLOT), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (JUMP_SLOT), /* name */
+ TRUE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (RELATIVE), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (RELATIVE), /* name */
+ TRUE, /* partial_inplace */
+ ALL_ONES, /* src_mask */
+ ALL_ONES, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (TLS_DTPMOD), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (TLS_DTPMOD), /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ ALL_ONES, /* dst_mask */
+ FALSE), /* pc_reloffset */
+
+ HOWTO (AARCH64_R (TLS_DTPREL), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (TLS_DTPREL), /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ ALL_ONES, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (TLS_TPREL), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (TLS_TPREL), /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ ALL_ONES, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (TLSDESC), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (TLSDESC), /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ ALL_ONES, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (AARCH64_R (IRELATIVE), /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ AARCH64_R_STR (IRELATIVE), /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ ALL_ONES, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ EMPTY_HOWTO (0),
};
+static reloc_howto_type elfNN_aarch64_howto_none =
+ HOWTO (R_AARCH64_NONE, /* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_AARCH64_NONE", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE); /* pcrel_offset */
+
+/* Given HOWTO, return the bfd internal relocation enumerator. */
+
+static bfd_reloc_code_real_type
+elfNN_aarch64_bfd_reloc_from_howto (reloc_howto_type *howto)
+{
+ const int size
+ = (int) ARRAY_SIZE (elfNN_aarch64_howto_table);
+ const ptrdiff_t offset
+ = howto - elfNN_aarch64_howto_table;
+
+ if (offset > 0 && offset < size - 1)
+ return BFD_RELOC_AARCH64_RELOC_START + offset;
+
+ if (howto == &elfNN_aarch64_howto_none)
+ return BFD_RELOC_AARCH64_NONE;
+
+ return BFD_RELOC_AARCH64_RELOC_START;
+}
+
+/* Given R_TYPE, return the bfd internal relocation enumerator. */
+
+static bfd_reloc_code_real_type
+elfNN_aarch64_bfd_reloc_from_type (unsigned int r_type)
+{
+ static bfd_boolean initialized_p = FALSE;
+ /* Indexed by R_TYPE, values are offsets in the howto_table. */
+ static unsigned int offsets[R_AARCH64_end];
+
+ if (initialized_p == FALSE)
+ {
+ unsigned int i;
+
+ for (i = 1; i < ARRAY_SIZE (elfNN_aarch64_howto_table) - 1; ++i)
+ if (elfNN_aarch64_howto_table[i].type != 0)
+ offsets[elfNN_aarch64_howto_table[i].type] = i;
+
+ initialized_p = TRUE;
+ }
+
+ if (r_type == R_AARCH64_NONE || r_type == R_AARCH64_NULL)
+ return BFD_RELOC_AARCH64_NONE;
+
+ return BFD_RELOC_AARCH64_RELOC_START + offsets[r_type];
+}
+
+struct elf_aarch64_reloc_map
+{
+ bfd_reloc_code_real_type from;
+ bfd_reloc_code_real_type to;
+};
+
+/* Map bfd generic reloc to AArch64-specific reloc. */
+static const struct elf_aarch64_reloc_map elf_aarch64_reloc_map[] =
+{
+ {BFD_RELOC_NONE, BFD_RELOC_AARCH64_NONE},
+
+ /* Basic data relocations. */
+ {BFD_RELOC_CTOR, BFD_RELOC_AARCH64_NN},
+ {BFD_RELOC_64, BFD_RELOC_AARCH64_64},
+ {BFD_RELOC_32, BFD_RELOC_AARCH64_32},
+ {BFD_RELOC_16, BFD_RELOC_AARCH64_16},
+ {BFD_RELOC_64_PCREL, BFD_RELOC_AARCH64_64_PCREL},
+ {BFD_RELOC_32_PCREL, BFD_RELOC_AARCH64_32_PCREL},
+ {BFD_RELOC_16_PCREL, BFD_RELOC_AARCH64_16_PCREL},
+};
+
+/* Given the bfd internal relocation enumerator in CODE, return the
+ corresponding howto entry. */
+
+static reloc_howto_type *
+elfNN_aarch64_howto_from_bfd_reloc (bfd_reloc_code_real_type code)
+{
+ unsigned int i;
+
+ /* Convert bfd generic reloc to AArch64-specific reloc. */
+ if (code < BFD_RELOC_AARCH64_RELOC_START
+ || code > BFD_RELOC_AARCH64_RELOC_END)
+ for (i = 0; i < ARRAY_SIZE (elf_aarch64_reloc_map); i++)
+ if (elf_aarch64_reloc_map[i].from == code)
+ {
+ code = elf_aarch64_reloc_map[i].to;
+ break;
+ }
+
+ if (code > BFD_RELOC_AARCH64_RELOC_START
+ && code < BFD_RELOC_AARCH64_RELOC_END)
+ if (elfNN_aarch64_howto_table[code - BFD_RELOC_AARCH64_RELOC_START].type)
+ return &elfNN_aarch64_howto_table[code - BFD_RELOC_AARCH64_RELOC_START];
+
+ return NULL;
+}
+
static reloc_howto_type *
elfNN_aarch64_howto_from_type (unsigned int r_type)
{
+ bfd_reloc_code_real_type val;
+ reloc_howto_type *howto;
+
#if ARCH_SIZE == 32
if (r_type > 256)
{
@@ -1360,24 +1475,15 @@ elfNN_aarch64_howto_from_type (unsigned int r_type)
}
#endif
- if (r_type >= R_AARCH64_static_min && r_type < R_AARCH64_static_max)
- return &elf64_aarch64_howto_table[r_type - R_AARCH64_static_min];
-
- if (r_type >= R_AARCH64_tls_min && r_type < R_AARCH64_tls_max)
- return &elf64_aarch64_tls_howto_table[r_type - R_AARCH64_tls_min];
-
- if (r_type >= R_AARCH64_tlsdesc_min && r_type < R_AARCH64_tlsdesc_max)
- return &elf64_aarch64_tlsdesc_howto_table[r_type - R_AARCH64_tlsdesc_min];
+ if (r_type == R_AARCH64_NONE)
+ return &elfNN_aarch64_howto_none;
- if (r_type >= R_AARCH64_dyn_min && r_type < R_AARCH64_dyn_max)
- return &elf64_aarch64_howto_dynrelocs[r_type - R_AARCH64_dyn_min];
+ val = elfNN_aarch64_bfd_reloc_from_type (r_type);
+ howto = elfNN_aarch64_howto_from_bfd_reloc (val);
- switch (r_type)
- {
- case R_AARCH64_NONE:
- return &elf64_aarch64_howto_none;
+ if (howto != NULL)
+ return howto;
- }
bfd_set_error (bfd_error_bad_value);
return NULL;
}
@@ -1392,119 +1498,14 @@ elfNN_aarch64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
bfd_reloc->howto = elfNN_aarch64_howto_from_type (r_type);
}
-struct elf64_aarch64_reloc_map
-{
- bfd_reloc_code_real_type bfd_reloc_val;
- unsigned int elf_reloc_val;
-};
-
-/* All entries in this list must also be present in
- elf64_aarch64_howto_table. */
-static const struct elf64_aarch64_reloc_map elf64_aarch64_reloc_map[] =
-{
- {BFD_RELOC_NONE, R_AARCH64_NONE},
-
- /* Basic data relocations. */
- {BFD_RELOC_CTOR, R_AARCH64_ABS64},
- {BFD_RELOC_64, R_AARCH64_ABS64},
- {BFD_RELOC_32, R_AARCH64_ABS32},
- {BFD_RELOC_16, R_AARCH64_ABS16},
- {BFD_RELOC_64_PCREL, R_AARCH64_PREL64},
- {BFD_RELOC_32_PCREL, R_AARCH64_PREL32},
- {BFD_RELOC_16_PCREL, R_AARCH64_PREL16},
-
- /* Group relocations to low order bits of a 16, 32, 48 or 64 bit
- value inline. */
- {BFD_RELOC_AARCH64_MOVW_G0_NC, R_AARCH64_MOVW_UABS_G0_NC},
- {BFD_RELOC_AARCH64_MOVW_G1_NC, R_AARCH64_MOVW_UABS_G1_NC},
- {BFD_RELOC_AARCH64_MOVW_G2_NC, R_AARCH64_MOVW_UABS_G2_NC},
-
- /* Group relocations to create high bits of a 16, 32, 48 or 64 bit
- signed value inline. */
- {BFD_RELOC_AARCH64_MOVW_G0_S, R_AARCH64_MOVW_SABS_G0},
- {BFD_RELOC_AARCH64_MOVW_G1_S, R_AARCH64_MOVW_SABS_G1},
- {BFD_RELOC_AARCH64_MOVW_G2_S, R_AARCH64_MOVW_SABS_G2},
-
- /* Group relocations to create high bits of a 16, 32, 48 or 64 bit
- unsigned value inline. */
- {BFD_RELOC_AARCH64_MOVW_G0, R_AARCH64_MOVW_UABS_G0},
- {BFD_RELOC_AARCH64_MOVW_G1, R_AARCH64_MOVW_UABS_G1},
- {BFD_RELOC_AARCH64_MOVW_G2, R_AARCH64_MOVW_UABS_G2},
- {BFD_RELOC_AARCH64_MOVW_G3, R_AARCH64_MOVW_UABS_G3},
-
- /* Relocations to generate 19, 21 and 33 bit PC-relative load/store. */
- {BFD_RELOC_AARCH64_LD_LO19_PCREL, R_AARCH64_LD_PREL_LO19},
- {BFD_RELOC_AARCH64_ADR_LO21_PCREL, R_AARCH64_ADR_PREL_LO21},
- {BFD_RELOC_AARCH64_ADR_HI21_PCREL, R_AARCH64_ADR_PREL_PG_HI21},
- {BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL, R_AARCH64_ADR_PREL_PG_HI21_NC},
- {BFD_RELOC_AARCH64_ADD_LO12, R_AARCH64_ADD_ABS_LO12_NC},
- {BFD_RELOC_AARCH64_LDST8_LO12, R_AARCH64_LDST8_ABS_LO12_NC},
- {BFD_RELOC_AARCH64_LDST16_LO12, R_AARCH64_LDST16_ABS_LO12_NC},
- {BFD_RELOC_AARCH64_LDST32_LO12, R_AARCH64_LDST32_ABS_LO12_NC},
- {BFD_RELOC_AARCH64_LDST64_LO12, R_AARCH64_LDST64_ABS_LO12_NC},
- {BFD_RELOC_AARCH64_LDST128_LO12, R_AARCH64_LDST128_ABS_LO12_NC},
-
- /* Relocations for control-flow instructions. */
- {BFD_RELOC_AARCH64_TSTBR14, R_AARCH64_TSTBR14},
- {BFD_RELOC_AARCH64_BRANCH19, R_AARCH64_CONDBR19},
- {BFD_RELOC_AARCH64_JUMP26, R_AARCH64_JUMP26},
- {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},
-
- /* Relocations for TLS. */
- {BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21, R_AARCH64_TLSGD_ADR_PAGE21},
- {BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC, R_AARCH64_TLSGD_ADD_LO12_NC},
- {BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1,
- R_AARCH64_TLSIE_MOVW_GOTTPREL_G1},
- {BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,
- R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC},
- {BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
- R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21},
- {BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC,
- R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC},
- {BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19,
- R_AARCH64_TLSIE_LD_GOTTPREL_PREL19},
- {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2, R_AARCH64_TLSLE_MOVW_TPREL_G2},
- {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1, R_AARCH64_TLSLE_MOVW_TPREL_G1},
- {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
- R_AARCH64_TLSLE_MOVW_TPREL_G1_NC},
- {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0, R_AARCH64_TLSLE_MOVW_TPREL_G0},
- {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
- R_AARCH64_TLSLE_MOVW_TPREL_G0_NC},
- {BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12, R_AARCH64_TLSLE_ADD_TPREL_LO12},
- {BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12, R_AARCH64_TLSLE_ADD_TPREL_HI12},
- {BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
- R_AARCH64_TLSLE_ADD_TPREL_LO12_NC},
- {BFD_RELOC_AARCH64_TLSDESC_LD_PREL19, R_AARCH64_TLSDESC_LD_PREL19},
- {BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21, R_AARCH64_TLSDESC_ADR_PREL21},
- {BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21, R_AARCH64_TLSDESC_ADR_PAGE21},
- {BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC, R_AARCH64_TLSDESC_ADD_LO12_NC},
- {BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC, R_AARCH64_TLSDESC_LD64_LO12_NC},
- {BFD_RELOC_AARCH64_TLSDESC_OFF_G1, R_AARCH64_TLSDESC_OFF_G1},
- {BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC, R_AARCH64_TLSDESC_OFF_G0_NC},
- {BFD_RELOC_AARCH64_TLSDESC_LDR, R_AARCH64_TLSDESC_LDR},
- {BFD_RELOC_AARCH64_TLSDESC_ADD, R_AARCH64_TLSDESC_ADD},
- {BFD_RELOC_AARCH64_TLSDESC_CALL, R_AARCH64_TLSDESC_CALL},
- {BFD_RELOC_AARCH64_TLS_DTPMOD64, R_AARCH64_TLS_DTPMOD64},
- {BFD_RELOC_AARCH64_TLS_DTPREL64, R_AARCH64_TLS_DTPREL64},
- {BFD_RELOC_AARCH64_TLS_TPREL64, R_AARCH64_TLS_TPREL64},
- {BFD_RELOC_AARCH64_TLSDESC, R_AARCH64_TLSDESC},
-};
-
static reloc_howto_type *
elfNN_aarch64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
bfd_reloc_code_real_type code)
{
- unsigned int i;
+ reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (code);
- for (i = 0; i < ARRAY_SIZE (elf64_aarch64_reloc_map); i++)
- if (elf64_aarch64_reloc_map[i].bfd_reloc_val == code)
- return elf64_aarch64_howto_from_type
- (elf64_aarch64_reloc_map[i].elf_reloc_val);
+ if (howto != NULL)
+ return howto;
bfd_set_error (bfd_error_bad_value);
return NULL;
@@ -1516,10 +1517,10 @@ elfNN_aarch64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
{
unsigned int i;
- for (i = 0; i < ARRAY_SIZE (elf64_aarch64_howto_table); i++)
- if (elf64_aarch64_howto_table[i].name != NULL
- && strcasecmp (elf64_aarch64_howto_table[i].name, r_name) == 0)
- return &elf64_aarch64_howto_table[i];
+ for (i = 1; i < ARRAY_SIZE (elfNN_aarch64_howto_table) - 1; ++i)
+ if (elfNN_aarch64_howto_table[i].name != NULL
+ && strcasecmp (elfNN_aarch64_howto_table[i].name, r_name) == 0)
+ return &elfNN_aarch64_howto_table[i];
return NULL;
}
@@ -2086,99 +2087,105 @@ static bfd_vma
aarch64_resolve_relocation (unsigned int r_type, bfd_vma place, bfd_vma value,
bfd_vma addend, bfd_boolean weak_undef_p)
{
- switch (r_type)
+ switch (elfNN_aarch64_bfd_reloc_from_type (r_type))
{
- case R_AARCH64_TLSDESC_CALL:
- case R_AARCH64_NONE:
- case R_AARCH64_NULL:
+ case BFD_RELOC_AARCH64_TLSDESC_CALL:
+ case BFD_RELOC_AARCH64_NONE:
break;
- case R_AARCH64_ADR_PREL_LO21:
- case R_AARCH64_CONDBR19:
- case R_AARCH64_LD_PREL_LO19:
- case R_AARCH64_PREL16:
- case R_AARCH64_PREL32:
- case R_AARCH64_PREL64:
- case R_AARCH64_TSTBR14:
+ case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
+ case BFD_RELOC_AARCH64_BRANCH19:
+ case BFD_RELOC_AARCH64_LD_LO19_PCREL:
+ case BFD_RELOC_AARCH64_16_PCREL:
+ case BFD_RELOC_AARCH64_32_PCREL:
+ case BFD_RELOC_AARCH64_64_PCREL:
+ case BFD_RELOC_AARCH64_TSTBR14:
if (weak_undef_p)
value = place;
value = value + addend - place;
break;
- case R_AARCH64_CALL26:
- case R_AARCH64_JUMP26:
+ case BFD_RELOC_AARCH64_CALL26:
+ case BFD_RELOC_AARCH64_JUMP26:
value = value + addend - place;
break;
- case R_AARCH64_ABS16:
- case R_AARCH64_ABS32:
- case R_AARCH64_MOVW_SABS_G0:
- case R_AARCH64_MOVW_SABS_G1:
- case R_AARCH64_MOVW_SABS_G2:
- case R_AARCH64_MOVW_UABS_G0:
- case R_AARCH64_MOVW_UABS_G0_NC:
- case R_AARCH64_MOVW_UABS_G1:
- case R_AARCH64_MOVW_UABS_G1_NC:
- case R_AARCH64_MOVW_UABS_G2:
- case R_AARCH64_MOVW_UABS_G2_NC:
- case R_AARCH64_MOVW_UABS_G3:
+ case BFD_RELOC_AARCH64_16:
+ case BFD_RELOC_AARCH64_32:
+ case BFD_RELOC_AARCH64_MOVW_G0_S:
+ case BFD_RELOC_AARCH64_MOVW_G1_S:
+ case BFD_RELOC_AARCH64_MOVW_G2_S:
+ case BFD_RELOC_AARCH64_MOVW_G0:
+ case BFD_RELOC_AARCH64_MOVW_G0_NC:
+ case BFD_RELOC_AARCH64_MOVW_G1:
+ case BFD_RELOC_AARCH64_MOVW_G1_NC:
+ case BFD_RELOC_AARCH64_MOVW_G2:
+ case BFD_RELOC_AARCH64_MOVW_G2_NC:
+ case BFD_RELOC_AARCH64_MOVW_G3:
value = value + addend;
break;
- case R_AARCH64_ADR_PREL_PG_HI21:
- case R_AARCH64_ADR_PREL_PG_HI21_NC:
+ case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
if (weak_undef_p)
value = PG (place);
value = PG (value + addend) - PG (place);
break;
- case R_AARCH64_GOT_LD_PREL19:
+ case BFD_RELOC_AARCH64_GOT_LD_PREL19:
value = value + addend - place;
break;
- case R_AARCH64_ADR_GOT_PAGE:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
value = PG (value + addend) - PG (place);
break;
- case R_AARCH64_ADD_ABS_LO12_NC:
- case R_AARCH64_LD64_GOT_LO12_NC:
- case R_AARCH64_LDST8_ABS_LO12_NC:
- case R_AARCH64_LDST16_ABS_LO12_NC:
- case R_AARCH64_LDST32_ABS_LO12_NC:
- case R_AARCH64_LDST64_ABS_LO12_NC:
- case R_AARCH64_LDST128_ABS_LO12_NC:
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_ADD:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
- case R_AARCH64_TLSDESC_LDR:
- case R_AARCH64_TLSGD_ADD_LO12_NC:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_ADD_LO12:
+ case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LDST8_LO12:
+ case BFD_RELOC_AARCH64_LDST16_LO12:
+ case BFD_RELOC_AARCH64_LDST32_LO12:
+ case BFD_RELOC_AARCH64_LDST64_LO12:
+ case BFD_RELOC_AARCH64_LDST128_LO12:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD:
+ case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LDR:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
value = PG_OFFSET (value + addend);
break;
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
value = (value + addend) & (bfd_vma) 0xffff0000;
break;
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
value = (value + addend) & (bfd_vma) 0xfff000;
break;
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
value = (value + addend) & (bfd_vma) 0xffff;
break;
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
value = (value + addend) & ~(bfd_vma) 0xffffffff;
value -= place & ~(bfd_vma) 0xffffffff;
break;
+
+ default:
+ break;
}
+
return value;
}
@@ -2244,7 +2251,7 @@ aarch64_type_of_stub (struct bfd_link_info *info,
/* We don't want to redirect any old unconditional jump in this way,
only one which is being used for a sibcall, where it is
acceptable for the IP0 and IP1 registers to be clobbered. */
- if ((r_type == R_AARCH64_CALL26 || r_type == R_AARCH64_JUMP26)
+ if ((r_type == AARCH64_R (CALL26) || r_type == AARCH64_R (JUMP26))
&& (branch_offset > AARCH64_MAX_FWD_BRANCH_OFFSET
|| branch_offset < AARCH64_MAX_BWD_BRANCH_OFFSET))
{
@@ -2461,14 +2468,14 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry,
switch (stub_entry->stub_type)
{
case aarch64_stub_adrp_branch:
- if (aarch64_relocate (R_AARCH64_ADR_PREL_PG_HI21, stub_bfd, stub_sec,
+ if (aarch64_relocate (AARCH64_R (ADR_PREL_PG_HI21), stub_bfd, stub_sec,
stub_entry->stub_offset, sym_value))
/* The stub would not have been relaxed if the offset was out
of range. */
BFD_FAIL ();
_bfd_final_link_relocate
- (elfNN_aarch64_howto_from_type (R_AARCH64_ADD_ABS_LO12_NC),
+ (elfNN_aarch64_howto_from_type (AARCH64_R (ADD_ABS_LO12_NC)),
stub_bfd,
stub_sec,
stub_sec->contents,
@@ -2481,7 +2488,7 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry,
/* We want the value relative to the address 12 bytes back from the
value itself. */
_bfd_final_link_relocate (elfNN_aarch64_howto_from_type
- (R_AARCH64_PREL64), stub_bfd, stub_sec,
+ (AARCH64_R (PRELNN)), stub_bfd, stub_sec,
stub_sec->contents,
stub_entry->stub_offset + 16,
sym_value + 12, 0);
@@ -2822,8 +2829,8 @@ elfNN_aarch64_size_stubs (bfd *output_bfd,
/* Only look for stubs on unconditional branch and
branch and link instructions. */
- if (r_type != (unsigned int) R_AARCH64_CALL26
- && r_type != (unsigned int) R_AARCH64_JUMP26)
+ if (r_type != (unsigned int) AARCH64_R (CALL26)
+ && r_type != (unsigned int) AARCH64_R (JUMP26))
continue;
/* Now determine the call target, its name, value,
@@ -3339,66 +3346,69 @@ bfd_elf_aarch64_put_addend (bfd *abfd,
addend >>= howto->rightshift;
- switch (howto->type)
+ switch (elfNN_aarch64_bfd_reloc_from_howto (howto))
{
- case R_AARCH64_JUMP26:
- case R_AARCH64_CALL26:
+ case BFD_RELOC_AARCH64_JUMP26:
+ case BFD_RELOC_AARCH64_CALL26:
contents = reencode_branch_ofs_26 (contents, addend);
break;
- case R_AARCH64_CONDBR19:
+ case BFD_RELOC_AARCH64_BRANCH19:
contents = reencode_cond_branch_ofs_19 (contents, addend);
break;
- case R_AARCH64_TSTBR14:
+ case BFD_RELOC_AARCH64_TSTBR14:
contents = reencode_tst_branch_ofs_14 (contents, addend);
break;
- case R_AARCH64_LD_PREL_LO19:
- case R_AARCH64_GOT_LD_PREL19:
+ case BFD_RELOC_AARCH64_LD_LO19_PCREL:
+ case BFD_RELOC_AARCH64_GOT_LD_PREL19:
if (old_addend & ((1 << howto->rightshift) - 1))
return bfd_reloc_overflow;
contents = reencode_ld_lit_ofs_19 (contents, addend);
break;
- case R_AARCH64_TLSDESC_CALL:
+ case BFD_RELOC_AARCH64_TLSDESC_CALL:
break;
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_ADR_GOT_PAGE:
- case R_AARCH64_ADR_PREL_LO21:
- case R_AARCH64_ADR_PREL_PG_HI21:
- case R_AARCH64_ADR_PREL_PG_HI21_NC:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
+ case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
contents = reencode_adr_imm (contents, addend);
break;
- case R_AARCH64_TLSGD_ADD_LO12_NC:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_ADD_ABS_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_ADD_LO12:
/* Corresponds to: add rd, rn, #uimm12 to provide the low order
12 bits of the page offset following
- R_AARCH64_ADR_PREL_PG_HI21 which computes the
+ BFD_RELOC_AARCH64_ADR_HI21_PCREL which computes the
(pc-relative) page base. */
contents = reencode_add_imm (contents, addend);
break;
- case R_AARCH64_LDST8_ABS_LO12_NC:
- case R_AARCH64_LDST16_ABS_LO12_NC:
- case R_AARCH64_LDST32_ABS_LO12_NC:
- case R_AARCH64_LDST64_ABS_LO12_NC:
- case R_AARCH64_LDST128_ABS_LO12_NC:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
- case R_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LDST8_LO12:
+ case BFD_RELOC_AARCH64_LDST16_LO12:
+ case BFD_RELOC_AARCH64_LDST32_LO12:
+ case BFD_RELOC_AARCH64_LDST64_LO12:
+ case BFD_RELOC_AARCH64_LDST128_LO12:
+ case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
if (old_addend & ((1 << howto->rightshift) - 1))
return bfd_reloc_overflow;
/* Used for ldr*|str* rt, [rn, #uimm12] to provide the low order
- 12 bits of the page offset following R_AARCH64_ADR_PREL_PG_HI21
+ 12 bits of the page offset following BFD_RELOC_AARCH64_ADR_HI21_PCREL
which computes the (pc-relative) page base. */
contents = reencode_ldst_pos_imm (contents, addend);
break;
@@ -3408,14 +3418,14 @@ bfd_elf_aarch64_put_addend (bfd *abfd,
instruction to MOVN or MOVZ depending on sign of calculated
value. */
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
- case R_AARCH64_MOVW_SABS_G0:
- case R_AARCH64_MOVW_SABS_G1:
- case R_AARCH64_MOVW_SABS_G2:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_MOVW_G0_S:
+ case BFD_RELOC_AARCH64_MOVW_G1_S:
+ case BFD_RELOC_AARCH64_MOVW_G2_S:
/* NOTE: We can only come here with movz or movn. */
if (addend < 0)
{
@@ -3433,13 +3443,13 @@ bfd_elf_aarch64_put_addend (bfd *abfd,
/* Group relocations to create a 16, 32, 48 or 64 bit unsigned
data or abs address inline. */
- case R_AARCH64_MOVW_UABS_G0:
- case R_AARCH64_MOVW_UABS_G0_NC:
- case R_AARCH64_MOVW_UABS_G1:
- case R_AARCH64_MOVW_UABS_G1_NC:
- case R_AARCH64_MOVW_UABS_G2:
- case R_AARCH64_MOVW_UABS_G2_NC:
- case R_AARCH64_MOVW_UABS_G3:
+ case BFD_RELOC_AARCH64_MOVW_G0:
+ case BFD_RELOC_AARCH64_MOVW_G0_NC:
+ case BFD_RELOC_AARCH64_MOVW_G1:
+ case BFD_RELOC_AARCH64_MOVW_G1_NC:
+ case BFD_RELOC_AARCH64_MOVW_G2:
+ case BFD_RELOC_AARCH64_MOVW_G2_NC:
+ case BFD_RELOC_AARCH64_MOVW_G3:
contents = reencode_movw_imm (contents, addend);
break;
@@ -3488,6 +3498,7 @@ aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h,
if (h != NULL)
{
+ BFD_ASSERT (basegot != NULL);
off = h->got.offset;
BFD_ASSERT (off != (bfd_vma) - 1);
if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
@@ -3499,8 +3510,9 @@ aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h,
/* This is actually a static link, or it is a -Bsymbolic link
and the symbol is defined locally. We must initialize this
entry in the global offset table. Since the offset must
- always be a multiple of 8, we use the least significant bit
- to record whether we have initialized it already.
+ always be a multiple of 8 (4 in the case of ILP32), we use
+ the least significant bit to record whether we have
+ initialized it already.
When doing a dynamic link, we create a .rel(a).got relocation
entry to initialize the value. This is done in the
finish_dynamic_symbol routine. */
@@ -3524,72 +3536,83 @@ aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h,
/* Change R_TYPE to a more efficient access model where possible,
return the new reloc type. */
-static unsigned int
-aarch64_tls_transition_without_check (unsigned int r_type,
+static bfd_reloc_code_real_type
+aarch64_tls_transition_without_check (bfd_reloc_code_real_type r_type,
struct elf_link_hash_entry *h)
{
bfd_boolean is_local = h == NULL;
+
switch (r_type)
{
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- return is_local
- ? R_AARCH64_TLSLE_MOVW_TPREL_G1 : R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21;
-
- case R_AARCH64_TLSGD_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
- return is_local
- ? R_AARCH64_TLSLE_MOVW_TPREL_G0_NC
- : R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
-
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- return is_local ? R_AARCH64_TLSLE_MOVW_TPREL_G1 : r_type;
-
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
- return is_local ? R_AARCH64_TLSLE_MOVW_TPREL_G0_NC : r_type;
-
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_CALL:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ return (is_local
+ ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1
+ : BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21);
+
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
+ return (is_local
+ ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC
+ : BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC);
+
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ return is_local ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 : r_type;
+
+ case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
+ return is_local ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC : r_type;
+
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_CALL:
/* Instructions with these relocations will become NOPs. */
- return R_AARCH64_NONE;
+ return BFD_RELOC_AARCH64_NONE;
+
+ default:
+ break;
}
return r_type;
}
static unsigned int
-aarch64_reloc_got_type (unsigned int r_type)
+aarch64_reloc_got_type (bfd_reloc_code_real_type r_type)
{
switch (r_type)
{
- case R_AARCH64_LD64_GOT_LO12_NC:
- case R_AARCH64_ADR_GOT_PAGE:
- case R_AARCH64_GOT_LD_PREL19:
+ case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
+ case BFD_RELOC_AARCH64_GOT_LD_PREL19:
return GOT_NORMAL;
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
return GOT_TLS_GD;
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_TLSDESC_CALL:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_CALL:
+ case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
return GOT_TLSDESC_GD;
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
return GOT_TLS_IE;
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
return GOT_UNKNOWN;
+
+ default:
+ break;
}
return GOT_UNKNOWN;
}
@@ -3597,7 +3620,7 @@ aarch64_reloc_got_type (unsigned int r_type)
static bfd_boolean
aarch64_can_relax_tls (bfd *input_bfd,
struct bfd_link_info *info,
- unsigned int r_type,
+ bfd_reloc_code_real_type r_type,
struct elf_link_hash_entry *h,
unsigned long r_symndx)
{
@@ -3622,21 +3645,27 @@ aarch64_can_relax_tls (bfd *input_bfd,
return TRUE;
}
-static unsigned int
+/* Given the relocation code R_TYPE, return the relaxed bfd reloc
+ enumerator. */
+
+static bfd_reloc_code_real_type
aarch64_tls_transition (bfd *input_bfd,
struct bfd_link_info *info,
unsigned int r_type,
struct elf_link_hash_entry *h,
unsigned long r_symndx)
{
- if (! aarch64_can_relax_tls (input_bfd, info, r_type, h, r_symndx))
- return r_type;
+ bfd_reloc_code_real_type bfd_r_type
+ = elfNN_aarch64_bfd_reloc_from_type (r_type);
- return aarch64_tls_transition_without_check (r_type, h);
+ if (! aarch64_can_relax_tls (input_bfd, info, bfd_r_type, h, r_symndx))
+ return bfd_r_type;
+
+ return aarch64_tls_transition_without_check (bfd_r_type, h);
}
/* Return the base VMA address which should be subtracted from real addresses
- when resolving R_AARCH64_TLS_DTPREL64 relocation. */
+ when resolving R_AARCH64_TLS_DTPREL relocation. */
static bfd_vma
dtpoff_base (struct bfd_link_info *info)
@@ -3646,7 +3675,6 @@ dtpoff_base (struct bfd_link_info *info)
return elf_hash_table (info)->tls_sec->vma;
}
-
/* Return the base VMA address which should be subtracted from real addresses
when resolving R_AARCH64_TLS_GOTTPREL64 relocations. */
@@ -3778,6 +3806,9 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
bfd_vma *saved_addend)
{
unsigned int r_type = howto->type;
+ bfd_reloc_code_real_type bfd_r_type
+ = elfNN_aarch64_bfd_reloc_from_howto (howto);
+ bfd_reloc_code_real_type new_bfd_r_type;
unsigned long r_symndx;
bfd_byte *hit_data = contents + rel->r_offset;
bfd_vma place;
@@ -3793,10 +3824,14 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
/* It is possible to have linker relaxations on some TLS access
models. Update our information here. */
- r_type = aarch64_tls_transition (input_bfd, info, r_type, h, r_symndx);
-
- if (r_type != howto->type)
- howto = elfNN_aarch64_howto_from_type (r_type);
+ new_bfd_r_type = aarch64_tls_transition (input_bfd, info, r_type, h, r_symndx);
+ if (new_bfd_r_type != bfd_r_type)
+ {
+ bfd_r_type = new_bfd_r_type;
+ howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type);
+ BFD_ASSERT (howto != NULL);
+ r_type = howto->type;
+ }
place = input_section->output_section->vma
+ input_section->output_offset + rel->r_offset;
@@ -3808,15 +3843,15 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
: bfd_is_und_section (sym_sec));
- switch (r_type)
+
+ switch (bfd_r_type)
{
- case R_AARCH64_NONE:
- case R_AARCH64_NULL:
- case R_AARCH64_TLSDESC_CALL:
+ case BFD_RELOC_AARCH64_NONE:
+ case BFD_RELOC_AARCH64_TLSDESC_CALL:
*unresolved_reloc_p = FALSE;
return bfd_reloc_ok;
- case R_AARCH64_ABS64:
+ case BFD_RELOC_AARCH64_NN:
/* When generating a shared object or relocatable executable, these
relocations are copied into the output file to be resolved at
@@ -3871,7 +3906,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
relocate the text and data segments independently,
so the symbol does not matter. */
symbol = 0;
- outrel.r_info = ELFNN_R_INFO (symbol, R_AARCH64_RELATIVE);
+ outrel.r_info = ELFNN_R_INFO (symbol, AARCH64_R (RELATIVE));
outrel.r_addend += value;
}
@@ -3900,8 +3935,8 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
value += signed_addend;
break;
- case R_AARCH64_JUMP26:
- case R_AARCH64_CALL26:
+ case BFD_RELOC_AARCH64_JUMP26:
+ case BFD_RELOC_AARCH64_CALL26:
{
asection *splt = globals->root.splt;
bfd_boolean via_plt_p =
@@ -3954,40 +3989,43 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
signed_addend, weak_undef_p);
break;
- case R_AARCH64_ABS16:
- case R_AARCH64_ABS32:
- case R_AARCH64_ADD_ABS_LO12_NC:
- case R_AARCH64_ADR_PREL_LO21:
- case R_AARCH64_ADR_PREL_PG_HI21:
- case R_AARCH64_ADR_PREL_PG_HI21_NC:
- case R_AARCH64_CONDBR19:
- case R_AARCH64_LD_PREL_LO19:
- case R_AARCH64_LDST8_ABS_LO12_NC:
- case R_AARCH64_LDST16_ABS_LO12_NC:
- case R_AARCH64_LDST32_ABS_LO12_NC:
- case R_AARCH64_LDST64_ABS_LO12_NC:
- case R_AARCH64_LDST128_ABS_LO12_NC:
- case R_AARCH64_MOVW_SABS_G0:
- case R_AARCH64_MOVW_SABS_G1:
- case R_AARCH64_MOVW_SABS_G2:
- case R_AARCH64_MOVW_UABS_G0:
- case R_AARCH64_MOVW_UABS_G0_NC:
- case R_AARCH64_MOVW_UABS_G1:
- case R_AARCH64_MOVW_UABS_G1_NC:
- case R_AARCH64_MOVW_UABS_G2:
- case R_AARCH64_MOVW_UABS_G2_NC:
- case R_AARCH64_MOVW_UABS_G3:
- case R_AARCH64_PREL16:
- case R_AARCH64_PREL32:
- case R_AARCH64_PREL64:
- case R_AARCH64_TSTBR14:
+ case BFD_RELOC_AARCH64_16:
+#if ARCH_SIZE == 64
+ case BFD_RELOC_AARCH64_32:
+#endif
+ case BFD_RELOC_AARCH64_ADD_LO12:
+ case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
+ case BFD_RELOC_AARCH64_BRANCH19:
+ case BFD_RELOC_AARCH64_LD_LO19_PCREL:
+ case BFD_RELOC_AARCH64_LDST8_LO12:
+ case BFD_RELOC_AARCH64_LDST16_LO12:
+ case BFD_RELOC_AARCH64_LDST32_LO12:
+ case BFD_RELOC_AARCH64_LDST64_LO12:
+ case BFD_RELOC_AARCH64_LDST128_LO12:
+ case BFD_RELOC_AARCH64_MOVW_G0_S:
+ case BFD_RELOC_AARCH64_MOVW_G1_S:
+ case BFD_RELOC_AARCH64_MOVW_G2_S:
+ case BFD_RELOC_AARCH64_MOVW_G0:
+ case BFD_RELOC_AARCH64_MOVW_G0_NC:
+ case BFD_RELOC_AARCH64_MOVW_G1:
+ case BFD_RELOC_AARCH64_MOVW_G1_NC:
+ case BFD_RELOC_AARCH64_MOVW_G2:
+ case BFD_RELOC_AARCH64_MOVW_G2_NC:
+ case BFD_RELOC_AARCH64_MOVW_G3:
+ case BFD_RELOC_AARCH64_16_PCREL:
+ case BFD_RELOC_AARCH64_32_PCREL:
+ case BFD_RELOC_AARCH64_64_PCREL:
+ case BFD_RELOC_AARCH64_TSTBR14:
value = aarch64_resolve_relocation (r_type, place, value,
signed_addend, weak_undef_p);
break;
- case R_AARCH64_LD64_GOT_LO12_NC:
- case R_AARCH64_ADR_GOT_PAGE:
- case R_AARCH64_GOT_LD_PREL19:
+ case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
+ case BFD_RELOC_AARCH64_GOT_LD_PREL19:
if (globals->root.sgot == NULL)
BFD_ASSERT (h != NULL);
@@ -4001,10 +4039,11 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
}
break;
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSGD_ADD_LO12_NC:
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
if (globals->root.sgot == NULL)
return bfd_reloc_notsupported;
@@ -4017,24 +4056,25 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
*unresolved_reloc_p = FALSE;
break;
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
value = aarch64_resolve_relocation (r_type, place, value,
signed_addend - tpoff_base (info), weak_undef_p);
*unresolved_reloc_p = FALSE;
break;
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_ADD:
- case R_AARCH64_TLSDESC_LDR:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD:
+ case BFD_RELOC_AARCH64_TLSDESC_LDR:
if (globals->root.sgot == NULL)
return bfd_reloc_notsupported;
@@ -4081,10 +4121,10 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
BFD_ASSERT (globals && input_bfd && contents && rel);
- switch (r_type)
+ switch (elfNN_aarch64_bfd_reloc_from_type (r_type))
{
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
if (is_local)
{
/* GD->LE relaxation:
@@ -4106,7 +4146,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
return bfd_reloc_continue;
}
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
if (is_local)
{
/* GD->LE relaxation:
@@ -4126,7 +4166,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
return bfd_reloc_continue;
}
- case R_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
if (is_local)
{
/* GD->LE relaxation
@@ -4153,7 +4193,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
NOP => add x0, x1, x0
*/
- BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == R_AARCH64_CALL26);
+ BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
/* Remove the relocation on the BL instruction. */
rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
@@ -4168,8 +4208,8 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
return bfd_reloc_continue;
}
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_CALL:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_CALL:
/* GD->IE/LE relaxation:
add x0, x0, #:tlsdesc_lo12:var => nop
blr xd => nop
@@ -4177,7 +4217,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
bfd_putl32 (INSN_NOP, contents + rel->r_offset);
return bfd_reloc_ok;
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
/* IE->LE relaxation:
adrp xd, :gottprel:var => movz xd, :tprel_g1:var
*/
@@ -4188,7 +4228,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
}
return bfd_reloc_continue;
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
/* IE->LE relaxation:
ldr xd, [xm, #:gottprel_lo12:var] => movk xd, :tprel_g0_nc:var
*/
@@ -4237,7 +4277,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
for (; rel < relend; rel++)
{
unsigned int r_type;
- unsigned int relaxed_r_type;
+ bfd_reloc_code_real_type bfd_r_type;
+ bfd_reloc_code_real_type relaxed_bfd_r_type;
reloc_howto_type *howto;
unsigned long r_symndx;
Elf_Internal_Sym *sym;
@@ -4263,6 +4304,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
input_bfd, input_section, r_type);
return FALSE;
}
+ bfd_r_type = elfNN_aarch64_bfd_reloc_from_howto (howto);
h = NULL;
sym = NULL;
@@ -4333,7 +4375,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
&& (h == NULL
|| h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
- && IS_AARCH64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
+ && IS_AARCH64_TLS_RELOC (bfd_r_type) != (sym_type == STT_TLS))
{
(*_bfd_error_handler)
((sym_type == STT_TLS
@@ -4343,19 +4385,19 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
input_section, (long) rel->r_offset, howto->name, name);
}
-
/* We relax only if we can see that there can be a valid transition
from a reloc type to another.
We call elfNN_aarch64_final_link_relocate unless we're completely
done, i.e., the relaxation produced the final output we want. */
- relaxed_r_type = aarch64_tls_transition (input_bfd, info, r_type,
- h, r_symndx);
- if (relaxed_r_type != r_type)
+ relaxed_bfd_r_type = aarch64_tls_transition (input_bfd, info, r_type,
+ h, r_symndx);
+ if (relaxed_bfd_r_type != bfd_r_type)
{
- r_type = relaxed_r_type;
- howto = elfNN_aarch64_howto_from_type (r_type);
-
+ bfd_r_type = relaxed_bfd_r_type;
+ howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type);
+ BFD_ASSERT (howto != NULL);
+ r_type = howto->type;
r = elfNN_aarch64_tls_relax (globals, input_bfd, contents, rel, h);
unresolved_reloc = 0;
}
@@ -4380,10 +4422,10 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
h, &unresolved_reloc,
save_addend, &addend);
- switch (r_type)
+ switch (elfNN_aarch64_bfd_reloc_from_type (r_type))
{
- case R_AARCH64_TLSGD_ADR_PAGE21:
- case R_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
{
bfd_boolean need_relocs = FALSE;
@@ -4405,7 +4447,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
if (need_relocs)
{
Elf_Internal_Rela rela;
- rela.r_info = ELFNN_R_INFO (indx, R_AARCH64_TLS_DTPMOD64);
+ rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPMOD));
rela.r_addend = 0;
rela.r_offset = globals->root.sgot->output_section->vma +
globals->root.sgot->output_offset + off;
@@ -4429,7 +4471,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
relocation to fixup the tls offset at load
time. */
rela.r_info =
- ELFNN_R_INFO (indx, R_AARCH64_TLS_DTPREL64);
+ ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPREL));
rela.r_addend = 0;
rela.r_offset =
(globals->root.sgot->output_section->vma
@@ -4459,8 +4501,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
}
break;
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
{
bfd_boolean need_relocs = FALSE;
@@ -4489,7 +4531,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
else
rela.r_addend = 0;
- rela.r_info = ELFNN_R_INFO (indx, R_AARCH64_TLS_TPREL64);
+ rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_TPREL));
rela.r_offset = globals->root.sgot->output_section->vma +
globals->root.sgot->output_offset + off;
@@ -4510,19 +4552,19 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
}
break;
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
break;
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
if (! symbol_tlsdesc_got_offset_mark_p (input_bfd, h, r_symndx))
{
bfd_boolean need_relocs = FALSE;
@@ -4540,7 +4582,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
{
bfd_byte *loc;
Elf_Internal_Rela rela;
- rela.r_info = ELFNN_R_INFO (indx, R_AARCH64_TLSDESC);
+ rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLSDESC));
+
rela.r_addend = 0;
rela.r_offset = (globals->root.sgotplt->output_section->vma
+ globals->root.sgotplt->output_offset
@@ -4575,6 +4618,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
symbol_tlsdesc_got_offset_mark (input_bfd, h, r_symndx);
}
break;
+ default:
+ break;
}
if (!save_addend)
@@ -4894,28 +4939,30 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd,
}
r_type = ELFNN_R_TYPE (rel->r_info);
- r_type = aarch64_tls_transition (abfd,info, r_type, h ,r_symndx);
- switch (r_type)
+ switch (aarch64_tls_transition (abfd,info, r_type, h ,r_symndx))
{
- 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:
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
- if (h != NULL)
+ case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_GOT_LD_PREL19:
+ case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
+ if (h != NULL)
{
if (h->got.refcount > 0)
h->got.refcount -= 1;
@@ -4927,9 +4974,9 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd,
}
break;
- case R_AARCH64_ADR_PREL_PG_HI21_NC:
- case R_AARCH64_ADR_PREL_PG_HI21:
- case R_AARCH64_ADR_PREL_LO21:
+ case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
if (h != NULL && info->executable)
{
if (h->plt.refcount > 0)
@@ -4937,10 +4984,10 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd,
}
break;
- case R_AARCH64_CALL26:
- case R_AARCH64_JUMP26:
- /* If this is a local symbol then we resolve it
- directly without creating a PLT entry. */
+ case BFD_RELOC_AARCH64_CALL26:
+ case BFD_RELOC_AARCH64_JUMP26:
+ /* If this is a local symbol then we resolve it
+ directly without creating a PLT entry. */
if (h == NULL)
continue;
@@ -4948,7 +4995,7 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd,
h->plt.refcount -= 1;
break;
- case R_AARCH64_ABS64:
+ case BFD_RELOC_AARCH64_NN:
if (h != NULL && info->executable)
{
if (h->plt.refcount > 0)
@@ -5114,6 +5161,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
struct elf_link_hash_entry *h;
unsigned long r_symndx;
unsigned int r_type;
+ bfd_reloc_code_real_type bfd_r_type;
r_symndx = ELFNN_R_SYM (rel->r_info);
r_type = ELFNN_R_TYPE (rel->r_info);
@@ -5140,11 +5188,11 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
}
/* Could be done earlier, if h were already available. */
- r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx);
+ bfd_r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx);
- switch (r_type)
+ switch (bfd_r_type)
{
- case R_AARCH64_ABS64:
+ case BFD_RELOC_AARCH64_NN:
/* We don't need to handle relocs into sections not going into
the "real" output. */
@@ -5237,29 +5285,32 @@ elfNN_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:
- case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
- case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12:
- case R_AARCH64_TLSLE_ADD_TPREL_HI12:
- case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G2:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1:
- case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0:
- case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
- case R_AARCH64_TLSDESC_ADR_PAGE21:
- case R_AARCH64_TLSDESC_ADD_LO12_NC:
- case R_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
+ case BFD_RELOC_AARCH64_GOT_LD_PREL19:
+ case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
+ case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
+ case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+ case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
+ case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
+ case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
{
unsigned got_type;
unsigned old_got_type;
- got_type = aarch64_reloc_got_type (r_type);
+ got_type = aarch64_reloc_got_type (bfd_r_type);
if (h)
{
@@ -5322,9 +5373,9 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
break;
}
- case R_AARCH64_ADR_PREL_PG_HI21_NC:
- case R_AARCH64_ADR_PREL_PG_HI21:
- case R_AARCH64_ADR_PREL_LO21:
+ case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
+ case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
+ case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
if (h != NULL && info->executable)
{
/* If this reloc is in a read-only section, we might
@@ -5342,8 +5393,8 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
relocations in shared libraries. */
break;
- case R_AARCH64_CALL26:
- case R_AARCH64_JUMP26:
+ case BFD_RELOC_AARCH64_CALL26:
+ case BFD_RELOC_AARCH64_JUMP26:
/* If this is a local symbol then we resolve it
directly without creating a PLT entry. */
if (h == NULL)
@@ -5352,8 +5403,12 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
h->needs_plt = 1;
h->plt.refcount += 1;
break;
+
+ default:
+ break;
}
}
+
return TRUE;
}
@@ -5511,11 +5566,11 @@ elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSE
{
switch ((int) ELFNN_R_TYPE (rela->r_info))
{
- case R_AARCH64_RELATIVE:
+ case AARCH64_R (RELATIVE):
return reloc_class_relative;
- case R_AARCH64_JUMP_SLOT:
+ case AARCH64_R (JUMP_SLOT):
return reloc_class_plt;
- case R_AARCH64_COPY:
+ case AARCH64_R (COPY):
return reloc_class_copy;
default:
return reloc_class_normal;
@@ -6496,8 +6551,6 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
#undef add_dynamic_entry
return TRUE;
-
-
}
static inline void
@@ -6539,18 +6592,18 @@ elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
/* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
- elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADR_PREL_PG_HI21,
+ elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADR_PREL_PG_HI21),
plt_entry,
PG (gotplt_entry_address) -
PG (plt_entry_address));
/* Fill in the lo12 bits for the load from the pltgot. */
- elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_LDST64_ABS_LO12_NC,
+ elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (LDSTNN_ABS_LO12_NC),
plt_entry + 4,
PG_OFFSET (gotplt_entry_address));
/* Fill in the the lo12 bits for the add from the pltgot entry. */
- elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADD_ABS_LO12_NC,
+ elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADD_ABS_LO12_NC),
plt_entry + 8,
PG_OFFSET (gotplt_entry_address));
@@ -6669,7 +6722,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
return FALSE;
BFD_ASSERT ((h->got.offset & 1) != 0);
- rela.r_info = ELFNN_R_INFO (0, R_AARCH64_RELATIVE);
+ rela.r_info = ELFNN_R_INFO (0, AARCH64_R (RELATIVE));
rela.r_addend = (h->root.u.def.value
+ h->root.u.def.section->output_section->vma
+ h->root.u.def.section->output_offset);
@@ -6679,7 +6732,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
BFD_ASSERT ((h->got.offset & 1) == 0);
bfd_put_NN (output_bfd, (bfd_vma) 0,
htab->root.sgot->contents + h->got.offset);
- rela.r_info = ELFNN_R_INFO (h->dynindx, R_AARCH64_GLOB_DAT);
+ rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (GLOB_DAT));
rela.r_addend = 0;
}
@@ -6704,7 +6757,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
rela.r_offset = (h->root.u.def.value
+ h->root.u.def.section->output_section->vma
+ h->root.u.def.section->output_offset);
- rela.r_info = ELFNN_R_INFO (h->dynindx, R_AARCH64_COPY);
+ rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY));
rela.r_addend = 0;
loc = htab->srelbss->contents;
loc += htab->srelbss->reloc_count++ * RELOC_SIZE (htab);
@@ -6758,15 +6811,15 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
/* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
- elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADR_PREL_PG_HI21,
+ elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADR_PREL_PG_HI21),
htab->root.splt->contents + 4,
PG (plt_got_base + 16) - PG (plt_base + 4));
- elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_LDST64_ABS_LO12_NC,
+ elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (LDSTNN_ABS_LO12_NC),
htab->root.splt->contents + 8,
PG_OFFSET (plt_got_base + 16));
- elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADD_ABS_LO12_NC,
+ elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADD_ABS_LO12_NC),
htab->root.splt->contents + 12,
PG_OFFSET (plt_got_base + 16));
}