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