This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
 	      }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]