160484Sobrien/* ARM ELF support for BFD.
2218822Sdim   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
3218822Sdim   Free Software Foundation, Inc.
460484Sobrien
560484Sobrien   This file is part of BFD, the Binary File Descriptor library.
660484Sobrien
760484Sobrien   This program is free software; you can redistribute it and/or modify
860484Sobrien   it under the terms of the GNU General Public License as published by
960484Sobrien   the Free Software Foundation; either version 2 of the License, or
1060484Sobrien   (at your option) any later version.
1160484Sobrien
1260484Sobrien   This program is distributed in the hope that it will be useful,
1360484Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1460484Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1560484Sobrien   GNU General Public License for more details.
1660484Sobrien
1760484Sobrien   You should have received a copy of the GNU General Public License
1860484Sobrien   along with this program; if not, write to the Free Software Foundation,
19218822Sdim   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
2060484Sobrien
2160484Sobrien#ifndef _ELF_ARM_H
2260484Sobrien#define _ELF_ARM_H
2360484Sobrien
2460484Sobrien#include "elf/reloc-macros.h"
2560484Sobrien
2660484Sobrien/* Processor specific flags for the ELF header e_flags field.  */
2760484Sobrien#define EF_ARM_RELEXEC     0x01
2860484Sobrien#define EF_ARM_HASENTRY    0x02
2989857Sobrien#define EF_ARM_INTERWORK   0x04
3089857Sobrien#define EF_ARM_APCS_26     0x08
3189857Sobrien#define EF_ARM_APCS_FLOAT  0x10
3289857Sobrien#define EF_ARM_PIC         0x20
3389857Sobrien#define EF_ARM_ALIGN8	   0x40		/* 8-bit structure alignment is in use.  */
3489857Sobrien#define EF_ARM_NEW_ABI     0x80
3589857Sobrien#define EF_ARM_OLD_ABI     0x100
3689857Sobrien#define EF_ARM_SOFT_FLOAT  0x200
3789857Sobrien#define EF_ARM_VFP_FLOAT   0x400
38130561Sobrien#define EF_ARM_MAVERICK_FLOAT 0x800
3960484Sobrien
40218822Sdim/* Frame unwind information */
41218822Sdim#define PT_ARM_EXIDX (PT_LOPROC + 1)
42218822Sdim
4389857Sobrien/* Other constants defined in the ARM ELF spec. version B-01.  */
4477298Sobrien#define EF_ARM_SYMSARESORTED 0x04	/* NB conflicts with EF_INTERWORK */
4589857Sobrien#define EF_ARM_DYNSYMSUSESEGIDX 0x08	/* NB conflicts with EF_APCS26 */
4689857Sobrien#define EF_ARM_MAPSYMSFIRST 0x10	/* NB conflicts with EF_APCS_FLOAT */
4777298Sobrien#define EF_ARM_EABIMASK      0xFF000000
4877298Sobrien
49218822Sdim/* Constants defined in AAELF.  */
50218822Sdim#define EF_ARM_BE8	    0x00800000
51218822Sdim#define EF_ARM_LE8	    0x00400000
52218822Sdim
5377298Sobrien#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
5477298Sobrien#define EF_ARM_EABI_UNKNOWN  0x00000000
5577298Sobrien#define EF_ARM_EABI_VER1     0x01000000
5689857Sobrien#define EF_ARM_EABI_VER2     0x02000000
57218822Sdim#define EF_ARM_EABI_VER3     0x03000000
58218822Sdim#define EF_ARM_EABI_VER4     0x04000000
59218822Sdim#define EF_ARM_EABI_VER5     0x05000000
6077298Sobrien
6160484Sobrien/* Local aliases for some flags to match names used by COFF port.  */
6289857Sobrien#define F_INTERWORK	   EF_ARM_INTERWORK
6389857Sobrien#define F_APCS26	   EF_ARM_APCS_26
6489857Sobrien#define F_APCS_FLOAT	   EF_ARM_APCS_FLOAT
6589857Sobrien#define F_PIC              EF_ARM_PIC
6689857Sobrien#define F_SOFT_FLOAT	   EF_ARM_SOFT_FLOAT
6789857Sobrien#define F_VFP_FLOAT	   EF_ARM_VFP_FLOAT
6860484Sobrien
6960484Sobrien/* Additional symbol types for Thumb.  */
7060484Sobrien#define STT_ARM_TFUNC      STT_LOPROC   /* A Thumb function.  */
7160484Sobrien#define STT_ARM_16BIT      STT_HIPROC   /* A Thumb label.  */
7260484Sobrien
73218822Sdim/* Additional section types.  */
74218822Sdim#define SHT_ARM_EXIDX	   0x70000001	/* Section holds ARM unwind info.  */
75218822Sdim#define SHT_ARM_PREEMPTMAP 0x70000002	/* Section pre-emption details.  */
76218822Sdim#define SHT_ARM_ATTRIBUTES 0x70000003	/* Section holds attributes.  */
77218822Sdim
7860484Sobrien/* ARM-specific values for sh_flags.  */
7960484Sobrien#define SHF_ENTRYSECT      0x10000000   /* Section contains an entry point.  */
8060484Sobrien#define SHF_COMDEF         0x80000000   /* Section may be multiply defined in the input to a link step.  */
8160484Sobrien
8260484Sobrien/* ARM-specific program header flags.  */
8360484Sobrien#define PF_ARM_SB          0x10000000   /* Segment contains the location addressed by the static base.  */
8477298Sobrien#define PF_ARM_PI          0x20000000   /* Segment is position-independent.  */
8577298Sobrien#define PF_ARM_ABS         0x40000000   /* Segment must be loaded at its base address.  */
8660484Sobrien
87218822Sdim/* Values for the Tag_CPU_arch EABI attribute.  */
88218822Sdim#define TAG_CPU_ARCH_PRE_V4    0
89218822Sdim#define TAG_CPU_ARCH_V4                1
90218822Sdim#define TAG_CPU_ARCH_V4T       2
91218822Sdim#define TAG_CPU_ARCH_V5T       3
92218822Sdim#define TAG_CPU_ARCH_V5TE      4
93218822Sdim#define TAG_CPU_ARCH_V5TEJ     5
94218822Sdim#define TAG_CPU_ARCH_V6                6
95218822Sdim#define TAG_CPU_ARCH_V6KZ      7
96218822Sdim#define TAG_CPU_ARCH_V6T2      8
97218822Sdim#define TAG_CPU_ARCH_V6K       9
98218822Sdim#define TAG_CPU_ARCH_V7                10
99218822Sdim
10060484Sobrien/* Relocation types.  */
10177298Sobrien
10260484SobrienSTART_RELOC_NUMBERS (elf_arm_reloc_type)
103218822Sdim/* AAELF official names and numbers.  */
104218822Sdim  RELOC_NUMBER (R_ARM_NONE,            	  0)
105218822Sdim  RELOC_NUMBER (R_ARM_PC24,            	  1)   /* deprecated */
106218822Sdim  RELOC_NUMBER (R_ARM_ABS32,           	  2)
107218822Sdim  RELOC_NUMBER (R_ARM_REL32,           	  3)
108218822Sdim  RELOC_NUMBER (R_ARM_LDR_PC_G0,       	  4)
109218822Sdim  RELOC_NUMBER (R_ARM_ABS16,           	  5)
110218822Sdim  RELOC_NUMBER (R_ARM_ABS12,           	  6)
111218822Sdim  RELOC_NUMBER (R_ARM_THM_ABS5,        	  7)
112218822Sdim  RELOC_NUMBER (R_ARM_ABS8,            	  8)
113218822Sdim  RELOC_NUMBER (R_ARM_SBREL32,         	  9)
114218822Sdim  RELOC_NUMBER (R_ARM_THM_CALL,        	 10)
115218822Sdim  RELOC_NUMBER (R_ARM_THM_PC8,         	 11)
116218822Sdim  RELOC_NUMBER (R_ARM_BREL_ADJ,	       	 12)
117218822Sdim  RELOC_NUMBER (R_ARM_SWI24,           	 13)   /* obsolete */
118218822Sdim  RELOC_NUMBER (R_ARM_THM_SWI8,        	 14)   /* obsolete */
119218822Sdim  RELOC_NUMBER (R_ARM_XPC25,           	 15)   /* obsolete */
120218822Sdim  RELOC_NUMBER (R_ARM_THM_XPC22,       	 16)   /* obsolete */
121218822Sdim  RELOC_NUMBER (R_ARM_TLS_DTPMOD32,    	 17)
122218822Sdim  RELOC_NUMBER (R_ARM_TLS_DTPOFF32,    	 18)
123218822Sdim  RELOC_NUMBER (R_ARM_TLS_TPOFF32,     	 19)
124218822Sdim  RELOC_NUMBER (R_ARM_COPY,            	 20)   /* Copy symbol at runtime.  */
125218822Sdim  RELOC_NUMBER (R_ARM_GLOB_DAT,        	 21)   /* Create GOT entry.  */
126218822Sdim  RELOC_NUMBER (R_ARM_JUMP_SLOT,       	 22)   /* Create PLT entry.  */
127218822Sdim  RELOC_NUMBER (R_ARM_RELATIVE,        	 23)   /* Adjust by program base.  */
128218822Sdim  RELOC_NUMBER (R_ARM_GOTOFF32,        	 24)   /* 32 bit offset to GOT.  */
129218822Sdim  RELOC_NUMBER (R_ARM_BASE_PREL,       	 25)   /* 32 bit PC relative offset to GOT.  */
130218822Sdim  RELOC_NUMBER (R_ARM_GOT_BREL,        	 26)   /* 32 bit GOT entry.  */
131218822Sdim  RELOC_NUMBER (R_ARM_PLT32,           	 27)   /* deprecated - 32 bit PLT address.  */
132218822Sdim  RELOC_NUMBER (R_ARM_CALL,            	 28)
133218822Sdim  RELOC_NUMBER (R_ARM_JUMP24,          	 29)
134218822Sdim  RELOC_NUMBER (R_ARM_THM_JUMP24,      	 30)
135218822Sdim  RELOC_NUMBER (R_ARM_BASE_ABS,        	 31)
136218822Sdim  RELOC_NUMBER (R_ARM_ALU_PCREL7_0,    	 32)   /* obsolete */
137218822Sdim  RELOC_NUMBER (R_ARM_ALU_PCREL15_8,   	 33)   /* obsolete */
138218822Sdim  RELOC_NUMBER (R_ARM_ALU_PCREL23_15,  	 34)   /* obsolete */
139218822Sdim  RELOC_NUMBER (R_ARM_LDR_SBREL_11_0,  	 35)   /* deprecated, should have _NC suffix */
140218822Sdim  RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 	 36)   /* deprecated, should have _NC suffix */
141218822Sdim  RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 	 37)   /* deprecated, should have _CK suffix */
142218822Sdim  RELOC_NUMBER (R_ARM_TARGET1,         	 38)
143218822Sdim  RELOC_NUMBER (R_ARM_SBREL31,         	 39)   /* deprecated */
144218822Sdim  RELOC_NUMBER (R_ARM_V4BX,            	 40)
145218822Sdim  RELOC_NUMBER (R_ARM_TARGET2,	       	 41)
146218822Sdim  RELOC_NUMBER (R_ARM_PREL31,	       	 42)
147218822Sdim  RELOC_NUMBER (R_ARM_MOVW_ABS_NC,     	 43)
148218822Sdim  RELOC_NUMBER (R_ARM_MOVT_ABS,        	 44)
149218822Sdim  RELOC_NUMBER (R_ARM_MOVW_PREL_NC,    	 45)
150218822Sdim  RELOC_NUMBER (R_ARM_MOVT_PREL,       	 46)
151218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVW_ABS_NC, 	 47)
152218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVT_ABS,    	 48)
153218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVW_PREL_NC,	 49)
154218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVT_PREL,   	 50)
155218822Sdim  RELOC_NUMBER (R_ARM_THM_JUMP19,      	 51)
156218822Sdim  RELOC_NUMBER (R_ARM_THM_JUMP6,       	 52)
157218822Sdim  RELOC_NUMBER (R_ARM_THM_ALU_PREL_11_0, 53)
158218822Sdim  RELOC_NUMBER (R_ARM_THM_PC12,        	 54)
159218822Sdim  RELOC_NUMBER (R_ARM_ABS32_NOI,       	 55)
160218822Sdim  RELOC_NUMBER (R_ARM_REL32_NOI,       	 56)
161218822Sdim  RELOC_NUMBER (R_ARM_ALU_PC_G0_NC,      57)
162218822Sdim  RELOC_NUMBER (R_ARM_ALU_PC_G0,         58)
163218822Sdim  RELOC_NUMBER (R_ARM_ALU_PC_G1_NC,      59)
164218822Sdim  RELOC_NUMBER (R_ARM_ALU_PC_G1,         60)
165218822Sdim  RELOC_NUMBER (R_ARM_ALU_PC_G2,         61)
166218822Sdim  RELOC_NUMBER (R_ARM_LDR_PC_G1,         62)
167218822Sdim  RELOC_NUMBER (R_ARM_LDR_PC_G2,         63)
168218822Sdim  RELOC_NUMBER (R_ARM_LDRS_PC_G0,        64)
169218822Sdim  RELOC_NUMBER (R_ARM_LDRS_PC_G1,        65)
170218822Sdim  RELOC_NUMBER (R_ARM_LDRS_PC_G2,        66)
171218822Sdim  RELOC_NUMBER (R_ARM_LDC_PC_G0,         67)
172218822Sdim  RELOC_NUMBER (R_ARM_LDC_PC_G1,         68)
173218822Sdim  RELOC_NUMBER (R_ARM_LDC_PC_G2,         69)
174218822Sdim  RELOC_NUMBER (R_ARM_ALU_SB_G0_NC,      70)
175218822Sdim  RELOC_NUMBER (R_ARM_ALU_SB_G0,         71)
176218822Sdim  RELOC_NUMBER (R_ARM_ALU_SB_G1_NC,      72)
177218822Sdim  RELOC_NUMBER (R_ARM_ALU_SB_G1,         73)
178218822Sdim  RELOC_NUMBER (R_ARM_ALU_SB_G2,         74)
179218822Sdim  RELOC_NUMBER (R_ARM_LDR_SB_G0,         75)
180218822Sdim  RELOC_NUMBER (R_ARM_LDR_SB_G1,         76)
181218822Sdim  RELOC_NUMBER (R_ARM_LDR_SB_G2,         77)
182218822Sdim  RELOC_NUMBER (R_ARM_LDRS_SB_G0,        78)
183218822Sdim  RELOC_NUMBER (R_ARM_LDRS_SB_G1,        79)
184218822Sdim  RELOC_NUMBER (R_ARM_LDRS_SB_G2,        80)
185218822Sdim  RELOC_NUMBER (R_ARM_LDC_SB_G0,         81)
186218822Sdim  RELOC_NUMBER (R_ARM_LDC_SB_G1,         82)
187218822Sdim  RELOC_NUMBER (R_ARM_LDC_SB_G2,         83)
188218822Sdim  RELOC_NUMBER (R_ARM_MOVW_BREL_NC,    	 84)
189218822Sdim  RELOC_NUMBER (R_ARM_MOVT_BREL,       	 85)
190218822Sdim  RELOC_NUMBER (R_ARM_MOVW_BREL,       	 86)
191218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVW_BREL_NC,	 87)
192218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVT_BREL,   	 88)
193218822Sdim  RELOC_NUMBER (R_ARM_THM_MOVW_BREL,   	 89)
194218822Sdim  /* 90-93 unallocated */
195218822Sdim  RELOC_NUMBER (R_ARM_PLT32_ABS,       	 94)
196218822Sdim  RELOC_NUMBER (R_ARM_GOT_ABS,	       	 95)
197218822Sdim  RELOC_NUMBER (R_ARM_GOT_PREL,	       	 96)
198218822Sdim  RELOC_NUMBER (R_ARM_GOT_BREL12,      	 97)
199218822Sdim  RELOC_NUMBER (R_ARM_GOTOFF12,	       	 98)
200218822Sdim  RELOC_NUMBER (R_ARM_GOTRELAX,	       	 99)
201218822Sdim  RELOC_NUMBER (R_ARM_GNU_VTENTRY,    	100)   /* deprecated - old C++ abi */
202218822Sdim  RELOC_NUMBER (R_ARM_GNU_VTINHERIT,  	101)   /* deprecated - old C++ abi */
203218822Sdim  RELOC_NUMBER (R_ARM_THM_JUMP11,     	102)
204218822Sdim  RELOC_NUMBER (R_ARM_THM_JUMP8,      	103)
205218822Sdim  RELOC_NUMBER (R_ARM_TLS_GD32,	      	104)
206218822Sdim  RELOC_NUMBER (R_ARM_TLS_LDM32,      	105)
207218822Sdim  RELOC_NUMBER (R_ARM_TLS_LDO32,      	106)
208218822Sdim  RELOC_NUMBER (R_ARM_TLS_IE32,       	107)
209218822Sdim  RELOC_NUMBER (R_ARM_TLS_LE32,	      	108)
210218822Sdim  RELOC_NUMBER (R_ARM_TLS_LDO12,      	109)
211218822Sdim  RELOC_NUMBER (R_ARM_TLS_LE12,	      	110)
212218822Sdim  RELOC_NUMBER (R_ARM_TLS_IE12GP,     	111)
213218822Sdim  /* 112 - 127 private range */
214218822Sdim  RELOC_NUMBER (R_ARM_ME_TOO,	        128)   /* obsolete */
215218822Sdim
216218822Sdim  /* Extensions?  R=read-only?  */
217218822Sdim  RELOC_NUMBER (R_ARM_RXPC25,         	249)
218218822Sdim  RELOC_NUMBER (R_ARM_RSBREL32,       	250)
219218822Sdim  RELOC_NUMBER (R_ARM_THM_RPC22,      	251)
220218822Sdim  RELOC_NUMBER (R_ARM_RREL32,         	252)
221218822Sdim  RELOC_NUMBER (R_ARM_RABS32,         	253)
222218822Sdim  RELOC_NUMBER (R_ARM_RPC24,          	254)
223218822Sdim  RELOC_NUMBER (R_ARM_RBASE,          	255)
224218822Sdim
225218822Sdim  /* Unofficial names for some of the relocs.  */
226218822Sdim  FAKE_RELOC (R_ARM_GOTOFF,             R_ARM_GOTOFF32)   /* 32 bit offset to GOT.  */
227218822Sdim  FAKE_RELOC (R_ARM_THM_PC22,           R_ARM_THM_CALL)
228218822Sdim  FAKE_RELOC (R_ARM_THM_PC11,           R_ARM_THM_JUMP11)
229218822Sdim  FAKE_RELOC (R_ARM_THM_PC9,            R_ARM_THM_JUMP8)
230218822Sdim
231218822Sdim  /* Relocs with both a different name, and (apparently) different meaning in
232218822Sdim     GNU usage.  */
233218822Sdim  FAKE_RELOC (R_ARM_GOTPC,              R_ARM_BASE_PREL)  /* 32 bit PC relative offset to GOT.  */
234218822Sdim  FAKE_RELOC (R_ARM_GOT32,              R_ARM_GOT_BREL)   /* 32 bit GOT entry.  */
235218822Sdim  FAKE_RELOC (R_ARM_ROSEGREL32,         R_ARM_SBREL31)    /* ??? */
236218822Sdim  FAKE_RELOC (R_ARM_AMP_VCALL9,         R_ARM_BREL_ADJ)   /* Thumb-something.  Not used.  */
23777298SobrienEND_RELOC_NUMBERS (R_ARM_max)
23860484Sobrien
239218822Sdim#ifdef BFD_ARCH_SIZE
240218822Sdim/* EABI object attributes.  */
241218822Sdim
242218822Sdimenum
243218822Sdim{
244218822Sdim  /* 0-3 are generic.  */
245218822Sdim  Tag_CPU_raw_name = 4,
246218822Sdim  Tag_CPU_name,
247218822Sdim  Tag_CPU_arch,
248218822Sdim  Tag_CPU_arch_profile,
249218822Sdim  Tag_ARM_ISA_use,
250218822Sdim  Tag_THUMB_ISA_use,
251218822Sdim  Tag_VFP_arch,
252218822Sdim  Tag_WMMX_arch,
253218822Sdim  Tag_NEON_arch,
254218822Sdim  Tag_PCS_config,
255218822Sdim  Tag_ABI_PCS_R9_use,
256218822Sdim  Tag_ABI_PCS_RW_data,
257218822Sdim  Tag_ABI_PCS_RO_data,
258218822Sdim  Tag_ABI_PCS_GOT_use,
259218822Sdim  Tag_ABI_PCS_wchar_t,
260218822Sdim  Tag_ABI_FP_rounding,
261218822Sdim  Tag_ABI_FP_denormal,
262218822Sdim  Tag_ABI_FP_exceptions,
263218822Sdim  Tag_ABI_FP_user_exceptions,
264218822Sdim  Tag_ABI_FP_number_model,
265218822Sdim  Tag_ABI_align8_needed,
266218822Sdim  Tag_ABI_align8_preserved,
267218822Sdim  Tag_ABI_enum_size,
268218822Sdim  Tag_ABI_HardFP_use,
269218822Sdim  Tag_ABI_VFP_args,
270218822Sdim  Tag_ABI_WMMX_args,
271218822Sdim  Tag_ABI_optimization_goals,
272218822Sdim  Tag_ABI_FP_optimization_goals,
273218822Sdim  /* 32 is generic.  */
274281048Sandrew  Tag_CPU_unaligned_access = 34,
275281048Sandrew  Tag_FP_HP_extension = 36,
276281048Sandrew  Tag_ABI_FP_16bit_format = 38,
277281048Sandrew  Tag_MPextension_use = 42,
278281048Sandrew  Tag_DIV_use = 44,
279272524Sandrew  Tag_Virtualization_use = 68,
280218822Sdim};
281218822Sdim
282218822Sdim#endif
283218822Sdim
284130561Sobrien/* The name of the note section used to identify arm variants.  */
285130561Sobrien#define ARM_NOTE_SECTION ".note.gnu.arm.ident"
286218822Sdim
287218822Sdim/* Special section names.  */
288218822Sdim#define ELF_STRING_ARM_unwind           ".ARM.exidx"
289218822Sdim#define ELF_STRING_ARM_unwind_info      ".ARM.extab"
290218822Sdim#define ELF_STRING_ARM_unwind_once      ".gnu.linkonce.armexidx."
291218822Sdim#define ELF_STRING_ARM_unwind_info_once ".gnu.linkonce.armextab."
292218822Sdim
29377298Sobrien#endif /* _ELF_ARM_H */
294