* powerpc.cc (Powerpc_relobj): Add and use Address typedef.
[deliverable/binutils-gdb.git] / include / elf / arm.h
CommitLineData
252b5132 1/* ARM ELF support for BFD.
e4e42b45 2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2009, 2010
c3aa17e9 3 Free Software Foundation, Inc.
252b5132
RH
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
e4e42b45 9 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software Foundation,
e172dbf8 19 Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132
RH
20
21#ifndef _ELF_ARM_H
22#define _ELF_ARM_H
23
24#include "elf/reloc-macros.h"
25
26/* Processor specific flags for the ELF header e_flags field. */
27#define EF_ARM_RELEXEC 0x01
28#define EF_ARM_HASENTRY 0x02
2a7a4624
PB
29#define EF_ARM_INTERWORK 0x04
30#define EF_ARM_APCS_26 0x08
31#define EF_ARM_APCS_FLOAT 0x10
32#define EF_ARM_PIC 0x20
33#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use. */
34#define EF_ARM_NEW_ABI 0x80
35#define EF_ARM_OLD_ABI 0x100
36#define EF_ARM_SOFT_FLOAT 0x200
ca4ebd1e 37#define EF_ARM_VFP_FLOAT 0x400
fde78edd 38#define EF_ARM_MAVERICK_FLOAT 0x800
2a7a4624 39
b294bdf8 40/* Frame unwind information */
c19d1205 41#define PT_ARM_EXIDX (PT_LOPROC + 1)
b294bdf8 42
2a7a4624 43/* Other constants defined in the ARM ELF spec. version B-01. */
7f6fed87
NC
44#define EF_ARM_SYMSARESORTED 0x04 /* NB conflicts with EF_INTERWORK. */
45#define EF_ARM_DYNSYMSUSESEGIDX 0x08 /* NB conflicts with EF_APCS26. */
46#define EF_ARM_MAPSYMSFIRST 0x10 /* NB conflicts with EF_APCS_FLOAT. */
ff1c4e0d
NC
47#define EF_ARM_EABIMASK 0xFF000000
48
d507cf36
PB
49/* Constants defined in AAELF. */
50#define EF_ARM_BE8 0x00800000
51#define EF_ARM_LE8 0x00400000
52
ff1c4e0d
NC
53#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
54#define EF_ARM_EABI_UNKNOWN 0x00000000
55#define EF_ARM_EABI_VER1 0x01000000
2a7a4624 56#define EF_ARM_EABI_VER2 0x02000000
d507cf36 57#define EF_ARM_EABI_VER3 0x03000000
8cb51566 58#define EF_ARM_EABI_VER4 0x04000000
3a4a14e9 59#define EF_ARM_EABI_VER5 0x05000000
ff1c4e0d 60
252b5132 61/* Local aliases for some flags to match names used by COFF port. */
2a7a4624
PB
62#define F_INTERWORK EF_ARM_INTERWORK
63#define F_APCS26 EF_ARM_APCS_26
64#define F_APCS_FLOAT EF_ARM_APCS_FLOAT
65#define F_PIC EF_ARM_PIC
66#define F_SOFT_FLOAT EF_ARM_SOFT_FLOAT
ca4ebd1e 67#define F_VFP_FLOAT EF_ARM_VFP_FLOAT
252b5132 68
2f0ca46a
NC
69/* Additional symbol types for Thumb. */
70#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */
71#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */
252b5132 72
40a18ebd 73/* Additional section types. */
7f6fed87
NC
74#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */
75#define SHT_ARM_PREEMPTMAP 0x70000002 /* Section pre-emption details. */
76#define SHT_ARM_ATTRIBUTES 0x70000003 /* Section holds attributes. */
77#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* Section holds overlay debug info. */
78#define SHT_ARM_OVERLAYSECTION 0x70000005 /* Section holds GDB and overlay integration info. */
40a18ebd 79
2f0ca46a
NC
80/* ARM-specific values for sh_flags. */
81#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */
82#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step. */
252b5132 83
2f0ca46a
NC
84/* ARM-specific program header flags. */
85#define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base. */
ff1c4e0d
NC
86#define PF_ARM_PI 0x20000000 /* Segment is position-independent. */
87#define PF_ARM_ABS 0x40000000 /* Segment must be loaded at its base address. */
252b5132 88
e95de063 89/* Values for the Tag_CPU_arch EABI attribute. */
91e22acd
AS
90#define TAG_CPU_ARCH_PRE_V4 0
91#define TAG_CPU_ARCH_V4 1
92#define TAG_CPU_ARCH_V4T 2
93#define TAG_CPU_ARCH_V5T 3
94#define TAG_CPU_ARCH_V5TE 4
95#define TAG_CPU_ARCH_V5TEJ 5
96#define TAG_CPU_ARCH_V6 6
97#define TAG_CPU_ARCH_V6KZ 7
98#define TAG_CPU_ARCH_V6T2 8
99#define TAG_CPU_ARCH_V6K 9
100#define TAG_CPU_ARCH_V7 10
101#define TAG_CPU_ARCH_V6_M 11
102#define TAG_CPU_ARCH_V6S_M 12
9e3c6df6 103#define TAG_CPU_ARCH_V7E_M 13
bca38921
MGD
104#define TAG_CPU_ARCH_V8 14
105#define MAX_TAG_CPU_ARCH 14
91e22acd
AS
106/* Pseudo-architecture to allow objects to be compatible with the subset of
107 armv4t and armv6-m. This value should never be stored in object files. */
108#define TAG_CPU_ARCH_V4T_PLUS_V6_M (MAX_TAG_CPU_ARCH + 1)
e95de063 109
252b5132 110/* Relocation types. */
8725b940 111
252b5132 112START_RELOC_NUMBERS (elf_arm_reloc_type)
c19d1205
ZW
113/* AAELF official names and numbers. */
114 RELOC_NUMBER (R_ARM_NONE, 0)
115 RELOC_NUMBER (R_ARM_PC24, 1) /* deprecated */
116 RELOC_NUMBER (R_ARM_ABS32, 2)
117 RELOC_NUMBER (R_ARM_REL32, 3)
c19d1205
ZW
118 RELOC_NUMBER (R_ARM_LDR_PC_G0, 4)
119 RELOC_NUMBER (R_ARM_ABS16, 5)
120 RELOC_NUMBER (R_ARM_ABS12, 6)
121 RELOC_NUMBER (R_ARM_THM_ABS5, 7)
122 RELOC_NUMBER (R_ARM_ABS8, 8)
123 RELOC_NUMBER (R_ARM_SBREL32, 9)
124 RELOC_NUMBER (R_ARM_THM_CALL, 10)
125 RELOC_NUMBER (R_ARM_THM_PC8, 11)
126 RELOC_NUMBER (R_ARM_BREL_ADJ, 12)
0855e32b 127 RELOC_NUMBER (R_ARM_TLS_DESC, 13)
c19d1205 128 RELOC_NUMBER (R_ARM_THM_SWI8, 14) /* obsolete */
c19d1205
ZW
129 RELOC_NUMBER (R_ARM_XPC25, 15) /* obsolete */
130 RELOC_NUMBER (R_ARM_THM_XPC22, 16) /* obsolete */
131 RELOC_NUMBER (R_ARM_TLS_DTPMOD32, 17)
132 RELOC_NUMBER (R_ARM_TLS_DTPOFF32, 18)
133 RELOC_NUMBER (R_ARM_TLS_TPOFF32, 19)
134 RELOC_NUMBER (R_ARM_COPY, 20) /* Copy symbol at runtime. */
135 RELOC_NUMBER (R_ARM_GLOB_DAT, 21) /* Create GOT entry. */
136 RELOC_NUMBER (R_ARM_JUMP_SLOT, 22) /* Create PLT entry. */
137 RELOC_NUMBER (R_ARM_RELATIVE, 23) /* Adjust by program base. */
138 RELOC_NUMBER (R_ARM_GOTOFF32, 24) /* 32 bit offset to GOT. */
139 RELOC_NUMBER (R_ARM_BASE_PREL, 25) /* 32 bit PC relative offset to GOT. */
140 RELOC_NUMBER (R_ARM_GOT_BREL, 26) /* 32 bit GOT entry. */
141 RELOC_NUMBER (R_ARM_PLT32, 27) /* deprecated - 32 bit PLT address. */
142 RELOC_NUMBER (R_ARM_CALL, 28)
143 RELOC_NUMBER (R_ARM_JUMP24, 29)
144 RELOC_NUMBER (R_ARM_THM_JUMP24, 30)
145 RELOC_NUMBER (R_ARM_BASE_ABS, 31)
146 RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32) /* obsolete */
147 RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33) /* obsolete */
148 RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34) /* obsolete */
149 RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35) /* deprecated, should have _NC suffix */
150 RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36) /* deprecated, should have _NC suffix */
151 RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37) /* deprecated, should have _CK suffix */
152 RELOC_NUMBER (R_ARM_TARGET1, 38)
153 RELOC_NUMBER (R_ARM_SBREL31, 39) /* deprecated */
154 RELOC_NUMBER (R_ARM_V4BX, 40)
155 RELOC_NUMBER (R_ARM_TARGET2, 41)
156 RELOC_NUMBER (R_ARM_PREL31, 42)
157 RELOC_NUMBER (R_ARM_MOVW_ABS_NC, 43)
158 RELOC_NUMBER (R_ARM_MOVT_ABS, 44)
159 RELOC_NUMBER (R_ARM_MOVW_PREL_NC, 45)
160 RELOC_NUMBER (R_ARM_MOVT_PREL, 46)
161 RELOC_NUMBER (R_ARM_THM_MOVW_ABS_NC, 47)
162 RELOC_NUMBER (R_ARM_THM_MOVT_ABS, 48)
163 RELOC_NUMBER (R_ARM_THM_MOVW_PREL_NC, 49)
164 RELOC_NUMBER (R_ARM_THM_MOVT_PREL, 50)
165 RELOC_NUMBER (R_ARM_THM_JUMP19, 51)
166 RELOC_NUMBER (R_ARM_THM_JUMP6, 52)
167 RELOC_NUMBER (R_ARM_THM_ALU_PREL_11_0, 53)
168 RELOC_NUMBER (R_ARM_THM_PC12, 54)
169 RELOC_NUMBER (R_ARM_ABS32_NOI, 55)
170 RELOC_NUMBER (R_ARM_REL32_NOI, 56)
171 RELOC_NUMBER (R_ARM_ALU_PC_G0_NC, 57)
172 RELOC_NUMBER (R_ARM_ALU_PC_G0, 58)
173 RELOC_NUMBER (R_ARM_ALU_PC_G1_NC, 59)
174 RELOC_NUMBER (R_ARM_ALU_PC_G1, 60)
175 RELOC_NUMBER (R_ARM_ALU_PC_G2, 61)
176 RELOC_NUMBER (R_ARM_LDR_PC_G1, 62)
177 RELOC_NUMBER (R_ARM_LDR_PC_G2, 63)
178 RELOC_NUMBER (R_ARM_LDRS_PC_G0, 64)
179 RELOC_NUMBER (R_ARM_LDRS_PC_G1, 65)
180 RELOC_NUMBER (R_ARM_LDRS_PC_G2, 66)
181 RELOC_NUMBER (R_ARM_LDC_PC_G0, 67)
182 RELOC_NUMBER (R_ARM_LDC_PC_G1, 68)
183 RELOC_NUMBER (R_ARM_LDC_PC_G2, 69)
184 RELOC_NUMBER (R_ARM_ALU_SB_G0_NC, 70)
185 RELOC_NUMBER (R_ARM_ALU_SB_G0, 71)
186 RELOC_NUMBER (R_ARM_ALU_SB_G1_NC, 72)
187 RELOC_NUMBER (R_ARM_ALU_SB_G1, 73)
188 RELOC_NUMBER (R_ARM_ALU_SB_G2, 74)
189 RELOC_NUMBER (R_ARM_LDR_SB_G0, 75)
190 RELOC_NUMBER (R_ARM_LDR_SB_G1, 76)
191 RELOC_NUMBER (R_ARM_LDR_SB_G2, 77)
192 RELOC_NUMBER (R_ARM_LDRS_SB_G0, 78)
193 RELOC_NUMBER (R_ARM_LDRS_SB_G1, 79)
194 RELOC_NUMBER (R_ARM_LDRS_SB_G2, 80)
4962c51a
MS
195 RELOC_NUMBER (R_ARM_LDC_SB_G0, 81)
196 RELOC_NUMBER (R_ARM_LDC_SB_G1, 82)
197 RELOC_NUMBER (R_ARM_LDC_SB_G2, 83)
c19d1205
ZW
198 RELOC_NUMBER (R_ARM_MOVW_BREL_NC, 84)
199 RELOC_NUMBER (R_ARM_MOVT_BREL, 85)
200 RELOC_NUMBER (R_ARM_MOVW_BREL, 86)
201 RELOC_NUMBER (R_ARM_THM_MOVW_BREL_NC, 87)
202 RELOC_NUMBER (R_ARM_THM_MOVT_BREL, 88)
203 RELOC_NUMBER (R_ARM_THM_MOVW_BREL, 89)
0855e32b
NS
204 RELOC_NUMBER (R_ARM_TLS_GOTDESC, 90)
205 RELOC_NUMBER (R_ARM_TLS_CALL, 91)
206 RELOC_NUMBER (R_ARM_TLS_DESCSEQ, 92)
207 RELOC_NUMBER (R_ARM_THM_TLS_CALL, 93)
c19d1205
ZW
208 RELOC_NUMBER (R_ARM_PLT32_ABS, 94)
209 RELOC_NUMBER (R_ARM_GOT_ABS, 95)
210 RELOC_NUMBER (R_ARM_GOT_PREL, 96)
211 RELOC_NUMBER (R_ARM_GOT_BREL12, 97)
212 RELOC_NUMBER (R_ARM_GOTOFF12, 98)
213 RELOC_NUMBER (R_ARM_GOTRELAX, 99)
c19d1205
ZW
214 RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100) /* deprecated - old C++ abi */
215 RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101) /* deprecated - old C++ abi */
216 RELOC_NUMBER (R_ARM_THM_JUMP11, 102)
217 RELOC_NUMBER (R_ARM_THM_JUMP8, 103)
c19d1205
ZW
218 RELOC_NUMBER (R_ARM_TLS_GD32, 104)
219 RELOC_NUMBER (R_ARM_TLS_LDM32, 105)
220 RELOC_NUMBER (R_ARM_TLS_LDO32, 106)
221 RELOC_NUMBER (R_ARM_TLS_IE32, 107)
222 RELOC_NUMBER (R_ARM_TLS_LE32, 108)
223 RELOC_NUMBER (R_ARM_TLS_LDO12, 109)
224 RELOC_NUMBER (R_ARM_TLS_LE12, 110)
225 RELOC_NUMBER (R_ARM_TLS_IE12GP, 111)
226 /* 112 - 127 private range */
227 RELOC_NUMBER (R_ARM_ME_TOO, 128) /* obsolete */
0855e32b 228 RELOC_NUMBER (R_ARM_THM_TLS_DESCSEQ ,129)
c19d1205 229
34e77a92
RS
230 RELOC_NUMBER (R_ARM_IRELATIVE, 160)
231
c19d1205
ZW
232 /* Extensions? R=read-only? */
233 RELOC_NUMBER (R_ARM_RXPC25, 249)
234 RELOC_NUMBER (R_ARM_RSBREL32, 250)
235 RELOC_NUMBER (R_ARM_THM_RPC22, 251)
236 RELOC_NUMBER (R_ARM_RREL32, 252)
237 RELOC_NUMBER (R_ARM_RABS32, 253)
238 RELOC_NUMBER (R_ARM_RPC24, 254)
239 RELOC_NUMBER (R_ARM_RBASE, 255)
240
241 /* Unofficial names for some of the relocs. */
242 FAKE_RELOC (R_ARM_GOTOFF, R_ARM_GOTOFF32) /* 32 bit offset to GOT. */
243 FAKE_RELOC (R_ARM_THM_PC22, R_ARM_THM_CALL)
244 FAKE_RELOC (R_ARM_THM_PC11, R_ARM_THM_JUMP11)
245 FAKE_RELOC (R_ARM_THM_PC9, R_ARM_THM_JUMP8)
246
247 /* Relocs with both a different name, and (apparently) different meaning in
248 GNU usage. */
249 FAKE_RELOC (R_ARM_GOTPC, R_ARM_BASE_PREL) /* 32 bit PC relative offset to GOT. */
250 FAKE_RELOC (R_ARM_GOT32, R_ARM_GOT_BREL) /* 32 bit GOT entry. */
251 FAKE_RELOC (R_ARM_ROSEGREL32, R_ARM_SBREL31) /* ??? */
252 FAKE_RELOC (R_ARM_AMP_VCALL9, R_ARM_BREL_ADJ) /* Thumb-something. Not used. */
7c90103b
NC
253
254END_RELOC_NUMBERS (R_ARM_max = 256)
252b5132 255
ee065d83 256#ifdef BFD_ARCH_SIZE
104d59d1 257/* EABI object attributes. */
ee065d83
PB
258
259enum
260{
104d59d1
JM
261 /* 0-3 are generic. */
262 Tag_CPU_raw_name = 4,
ee065d83
PB
263 Tag_CPU_name,
264 Tag_CPU_arch,
265 Tag_CPU_arch_profile,
266 Tag_ARM_ISA_use,
267 Tag_THUMB_ISA_use,
75375b3e 268 Tag_FP_arch,
ee065d83 269 Tag_WMMX_arch,
91e22acd 270 Tag_Advanced_SIMD_arch,
ee065d83
PB
271 Tag_PCS_config,
272 Tag_ABI_PCS_R9_use,
273 Tag_ABI_PCS_RW_data,
274 Tag_ABI_PCS_RO_data,
275 Tag_ABI_PCS_GOT_use,
276 Tag_ABI_PCS_wchar_t,
277 Tag_ABI_FP_rounding,
278 Tag_ABI_FP_denormal,
279 Tag_ABI_FP_exceptions,
280 Tag_ABI_FP_user_exceptions,
281 Tag_ABI_FP_number_model,
75375b3e
MGD
282 Tag_ABI_align_needed,
283 Tag_ABI_align_preserved,
ee065d83
PB
284 Tag_ABI_enum_size,
285 Tag_ABI_HardFP_use,
286 Tag_ABI_VFP_args,
287 Tag_ABI_WMMX_args,
288 Tag_ABI_optimization_goals,
289 Tag_ABI_FP_optimization_goals,
91e22acd 290 /* 32 is generic (Tag_compatibility). */
8e79c3df
CM
291 Tag_undefined33 = 33,
292 Tag_CPU_unaligned_access,
91e22acd 293 Tag_undefined35,
75375b3e 294 Tag_FP_HP_extension,
8e79c3df 295 Tag_undefined37,
91e22acd
AS
296 Tag_ABI_FP_16bit_format,
297 Tag_undefined39,
cd21e546
MGD
298 Tag_undefined40,
299 Tag_undefined41,
300 Tag_MPextension_use,
301 Tag_undefined_43,
302 Tag_DIV_use,
91e22acd
AS
303 Tag_nodefaults = 64,
304 Tag_also_compatible_with,
305 Tag_T2EE_use,
306 Tag_conformance,
307 Tag_Virtualization_use,
308 Tag_undefined69,
75375b3e
MGD
309 Tag_MPextension_use_legacy,
310
311 /* The following tags are legacy names for other tags. */
312 Tag_VFP_arch = Tag_FP_arch,
313 Tag_ABI_align8_needed = Tag_ABI_align_needed,
314 Tag_ABI_align8_preserved = Tag_ABI_align_preserved,
315 Tag_VFP_HP_extension = Tag_FP_HP_extension
ee065d83
PB
316};
317
318#endif
319
e16bb312 320/* The name of the note section used to identify arm variants. */
5a6c6817 321#define ARM_NOTE_SECTION ".note.gnu.arm.ident"
40a18ebd
NC
322
323/* Special section names. */
324#define ELF_STRING_ARM_unwind ".ARM.exidx"
325#define ELF_STRING_ARM_unwind_info ".ARM.extab"
326#define ELF_STRING_ARM_unwind_once ".gnu.linkonce.armexidx."
327#define ELF_STRING_ARM_unwind_info_once ".gnu.linkonce.armextab."
328
35fc36a8
RS
329enum arm_st_branch_type {
330 ST_BRANCH_TO_ARM,
331 ST_BRANCH_TO_THUMB,
63e1a0fc
PB
332 ST_BRANCH_LONG,
333 ST_BRANCH_UNKNOWN
35fc36a8
RS
334};
335
336#define ARM_SYM_BRANCH_TYPE(SYM) \
337 ((enum arm_st_branch_type) (SYM)->st_target_internal)
338
8725b940 339#endif /* _ELF_ARM_H */
This page took 0.501701 seconds and 4 git commands to generate.