This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Thumb32 assembler (63/69)
- From: Zack Weinberg <zack at codesourcery dot com>
- To: binutils <binutils at sourceware dot org>
- Date: Tue, 26 Apr 2005 03:02:09 -0700
- Subject: Thumb32 assembler (63/69)
Changing focus again, this patch imports the set of R_* constants from
the latest AAELF specification, and adds howto table entries for most
of them. (I didn't bother with the group relocations.) Note that I'm
not sure what a lot of these are for, especially the Thumb32
relocations (I haven't managed to get my hands on a version of AAELF
that specifies them fully), and that I'm pretty sure the GNU behavior
doesn't match AAELF for several of them.
include/elf:
* arm.h: Import full set of relocation names from latest AAELF.
Make the primary name of all relocations be the one AAELF
specifies. Provide aliases under the traditional names. Kill
FIRST_INVALID_RELOC_* and LAST_INVALID_RELOC_*.
bfd:
* elf32-arm.c (elf32_arm_howto_table): Rename
elf32_arm_howto_table_1. Replace entry for R_ARM_AMP_VCALL9 with
entry for R_ARM_BREL_ADJ (neither is used). Add entries for
R_ARM_THM_JUMP24, R_ARM_BASE_ABS, R_ARM_MOVW_ABS_NC,
R_ARM_MOVT_ABS, R_ARM_MOVW_PREL_NC, R_ARM_MOVT_PREL,
R_ARM_THM_MOVW_ABS_NC, R_ARM_THM_MOVT_ABS, R_ARM_THM_MOVW_PREL_NC,
R_ARM_THM_MOVT_PREL, R_ARM_THM_JUMP19, R_ARM_THM_JUMP6,
R_ARM_THM_ALU_PREL_11_0, R_ARM_THM_PC12, R_ARM_ABS32_NOI,
R_ARM_REL32_NOI.
(elf32_arm_howto_table_2): New howto table, containing entries for
R_ARM_MOVW_BREL_NC, R_ARM_MOVT_BREL, R_ARM_MOVW_BREL,
R_ARM_THM_MOVW_BREL_NC, R_ARM_THM_MOVT_BREL, R_ARM_THM_MOVW_BREL,
R_ARM_PLT32_ABS, R_ARM_GOT_ABS, R_ARM_GOT_PREL, R_ARM_GOT_BREL12,
R_ARM_GOTOFF12, R_ARM_GOTRELAX (stub), R_ARM_GNU_VTENTRY,
R_ARM_GNU_VTINHERIT, R_ARM_THM_JUMP11, R_ARM_THM_JUMP8,
R_ARM_TLS_GD32, R_ARM_TLS_LDM32, R_ARM_TLS_LDO32, R_ARM_TLS_IE32,
R_ARM_TLS_LE32, R_ARM_TLS_LDO12, R_ARM_TLS_LE12, R_ARM_TLS_IE12GP.
(elf32_arm_r_howto): Rename elf32_arm_howto_table_3.
(elf32_arm_got_prel, elf32_arm_vtinherit_howto)
(elf32_arm_vtentry_howto, elf32_arm_thm_pc11_howto)
(elf32_arm_thm_pc9_howto, elf32_arm_tls_gd32_howto)
(elf32_arm_tls_ldo32_howto, elf32_arm_tls_ldm32_howto)
(elf32_arm_tls_ie32_howto, elf32_arm_tls_le32_howto): Delete.
(R_ARM_THM_PC22): Replace with R_ARM_THM_CALL throughout.
(R_ARM_THM_PC11): Replace with R_ARM_THM_JUMP11 throughout.
(R_ARM_THM_PC9): Replace with R_ARM_THM_JUMP8 throughout.
(R_ARM_GOTOFF): Replace with R_ARM_GOTOFF32 throughout.
(elf32_arm_howto_from_type): Update to match above changes.
(elf32_arm_reloc_map): Add entries for BFD_RELOC_THUMB_PCREL_BRANCH12,
BFD_RELOC_THUMB_PCREL_BRANCH9, BFD_RELOC_VTABLE_INHERIT, and
BFD_RELOC_VTABLE_ENTRY.
(elf32_arm_reloc_type_lookup): Use elf32_arm_howto_from_type.
Expect all valid BFD_RELOC_* codes to appear in elf32_arm_reloc_map.
(elf32_arm_final_link_relocate): Remove all case entries redundant
with the default.
gas/testsuite:
* gas/arm/pic.d: Expect R_ARM_GOTOFF32, not R_ARM_GOTOFF.
===================================================================
Index: gas/testsuite/gas/arm/pic.d
--- gas/testsuite/gas/arm/pic.d (revision 73)
+++ gas/testsuite/gas/arm/pic.d (revision 74)
@@ -13,7 +13,7 @@
\.\.\.
8: R_ARM_ABS32 sym
c: R_ARM_GOT32 sym
- 10: R_ARM_GOTOFF sym
+ 10: R_ARM_GOTOFF32 sym
14: R_ARM_GOTPC _GLOBAL_OFFSET_TABLE_
18: R_ARM_TARGET1 foo2
1c: R_ARM_SBREL32 foo3
===================================================================
Index: include/elf/arm.h
--- include/elf/arm.h (revision 73)
+++ include/elf/arm.h (revision 74)
@@ -38,7 +38,7 @@
#define EF_ARM_MAVERICK_FLOAT 0x800
/* Frame unwind information */
-#define PT_ARM_EXIDX (PT_LOPROC + 1)
+#define PT_ARM_EXIDX (PT_LOPROC + 1)
/* Other constants defined in the ARM ELF spec. version B-01. */
#define EF_ARM_SYMSARESORTED 0x04 /* NB conflicts with EF_INTERWORK */
@@ -84,93 +84,159 @@
/* Relocation types. */
START_RELOC_NUMBERS (elf_arm_reloc_type)
- RELOC_NUMBER (R_ARM_NONE, 0)
- RELOC_NUMBER (R_ARM_PC24, 1)
- RELOC_NUMBER (R_ARM_ABS32, 2)
- RELOC_NUMBER (R_ARM_REL32, 3)
-#ifdef OLD_ARM_ABI
- RELOC_NUMBER (R_ARM_ABS8, 4)
- RELOC_NUMBER (R_ARM_ABS16, 5)
- RELOC_NUMBER (R_ARM_ABS12, 6)
- RELOC_NUMBER (R_ARM_THM_ABS5, 7)
- RELOC_NUMBER (R_ARM_THM_PC22, 8)
- RELOC_NUMBER (R_ARM_SBREL32, 9)
- RELOC_NUMBER (R_ARM_AMP_VCALL9, 10)
- RELOC_NUMBER (R_ARM_THM_PC11, 11) /* Cygnus extension to abi: Thumb unconditional branch. */
- RELOC_NUMBER (R_ARM_THM_PC9, 12) /* Cygnus extension to abi: Thumb conditional branch. */
- RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 13)
- RELOC_NUMBER (R_ARM_GNU_VTENTRY, 14)
-#else /* not OLD_ARM_ABI */
- RELOC_NUMBER (R_ARM_PC13, 4)
- RELOC_NUMBER (R_ARM_ABS16, 5)
- RELOC_NUMBER (R_ARM_ABS12, 6)
- RELOC_NUMBER (R_ARM_THM_ABS5, 7)
- RELOC_NUMBER (R_ARM_ABS8, 8)
- RELOC_NUMBER (R_ARM_SBREL32, 9)
- RELOC_NUMBER (R_ARM_THM_PC22, 10)
- RELOC_NUMBER (R_ARM_THM_PC8, 11)
- RELOC_NUMBER (R_ARM_AMP_VCALL9, 12)
- RELOC_NUMBER (R_ARM_SWI24, 13)
- RELOC_NUMBER (R_ARM_THM_SWI8, 14)
- RELOC_NUMBER (R_ARM_XPC25, 15)
- RELOC_NUMBER (R_ARM_THM_XPC22, 16)
- RELOC_NUMBER (R_ARM_TLS_DTPMOD32, 17)
- RELOC_NUMBER (R_ARM_TLS_DTPOFF32, 18)
- RELOC_NUMBER (R_ARM_TLS_TPOFF32, 19)
-#endif /* not OLD_ARM_ABI */
- RELOC_NUMBER (R_ARM_COPY, 20) /* Copy symbol at runtime. */
- RELOC_NUMBER (R_ARM_GLOB_DAT, 21) /* Create GOT entry. */
- RELOC_NUMBER (R_ARM_JUMP_SLOT, 22) /* Create PLT entry. */
- RELOC_NUMBER (R_ARM_RELATIVE, 23) /* Adjust by program base. */
- RELOC_NUMBER (R_ARM_GOTOFF, 24) /* 32 bit offset to GOT. */
- RELOC_NUMBER (R_ARM_GOTPC, 25) /* 32 bit PC relative offset to GOT. */
- RELOC_NUMBER (R_ARM_GOT32, 26) /* 32 bit GOT entry. */
- RELOC_NUMBER (R_ARM_PLT32, 27) /* 32 bit PLT address. */
-#ifdef OLD_ARM_ABI
- FAKE_RELOC (FIRST_INVALID_RELOC, 28)
- FAKE_RELOC (LAST_INVALID_RELOC, 249)
-#else /* not OLD_ARM_ABI */
- RELOC_NUMBER (R_ARM_CALL, 28)
- RELOC_NUMBER (R_ARM_JUMP24, 29)
- FAKE_RELOC (FIRST_INVALID_RELOC1, 30)
- FAKE_RELOC (LAST_INVALID_RELOC1, 31)
- RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32)
- RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33)
- RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34)
- RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35)
- RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36)
- RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37)
- RELOC_NUMBER (R_ARM_TARGET1, 38)
- RELOC_NUMBER (R_ARM_ROSEGREL32, 39)
- RELOC_NUMBER (R_ARM_V4BX, 40)
- RELOC_NUMBER (R_ARM_TARGET2, 41)
- RELOC_NUMBER (R_ARM_PREL31, 42)
- FAKE_RELOC (FIRST_INVALID_RELOC2, 43)
- FAKE_RELOC (LAST_INVALID_RELOC2, 94)
- RELOC_NUMBER (R_ARM_GOT_ABS, 95)
- RELOC_NUMBER (R_ARM_GOT_PREL, 96)
- RELOC_NUMBER (R_ARM_GOT_BREL12, 97)
- RELOC_NUMBER (R_ARM_GOTOFF12, 98)
- RELOC_NUMBER (R_ARM_GOTRELAX, 99)
- RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100)
- RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101)
- RELOC_NUMBER (R_ARM_THM_PC11, 102) /* Cygnus extension to abi: Thumb unconditional branch. */
- RELOC_NUMBER (R_ARM_THM_PC9, 103) /* Cygnus extension to abi: Thumb conditional branch. */
- RELOC_NUMBER (R_ARM_TLS_GD32, 104)
- RELOC_NUMBER (R_ARM_TLS_LDM32, 105)
- RELOC_NUMBER (R_ARM_TLS_LDO32, 106)
- RELOC_NUMBER (R_ARM_TLS_IE32, 107)
- RELOC_NUMBER (R_ARM_TLS_LE32, 108)
- FAKE_RELOC (FIRST_INVALID_RELOC3, 109)
- FAKE_RELOC (LAST_INVALID_RELOC3, 248)
- RELOC_NUMBER (R_ARM_RXPC25, 249)
-#endif /* not OLD_ARM_ABI */
- RELOC_NUMBER (R_ARM_RSBREL32, 250)
- RELOC_NUMBER (R_ARM_THM_RPC22, 251)
- RELOC_NUMBER (R_ARM_RREL32, 252)
- RELOC_NUMBER (R_ARM_RABS32, 253)
- RELOC_NUMBER (R_ARM_RPC24, 254)
- RELOC_NUMBER (R_ARM_RBASE, 255)
+/* AAELF official names and numbers. */
+ RELOC_NUMBER (R_ARM_NONE, 0)
+ RELOC_NUMBER (R_ARM_PC24, 1) /* deprecated */
+ RELOC_NUMBER (R_ARM_ABS32, 2)
+ RELOC_NUMBER (R_ARM_REL32, 3)
+#ifndef OLD_ARM_ABI
+ RELOC_NUMBER (R_ARM_LDR_PC_G0, 4)
+ RELOC_NUMBER (R_ARM_ABS16, 5)
+ RELOC_NUMBER (R_ARM_ABS12, 6)
+ RELOC_NUMBER (R_ARM_THM_ABS5, 7)
+ RELOC_NUMBER (R_ARM_ABS8, 8)
+ RELOC_NUMBER (R_ARM_SBREL32, 9)
+ RELOC_NUMBER (R_ARM_THM_CALL, 10)
+ RELOC_NUMBER (R_ARM_THM_PC8, 11)
+ RELOC_NUMBER (R_ARM_BREL_ADJ, 12)
+ RELOC_NUMBER (R_ARM_SWI24, 13) /* obsolete */
+ RELOC_NUMBER (R_ARM_THM_SWI8, 14) /* obsolete */
+#else
+ RELOC_NUMBER (R_ARM_ABS8, 4)
+ RELOC_NUMBER (R_ARM_ABS16, 5)
+ RELOC_NUMBER (R_ARM_ABS12, 6)
+ RELOC_NUMBER (R_ARM_THM_ABS5, 7)
+ RELOC_NUMBER (R_ARM_THM_CALL, 8)
+ RELOC_NUMBER (R_ARM_SBREL32, 9)
+ RELOC_NUMBER (R_ARM_BREL_ADJ, 10)
+ RELOC_NUMBER (R_ARM_THM_JUMP11, 11)
+ RELOC_NUMBER (R_ARM_THM_JUMP8, 12)
+ RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 13)
+ RELOC_NUMBER (R_ARM_GNU_VTENTRY, 14)
+#endif
+ RELOC_NUMBER (R_ARM_XPC25, 15) /* obsolete */
+ RELOC_NUMBER (R_ARM_THM_XPC22, 16) /* obsolete */
+ RELOC_NUMBER (R_ARM_TLS_DTPMOD32, 17)
+ RELOC_NUMBER (R_ARM_TLS_DTPOFF32, 18)
+ RELOC_NUMBER (R_ARM_TLS_TPOFF32, 19)
+ RELOC_NUMBER (R_ARM_COPY, 20) /* Copy symbol at runtime. */
+ RELOC_NUMBER (R_ARM_GLOB_DAT, 21) /* Create GOT entry. */
+ RELOC_NUMBER (R_ARM_JUMP_SLOT, 22) /* Create PLT entry. */
+ RELOC_NUMBER (R_ARM_RELATIVE, 23) /* Adjust by program base. */
+ RELOC_NUMBER (R_ARM_GOTOFF32, 24) /* 32 bit offset to GOT. */
+ RELOC_NUMBER (R_ARM_BASE_PREL, 25) /* 32 bit PC relative offset to GOT. */
+ RELOC_NUMBER (R_ARM_GOT_BREL, 26) /* 32 bit GOT entry. */
+ RELOC_NUMBER (R_ARM_PLT32, 27) /* deprecated - 32 bit PLT address. */
+ RELOC_NUMBER (R_ARM_CALL, 28)
+ RELOC_NUMBER (R_ARM_JUMP24, 29)
+ RELOC_NUMBER (R_ARM_THM_JUMP24, 30)
+ RELOC_NUMBER (R_ARM_BASE_ABS, 31)
+ RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32) /* obsolete */
+ RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33) /* obsolete */
+ RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34) /* obsolete */
+ RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35) /* deprecated, should have _NC suffix */
+ RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36) /* deprecated, should have _NC suffix */
+ RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37) /* deprecated, should have _CK suffix */
+ RELOC_NUMBER (R_ARM_TARGET1, 38)
+ RELOC_NUMBER (R_ARM_SBREL31, 39) /* deprecated */
+ RELOC_NUMBER (R_ARM_V4BX, 40)
+ RELOC_NUMBER (R_ARM_TARGET2, 41)
+ RELOC_NUMBER (R_ARM_PREL31, 42)
+ RELOC_NUMBER (R_ARM_MOVW_ABS_NC, 43)
+ RELOC_NUMBER (R_ARM_MOVT_ABS, 44)
+ RELOC_NUMBER (R_ARM_MOVW_PREL_NC, 45)
+ RELOC_NUMBER (R_ARM_MOVT_PREL, 46)
+ RELOC_NUMBER (R_ARM_THM_MOVW_ABS_NC, 47)
+ RELOC_NUMBER (R_ARM_THM_MOVT_ABS, 48)
+ RELOC_NUMBER (R_ARM_THM_MOVW_PREL_NC, 49)
+ RELOC_NUMBER (R_ARM_THM_MOVT_PREL, 50)
+ RELOC_NUMBER (R_ARM_THM_JUMP19, 51)
+ RELOC_NUMBER (R_ARM_THM_JUMP6, 52)
+ RELOC_NUMBER (R_ARM_THM_ALU_PREL_11_0, 53)
+ RELOC_NUMBER (R_ARM_THM_PC12, 54)
+ RELOC_NUMBER (R_ARM_ABS32_NOI, 55)
+ RELOC_NUMBER (R_ARM_REL32_NOI, 56)
+ RELOC_NUMBER (R_ARM_ALU_PC_G0_NC, 57)
+ RELOC_NUMBER (R_ARM_ALU_PC_G0, 58)
+ RELOC_NUMBER (R_ARM_ALU_PC_G1_NC, 59)
+ RELOC_NUMBER (R_ARM_ALU_PC_G1, 60)
+ RELOC_NUMBER (R_ARM_ALU_PC_G2, 61)
+ RELOC_NUMBER (R_ARM_LDR_PC_G1, 62)
+ RELOC_NUMBER (R_ARM_LDR_PC_G2, 63)
+ RELOC_NUMBER (R_ARM_LDRS_PC_G0, 64)
+ RELOC_NUMBER (R_ARM_LDRS_PC_G1, 65)
+ RELOC_NUMBER (R_ARM_LDRS_PC_G2, 66)
+ RELOC_NUMBER (R_ARM_LDC_PC_G0, 67)
+ RELOC_NUMBER (R_ARM_LDC_PC_G1, 68)
+ RELOC_NUMBER (R_ARM_LDC_PC_G2, 69)
+ RELOC_NUMBER (R_ARM_ALU_SB_G0_NC, 70)
+ RELOC_NUMBER (R_ARM_ALU_SB_G0, 71)
+ RELOC_NUMBER (R_ARM_ALU_SB_G1_NC, 72)
+ RELOC_NUMBER (R_ARM_ALU_SB_G1, 73)
+ RELOC_NUMBER (R_ARM_ALU_SB_G2, 74)
+ RELOC_NUMBER (R_ARM_LDR_SB_G0, 75)
+ RELOC_NUMBER (R_ARM_LDR_SB_G1, 76)
+ RELOC_NUMBER (R_ARM_LDR_SB_G2, 77)
+ RELOC_NUMBER (R_ARM_LDRS_SB_G0, 78)
+ RELOC_NUMBER (R_ARM_LDRS_SB_G1, 79)
+ RELOC_NUMBER (R_ARM_LDRS_SB_G2, 80)
+ RELOC_NUMBER (R_ARM_LDC_G0, 81)
+ RELOC_NUMBER (R_ARM_LDC_G1, 82)
+ RELOC_NUMBER (R_ARM_LDC_G2, 83)
+ RELOC_NUMBER (R_ARM_MOVW_BREL_NC, 84)
+ RELOC_NUMBER (R_ARM_MOVT_BREL, 85)
+ RELOC_NUMBER (R_ARM_MOVW_BREL, 86)
+ RELOC_NUMBER (R_ARM_THM_MOVW_BREL_NC, 87)
+ RELOC_NUMBER (R_ARM_THM_MOVT_BREL, 88)
+ RELOC_NUMBER (R_ARM_THM_MOVW_BREL, 89)
+ /* 90-93 unallocated */
+ RELOC_NUMBER (R_ARM_PLT32_ABS, 94)
+ RELOC_NUMBER (R_ARM_GOT_ABS, 95)
+ RELOC_NUMBER (R_ARM_GOT_PREL, 96)
+ RELOC_NUMBER (R_ARM_GOT_BREL12, 97)
+ RELOC_NUMBER (R_ARM_GOTOFF12, 98)
+ RELOC_NUMBER (R_ARM_GOTRELAX, 99)
+#ifndef OLD_ARM_ABI
+ RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100) /* deprecated - old C++ abi */
+ RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101) /* deprecated - old C++ abi */
+ RELOC_NUMBER (R_ARM_THM_JUMP11, 102)
+ RELOC_NUMBER (R_ARM_THM_JUMP8, 103)
+#endif
+ RELOC_NUMBER (R_ARM_TLS_GD32, 104)
+ RELOC_NUMBER (R_ARM_TLS_LDM32, 105)
+ RELOC_NUMBER (R_ARM_TLS_LDO32, 106)
+ RELOC_NUMBER (R_ARM_TLS_IE32, 107)
+ RELOC_NUMBER (R_ARM_TLS_LE32, 108)
+ RELOC_NUMBER (R_ARM_TLS_LDO12, 109)
+ RELOC_NUMBER (R_ARM_TLS_LE12, 110)
+ RELOC_NUMBER (R_ARM_TLS_IE12GP, 111)
+ /* 112 - 127 private range */
+ RELOC_NUMBER (R_ARM_ME_TOO, 128) /* obsolete */
+
+ /* Extensions? R=read-only? */
+ RELOC_NUMBER (R_ARM_RXPC25, 249)
+ RELOC_NUMBER (R_ARM_RSBREL32, 250)
+ RELOC_NUMBER (R_ARM_THM_RPC22, 251)
+ RELOC_NUMBER (R_ARM_RREL32, 252)
+ RELOC_NUMBER (R_ARM_RABS32, 253)
+ RELOC_NUMBER (R_ARM_RPC24, 254)
+ RELOC_NUMBER (R_ARM_RBASE, 255)
+
+ /* Unofficial names for some of the relocs. */
+ FAKE_RELOC (R_ARM_GOTOFF, R_ARM_GOTOFF32) /* 32 bit offset to GOT. */
+ FAKE_RELOC (R_ARM_THM_PC22, R_ARM_THM_CALL)
+ FAKE_RELOC (R_ARM_THM_PC11, R_ARM_THM_JUMP11)
+ FAKE_RELOC (R_ARM_THM_PC9, R_ARM_THM_JUMP8)
+
+ /* Relocs with both a different name, and (apparently) different meaning in
+ GNU usage. */
+ FAKE_RELOC (R_ARM_GOTPC, R_ARM_BASE_PREL) /* 32 bit PC relative offset to GOT. */
+ FAKE_RELOC (R_ARM_GOT32, R_ARM_GOT_BREL) /* 32 bit GOT entry. */
+ FAKE_RELOC (R_ARM_ROSEGREL32, R_ARM_SBREL31) /* ??? */
+ FAKE_RELOC (R_ARM_AMP_VCALL9, R_ARM_BREL_ADJ) /* Thumb-something. Not used. */
+#ifndef OLD_ARM_ABI
+ FAKE_RELOC (R_ARM_PC13, R_ARM_LDR_PC_G0) /* Unclear whether meaning is different. */
+#endif
END_RELOC_NUMBERS (R_ARM_max)
/* The name of the note section used to identify arm variants. */
===================================================================
Index: bfd/elf32-arm.c
--- bfd/elf32-arm.c (revision 73)
+++ bfd/elf32-arm.c (revision 74)
@@ -45,7 +45,7 @@
R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
in that slot. */
-static reloc_howto_type elf32_arm_howto_table[] =
+static reloc_howto_type elf32_arm_howto_table_1[] =
{
/* No relocation */
HOWTO (R_ARM_NONE, /* type */
@@ -106,7 +106,7 @@
0xffffffff, /* dst_mask */
TRUE), /* pcrel_offset */
- /* 8 bit absolute */
+ /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
HOWTO (R_ARM_PC13, /* type */
0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */
@@ -194,7 +194,8 @@
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_ARM_THM_PC22, /* type */
+ /* FIXME: Has two more bits of offset in Thumb32. */
+ HOWTO (R_ARM_THM_CALL, /* type */
1, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
23, /* bitsize */
@@ -202,7 +203,7 @@
0, /* bitpos */
complain_overflow_signed,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_THM_PC22", /* name */
+ "R_ARM_THM_CALL", /* name */
FALSE, /* partial_inplace */
0x07ff07ff, /* src_mask */
0x07ff07ff, /* dst_mask */
@@ -222,19 +223,19 @@
0x000000ff, /* dst_mask */
TRUE), /* pcrel_offset */
- HOWTO (R_ARM_AMP_VCALL9, /* type */
+ HOWTO (R_ARM_BREL_ADJ, /* type */
1, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
- 8, /* bitsize */
- TRUE, /* pc_relative */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_AMP_VCALL9", /* name */
+ "R_ARM_BREL_ADJ", /* name */
FALSE, /* partial_inplace */
- 0x000000ff, /* src_mask */
- 0x000000ff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
HOWTO (R_ARM_SWI24, /* type */
0, /* rightshift */
@@ -396,7 +397,7 @@
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
- HOWTO (R_ARM_GOTOFF, /* type */
+ HOWTO (R_ARM_GOTOFF32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
@@ -404,7 +405,7 @@
0, /* bitpos */
complain_overflow_bitfield,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_GOTOFF", /* name */
+ "R_ARM_GOTOFF32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
@@ -480,32 +481,32 @@
0x00ffffff, /* dst_mask */
TRUE), /* pcrel_offset */
- HOWTO (R_ARM_NONE, /* type */
- 0, /* rightshift */
- 0, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
- FALSE, /* pc_relative */
+ HOWTO (R_ARM_THM_JUMP24, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ TRUE, /* pc_relative */
0, /* bitpos */
- complain_overflow_dont,/* complain_on_overflow */
+ complain_overflow_signed,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_unknown_30", /* name */
+ "R_ARM_THM_JUMP24", /* name */
FALSE, /* partial_inplace */
- 0, /* src_mask */
- 0, /* dst_mask */
- FALSE), /* pcrel_offset */
+ 0x07ff2fff, /* src_mask */
+ 0x07ff2fff, /* dst_mask */
+ TRUE), /* pcrel_offset */
- HOWTO (R_ARM_NONE, /* type */
+ HOWTO (R_ARM_BASE_ABS, /* type */
0, /* rightshift */
- 0, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_unknown_31", /* name */
+ "R_ARM_BASE_ABS", /* name */
FALSE, /* partial_inplace */
- 0, /* src_mask */
- 0, /* dst_mask */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
HOWTO (R_ARM_ALU_PCREL7_0, /* type */
@@ -661,39 +662,446 @@
0x7fffffff, /* src_mask */
0x7fffffff, /* dst_mask */
TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_MOVW_ABS_NC, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVW_ABS_NC", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_MOVT_ABS, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVT_ABS", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_MOVW_PREL_NC, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVW_PREL_NC", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_MOVT_PREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVT_PREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVW_ABS_NC, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVW_ABS_NC",/* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVT_ABS, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVT_ABS", /* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVW_PREL_NC",/* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVT_PREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVT_PREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_JUMP19, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_JUMP19", /* name */
+ FALSE, /* partial_inplace */
+ 0x043f2fff, /* src_mask */
+ 0x043f2fff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_JUMP6, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 7, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_unsigned,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_JUMP6", /* name */
+ FALSE, /* partial_inplace */
+ 0x02f8, /* src_mask */
+ 0x02f8, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* These are declared as 13-bit signed relocations because we can
+ address -4095 .. 4095(base) by altering ADDW to SUBW or vice
+ versa. */
+ HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 13, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_ALU_PREL_11_0",/* name */
+ FALSE, /* partial_inplace */
+ 0x040070ff, /* src_mask */
+ 0x040070ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_PC12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 13, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_PC12", /* name */
+ FALSE, /* partial_inplace */
+ 0x040070ff, /* src_mask */
+ 0x040070ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_ABS32_NOI, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_ABS32_NOI", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_REL32_NOI, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_REL32_NOI", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
};
-static reloc_howto_type elf32_arm_tls_gd32_howto =
- HOWTO (R_ARM_TLS_GD32, /* type */
+/* Relocations 57 .. 83 are the "group relocations" which we do not
+ support. */
+
+static reloc_howto_type elf32_arm_howto_table_2[] =
+{
+ HOWTO (R_ARM_MOVW_BREL_NC, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVW_BREL_NC", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_MOVT_BREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVT_BREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_MOVW_BREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_MOVW_BREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVW_BREL_NC",/* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVT_BREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVT_BREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_MOVW_BREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_MOVW_BREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x040f70ff, /* src_mask */
+ 0x040f70ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ EMPTY_HOWTO (90), /* unallocated */
+ EMPTY_HOWTO (91),
+ EMPTY_HOWTO (92),
+ EMPTY_HOWTO (93),
+
+ HOWTO (R_ARM_PLT32_ABS, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_PLT32_ABS", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_GOT_ABS, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_GOT_ABS", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_GOT_PREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_GOT_PREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_GOT_BREL12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_GOT_BREL12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_GOTOFF12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_GOTOFF12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ EMPTY_HOWTO (R_ARM_GOTRELAX), /* reserved for future GOT-load optimizations */
+
+ /* GNU extension to record C++ vtable member usage */
+ HOWTO (R_ARM_GNU_VTENTRY, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
+ 0, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
- complain_overflow_bitfield,/* complain_on_overflow */
- NULL, /* special_function */
- "R_ARM_TLS_GD32", /* name */
- TRUE, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_elf_rel_vtable_reloc_fn, /* special_function */
+ "R_ARM_GNU_VTENTRY", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
-static reloc_howto_type elf32_arm_tls_ldo32_howto =
- HOWTO (R_ARM_TLS_LDO32, /* type */
+ /* GNU extension to record C++ vtable hierarchy */
+ HOWTO (R_ARM_GNU_VTINHERIT, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_ARM_GNU_VTINHERIT", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_JUMP11, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 11, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_JUMP11", /* name */
+ FALSE, /* partial_inplace */
+ 0x000007ff, /* src_mask */
+ 0x000007ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO (R_ARM_THM_JUMP8, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_THM_JUMP8", /* name */
+ FALSE, /* partial_inplace */
+ 0x000000ff, /* src_mask */
+ 0x000000ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* TLS relocations */
+ HOWTO (R_ARM_TLS_GD32, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield,/* complain_on_overflow */
- bfd_elf_generic_reloc, /* special_function */
- "R_ARM_TLS_LDO32", /* name */
+ NULL, /* special_function */
+ "R_ARM_TLS_GD32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ FALSE), /* pcrel_offset */
-static reloc_howto_type elf32_arm_tls_ldm32_howto =
HOWTO (R_ARM_TLS_LDM32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
@@ -706,10 +1114,9 @@
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ FALSE), /* pcrel_offset */
-static reloc_howto_type elf32_arm_tls_le32_howto =
- HOWTO (R_ARM_TLS_LE32, /* type */
+ HOWTO (R_ARM_TLS_LDO32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
@@ -717,13 +1124,12 @@
0, /* bitpos */
complain_overflow_bitfield,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_TLS_LE32", /* name */
+ "R_ARM_TLS_LDO32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ FALSE), /* pcrel_offset */
-static reloc_howto_type elf32_arm_tls_ie32_howto =
HOWTO (R_ARM_TLS_IE32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
@@ -736,90 +1142,72 @@
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ FALSE), /* pcrel_offset */
- /* GNU extension to record C++ vtable hierarchy */
-static reloc_howto_type elf32_arm_vtinherit_howto =
- HOWTO (R_ARM_GNU_VTINHERIT, /* type */
+ HOWTO (R_ARM_TLS_LE32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
+ 32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
- NULL, /* special_function */
- "R_ARM_GNU_VTINHERIT", /* name */
- FALSE, /* partial_inplace */
- 0, /* src_mask */
- 0, /* dst_mask */
- FALSE); /* pcrel_offset */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_ARM_TLS_LE32", /* name */
+ TRUE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
- /* GNU extension to record C++ vtable member usage */
-static reloc_howto_type elf32_arm_vtentry_howto =
- HOWTO (R_ARM_GNU_VTENTRY, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
- _bfd_elf_rel_vtable_reloc_fn, /* special_function */
- "R_ARM_GNU_VTENTRY", /* name */
- FALSE, /* partial_inplace */
- 0, /* src_mask */
- 0, /* dst_mask */
- FALSE); /* pcrel_offset */
-
- /* 12 bit pc relative */
-static reloc_howto_type elf32_arm_thm_pc11_howto =
- HOWTO (R_ARM_THM_PC11, /* type */
- 1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 11, /* bitsize */
- TRUE, /* pc_relative */
+ HOWTO (R_ARM_TLS_LDO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
0, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
+ complain_overflow_bitfield,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_THM_PC11", /* name */
+ "R_ARM_TLS_LDO12", /* name */
FALSE, /* partial_inplace */
- 0x000007ff, /* src_mask */
- 0x000007ff, /* dst_mask */
- TRUE); /* pcrel_offset */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
- /* 12 bit pc relative */
-static reloc_howto_type elf32_arm_thm_pc9_howto =
- HOWTO (R_ARM_THM_PC9, /* type */
- 1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 8, /* bitsize */
- TRUE, /* pc_relative */
+ HOWTO (R_ARM_TLS_LE12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
0, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
+ complain_overflow_bitfield,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_THM_PC9", /* name */
+ "R_ARM_TLS_LE12", /* name */
FALSE, /* partial_inplace */
- 0x000000ff, /* src_mask */
- 0x000000ff, /* dst_mask */
- TRUE); /* pcrel_offset */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
-/* Place relative GOT-indirect. */
-static reloc_howto_type elf32_arm_got_prel =
- HOWTO (R_ARM_GOT_PREL, /* type */
+ HOWTO (R_ARM_TLS_IE12GP, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- TRUE, /* pc_relative */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
+ complain_overflow_bitfield,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
- "R_ARM_GOT_PREL", /* name */
+ "R_ARM_TLS_IE12GP", /* name */
FALSE, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- TRUE); /* pcrel_offset */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+};
-/* Currently unused relocations. */
-static reloc_howto_type elf32_arm_r_howto[4] =
+/* 112-127 private relocations
+ 128 R_ARM_ME_TOO, obsolete
+ 129-255 unallocated in AAELF.
+
+ 249-255 extended, currently unused, relocations: */
+
+static reloc_howto_type elf32_arm_howto_table_3[4] =
{
HOWTO (R_ARM_RREL32, /* type */
0, /* rightshift */
@@ -881,55 +1269,18 @@
static reloc_howto_type *
elf32_arm_howto_from_type (unsigned int r_type)
{
- if (r_type < NUM_ELEM (elf32_arm_howto_table))
- return &elf32_arm_howto_table[r_type];
-
- switch (r_type)
- {
- case R_ARM_GOT_PREL:
- return &elf32_arm_got_prel;
+ if (r_type < NUM_ELEM (elf32_arm_howto_table_1))
+ return &elf32_arm_howto_table_1[r_type];
- case R_ARM_GNU_VTINHERIT:
- return &elf32_arm_vtinherit_howto;
+ if (r_type >= R_ARM_MOVW_BREL_NC
+ && r_type < R_ARM_MOVW_BREL_NC + NUM_ELEM (elf32_arm_howto_table_2))
+ return &elf32_arm_howto_table_2[r_type - R_ARM_MOVW_BREL_NC];
- case R_ARM_GNU_VTENTRY:
- return &elf32_arm_vtentry_howto;
+ if (r_type >= R_ARM_RREL32
+ && r_type < R_ARM_RREL32 + NUM_ELEM (elf32_arm_howto_table_2))
+ return &elf32_arm_howto_table_3[r_type - R_ARM_RREL32];
- case R_ARM_THM_PC11:
- return &elf32_arm_thm_pc11_howto;
-
- case R_ARM_THM_PC9:
- return &elf32_arm_thm_pc9_howto;
-
- case R_ARM_TLS_GD32:
- return &elf32_arm_tls_gd32_howto;
- break;
-
- case R_ARM_TLS_LDO32:
- return &elf32_arm_tls_ldo32_howto;
- break;
-
- case R_ARM_TLS_LDM32:
- return &elf32_arm_tls_ldm32_howto;
- break;
-
- case R_ARM_TLS_IE32:
- return &elf32_arm_tls_ie32_howto;
- break;
-
- case R_ARM_TLS_LE32:
- return &elf32_arm_tls_le32_howto;
- break;
-
- case R_ARM_RREL32:
- case R_ARM_RABS32:
- case R_ARM_RPC24:
- case R_ARM_RBASE:
- return &elf32_arm_r_howto[r_type - R_ARM_RREL32];
-
- default:
- return NULL;
- }
+ return NULL;
}
static void
@@ -961,12 +1312,14 @@
{BFD_RELOC_16, R_ARM_ABS16},
{BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12},
{BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5},
- {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_PC22},
+ {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
+ {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
+ {BFD_RELOC_THUMB_PCREL_BRANCH9, R_ARM_THM_JUMP8},
{BFD_RELOC_ARM_COPY, R_ARM_COPY},
{BFD_RELOC_ARM_GLOB_DAT, R_ARM_GLOB_DAT},
{BFD_RELOC_ARM_JUMP_SLOT, R_ARM_JUMP_SLOT},
{BFD_RELOC_ARM_RELATIVE, R_ARM_RELATIVE},
- {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF},
+ {BFD_RELOC_ARM_GOTOFF, R_ARM_GOTOFF32},
{BFD_RELOC_ARM_GOTPC, R_ARM_GOTPC},
{BFD_RELOC_ARM_GOT32, R_ARM_GOT32},
{BFD_RELOC_ARM_PLT32, R_ARM_PLT32},
@@ -984,6 +1337,8 @@
{BFD_RELOC_ARM_TLS_TPOFF32, R_ARM_TLS_TPOFF32},
{BFD_RELOC_ARM_TLS_IE32, R_ARM_TLS_IE32},
{BFD_RELOC_ARM_TLS_LE32, R_ARM_TLS_LE32},
+ {BFD_RELOC_VTABLE_INHERIT, R_ARM_GNU_VTINHERIT},
+ {BFD_RELOC_VTABLE_ENTRY, R_ARM_GNU_VTENTRY},
};
static reloc_howto_type *
@@ -992,43 +1347,11 @@
bfd_reloc_code_real_type code;
{
unsigned int i;
+ for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
+ if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
+ return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
- switch (code)
- {
- case BFD_RELOC_VTABLE_INHERIT:
- return & elf32_arm_vtinherit_howto;
-
- case BFD_RELOC_VTABLE_ENTRY:
- return & elf32_arm_vtentry_howto;
-
- case BFD_RELOC_THUMB_PCREL_BRANCH12:
- return & elf32_arm_thm_pc11_howto;
-
- case BFD_RELOC_THUMB_PCREL_BRANCH9:
- return & elf32_arm_thm_pc9_howto;
-
- case BFD_RELOC_ARM_TLS_GD32:
- return & elf32_arm_tls_gd32_howto;
-
- case BFD_RELOC_ARM_TLS_LDO32:
- return & elf32_arm_tls_ldo32_howto;
-
- case BFD_RELOC_ARM_TLS_LDM32:
- return & elf32_arm_tls_ldm32_howto;
-
- case BFD_RELOC_ARM_TLS_IE32:
- return & elf32_arm_tls_ie32_howto;
-
- case BFD_RELOC_ARM_TLS_LE32:
- return & elf32_arm_tls_le32_howto;
-
- default:
- for (i = 0; i < NUM_ELEM (elf32_arm_reloc_map); i ++)
- if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
- return & elf32_arm_howto_table[elf32_arm_reloc_map[i].elf_reloc_val];
-
- return NULL;
- }
+ return NULL;
}
/* Support for core dump NOTE sections */
@@ -2026,7 +2349,7 @@
&& r_type != R_ARM_CALL
&& r_type != R_ARM_JUMP24
#endif
- && r_type != R_ARM_THM_PC22)
+ && r_type != R_ARM_THM_CALL)
continue;
/* Get the section contents if we haven't done so already. */
@@ -2079,7 +2402,7 @@
record_arm_to_thumb_glue (link_info, h);
break;
- case R_ARM_THM_PC22:
+ case R_ARM_THM_CALL:
/* This one is a call from thumb code. We look
up the target of the call. If it is not a thumb
target, we insert glue. */
@@ -2882,7 +3205,7 @@
#ifndef OLD_ARM_ABI
case R_ARM_THM_XPC22:
#endif
- case R_ARM_THM_PC22:
+ case R_ARM_THM_CALL:
/* Thumb BL (branch long instruction). */
{
bfd_vma relocation;
@@ -2987,8 +3310,8 @@
}
break;
- case R_ARM_THM_PC11:
- case R_ARM_THM_PC9:
+ case R_ARM_THM_JUMP11:
+ case R_ARM_THM_JUMP8:
/* Thumb B (branch) instruction). */
{
bfd_signed_vma relocation;
@@ -3065,19 +3388,7 @@
case R_ARM_GNU_VTENTRY:
return bfd_reloc_ok;
- case R_ARM_COPY:
- return bfd_reloc_notsupported;
-
- case R_ARM_GLOB_DAT:
- return bfd_reloc_notsupported;
-
- case R_ARM_JUMP_SLOT:
- return bfd_reloc_notsupported;
-
- case R_ARM_RELATIVE:
- return bfd_reloc_notsupported;
-
- case R_ARM_GOTOFF:
+ case R_ARM_GOTOFF32:
/* Relocation is relative to the start of the
global offset table. */
@@ -3438,30 +3749,6 @@
return _bfd_final_link_relocate (howto, input_bfd, input_section,
contents, rel->r_offset, value, (bfd_vma) 0);
- case R_ARM_SBREL32:
- return bfd_reloc_notsupported;
-
- case R_ARM_AMP_VCALL9:
- return bfd_reloc_notsupported;
-
- case R_ARM_RSBREL32:
- return bfd_reloc_notsupported;
-
- case R_ARM_THM_RPC22:
- return bfd_reloc_notsupported;
-
- case R_ARM_RREL32:
- return bfd_reloc_notsupported;
-
- case R_ARM_RABS32:
- return bfd_reloc_notsupported;
-
- case R_ARM_RPC24:
- return bfd_reloc_notsupported;
-
- case R_ARM_RBASE:
- return bfd_reloc_notsupported;
-
case R_ARM_V4BX:
if (globals->fix_v4bx)
{
@@ -3492,7 +3779,7 @@
{
bfd_signed_vma addend;
- if (howto->type == R_ARM_THM_PC22)
+ if (howto->type == R_ARM_THM_CALL)
{
int upper_insn, lower_insn;
int upper, lower;
@@ -4386,7 +4673,7 @@
case R_ARM_JUMP24:
case R_ARM_PREL31:
#endif
- case R_ARM_THM_PC22:
+ case R_ARM_THM_CALL:
/* Should the interworking branches be here also? */
if (h != NULL)
@@ -4400,7 +4687,7 @@
if (h->plt.refcount > 0)
{
h->plt.refcount -= 1;
- if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_PC22)
+ if (ELF32_R_TYPE (rel->r_info) == R_ARM_THM_CALL)
eh->plt_thumb_refcount--;
}
@@ -4570,7 +4857,7 @@
htab->tls_ldm_got.refcount++;
/* Fall through */
- case R_ARM_GOTOFF:
+ case R_ARM_GOTOFF32:
case R_ARM_GOTPC:
if (htab->sgot == NULL)
{
@@ -4590,7 +4877,7 @@
case R_ARM_JUMP24:
case R_ARM_PREL31:
#endif
- case R_ARM_THM_PC22:
+ case R_ARM_THM_CALL:
/* Should the interworking branches be listed here? */
if (h != NULL)
{
@@ -4614,14 +4901,14 @@
|| r_type == R_ARM_PREL31
#endif
|| r_type == R_ARM_PLT32
- || r_type == R_ARM_THM_PC22)
+ || r_type == R_ARM_THM_CALL)
h->needs_plt = 1;
/* If we create a PLT entry, this relocation will reference
it, even if it's an ABS32 relocation. */
h->plt.refcount += 1;
- if (r_type == R_ARM_THM_PC22)
+ if (r_type == R_ARM_THM_CALL)
eh->plt_thumb_refcount += 1;
}