| 1 | /* ARM ELF support for BFD. | 
|---|
| 2 | Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. | 
|---|
| 3 |  | 
|---|
| 4 | This file is part of BFD, the Binary File Descriptor library. | 
|---|
| 5 |  | 
|---|
| 6 | This program is free software; you can redistribute it and/or modify | 
|---|
| 7 | it under the terms of the GNU General Public License as published by | 
|---|
| 8 | the Free Software Foundation; either version 2 of the License, or | 
|---|
| 9 | (at your option) any later version. | 
|---|
| 10 |  | 
|---|
| 11 | This program is distributed in the hope that it will be useful, | 
|---|
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 14 | GNU General Public License for more details. | 
|---|
| 15 |  | 
|---|
| 16 | You should have received a copy of the GNU General Public License | 
|---|
| 17 | along with this program; if not, write to the Free Software Foundation, | 
|---|
| 18 | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ | 
|---|
| 19 |  | 
|---|
| 20 | #ifndef _ELF_ARM_H | 
|---|
| 21 | #define _ELF_ARM_H | 
|---|
| 22 |  | 
|---|
| 23 | #include "elf/reloc-macros.h" | 
|---|
| 24 |  | 
|---|
| 25 | /* Processor specific flags for the ELF header e_flags field.  */ | 
|---|
| 26 | #define EF_ARM_RELEXEC     0x01 | 
|---|
| 27 | #define EF_ARM_HASENTRY    0x02 | 
|---|
| 28 | #define EF_ARM_INTERWORK   0x04 | 
|---|
| 29 | #define EF_ARM_APCS_26     0x08 | 
|---|
| 30 | #define EF_ARM_APCS_FLOAT  0x10 | 
|---|
| 31 | #define EF_ARM_PIC         0x20 | 
|---|
| 32 | #define EF_ARM_ALIGN8      0x40         /* 8-bit structure alignment is in use.  */ | 
|---|
| 33 | #define EF_ARM_NEW_ABI     0x80 | 
|---|
| 34 | #define EF_ARM_OLD_ABI     0x100 | 
|---|
| 35 | #define EF_ARM_SOFT_FLOAT  0x200 | 
|---|
| 36 | #define EF_ARM_VFP_FLOAT   0x400 | 
|---|
| 37 | #define EF_ARM_MAVERICK_FLOAT 0x800 | 
|---|
| 38 |  | 
|---|
| 39 | /* Other constants defined in the ARM ELF spec. version B-01.  */ | 
|---|
| 40 | #define EF_ARM_SYMSARESORTED 0x04       /* NB conflicts with EF_INTERWORK */ | 
|---|
| 41 | #define EF_ARM_DYNSYMSUSESEGIDX 0x08    /* NB conflicts with EF_APCS26 */ | 
|---|
| 42 | #define EF_ARM_MAPSYMSFIRST 0x10        /* NB conflicts with EF_APCS_FLOAT */ | 
|---|
| 43 | #define EF_ARM_EABIMASK      0xFF000000 | 
|---|
| 44 |  | 
|---|
| 45 | #define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) | 
|---|
| 46 | #define EF_ARM_EABI_UNKNOWN  0x00000000 | 
|---|
| 47 | #define EF_ARM_EABI_VER1     0x01000000 | 
|---|
| 48 | #define EF_ARM_EABI_VER2     0x02000000 | 
|---|
| 49 |  | 
|---|
| 50 | /* Local aliases for some flags to match names used by COFF port.  */ | 
|---|
| 51 | #define F_INTERWORK        EF_ARM_INTERWORK | 
|---|
| 52 | #define F_APCS26           EF_ARM_APCS_26 | 
|---|
| 53 | #define F_APCS_FLOAT       EF_ARM_APCS_FLOAT | 
|---|
| 54 | #define F_PIC              EF_ARM_PIC | 
|---|
| 55 | #define F_SOFT_FLOAT       EF_ARM_SOFT_FLOAT | 
|---|
| 56 | #define F_VFP_FLOAT        EF_ARM_VFP_FLOAT | 
|---|
| 57 |  | 
|---|
| 58 | /* Additional symbol types for Thumb.  */ | 
|---|
| 59 | #define STT_ARM_TFUNC      STT_LOPROC   /* A Thumb function.  */ | 
|---|
| 60 | #define STT_ARM_16BIT      STT_HIPROC   /* A Thumb label.  */ | 
|---|
| 61 |  | 
|---|
| 62 | /* ARM-specific values for sh_flags.  */ | 
|---|
| 63 | #define SHF_ENTRYSECT      0x10000000   /* Section contains an entry point.  */ | 
|---|
| 64 | #define SHF_COMDEF         0x80000000   /* Section may be multiply defined in the input to a link step.  */ | 
|---|
| 65 |  | 
|---|
| 66 | /* ARM-specific program header flags.  */ | 
|---|
| 67 | #define PF_ARM_SB          0x10000000   /* Segment contains the location addressed by the static base.  */ | 
|---|
| 68 | #define PF_ARM_PI          0x20000000   /* Segment is position-independent.  */ | 
|---|
| 69 | #define PF_ARM_ABS         0x40000000   /* Segment must be loaded at its base address.  */ | 
|---|
| 70 |  | 
|---|
| 71 | /* Relocation types.  */ | 
|---|
| 72 |  | 
|---|
| 73 | START_RELOC_NUMBERS (elf_arm_reloc_type) | 
|---|
| 74 | RELOC_NUMBER (R_ARM_NONE,             0) | 
|---|
| 75 | RELOC_NUMBER (R_ARM_PC24,             1) | 
|---|
| 76 | RELOC_NUMBER (R_ARM_ABS32,            2) | 
|---|
| 77 | RELOC_NUMBER (R_ARM_REL32,            3) | 
|---|
| 78 | #ifdef OLD_ARM_ABI | 
|---|
| 79 | RELOC_NUMBER (R_ARM_ABS8,             4) | 
|---|
| 80 | RELOC_NUMBER (R_ARM_ABS16,            5) | 
|---|
| 81 | RELOC_NUMBER (R_ARM_ABS12,            6) | 
|---|
| 82 | RELOC_NUMBER (R_ARM_THM_ABS5,         7) | 
|---|
| 83 | RELOC_NUMBER (R_ARM_THM_PC22,         8) | 
|---|
| 84 | RELOC_NUMBER (R_ARM_SBREL32,          9) | 
|---|
| 85 | RELOC_NUMBER (R_ARM_AMP_VCALL9,      10) | 
|---|
| 86 | RELOC_NUMBER (R_ARM_THM_PC11,        11)   /* Cygnus extension to abi: Thumb unconditional branch.  */ | 
|---|
| 87 | RELOC_NUMBER (R_ARM_THM_PC9,         12)   /* Cygnus extension to abi: Thumb conditional branch.  */ | 
|---|
| 88 | RELOC_NUMBER (R_ARM_GNU_VTINHERIT,   13) | 
|---|
| 89 | RELOC_NUMBER (R_ARM_GNU_VTENTRY,     14) | 
|---|
| 90 | #else /* not OLD_ARM_ABI */ | 
|---|
| 91 | RELOC_NUMBER (R_ARM_PC13,             4) | 
|---|
| 92 | RELOC_NUMBER (R_ARM_ABS16,            5) | 
|---|
| 93 | RELOC_NUMBER (R_ARM_ABS12,            6) | 
|---|
| 94 | RELOC_NUMBER (R_ARM_THM_ABS5,         7) | 
|---|
| 95 | RELOC_NUMBER (R_ARM_ABS8,             8) | 
|---|
| 96 | RELOC_NUMBER (R_ARM_SBREL32,          9) | 
|---|
| 97 | RELOC_NUMBER (R_ARM_THM_PC22,        10) | 
|---|
| 98 | RELOC_NUMBER (R_ARM_THM_PC8,         11) | 
|---|
| 99 | RELOC_NUMBER (R_ARM_AMP_VCALL9,      12) | 
|---|
| 100 | RELOC_NUMBER (R_ARM_SWI24,           13) | 
|---|
| 101 | RELOC_NUMBER (R_ARM_THM_SWI8,        14) | 
|---|
| 102 | RELOC_NUMBER (R_ARM_XPC25,           15) | 
|---|
| 103 | RELOC_NUMBER (R_ARM_THM_XPC22,       16) | 
|---|
| 104 | #endif /* not OLD_ARM_ABI */ | 
|---|
| 105 | RELOC_NUMBER (R_ARM_COPY,            20)   /* Copy symbol at runtime.  */ | 
|---|
| 106 | RELOC_NUMBER (R_ARM_GLOB_DAT,        21)   /* Create GOT entry.  */ | 
|---|
| 107 | RELOC_NUMBER (R_ARM_JUMP_SLOT,       22)   /* Create PLT entry.  */ | 
|---|
| 108 | RELOC_NUMBER (R_ARM_RELATIVE,        23)   /* Adjust by program base.  */ | 
|---|
| 109 | RELOC_NUMBER (R_ARM_GOTOFF,          24)   /* 32 bit offset to GOT.  */ | 
|---|
| 110 | RELOC_NUMBER (R_ARM_GOTPC,           25)   /* 32 bit PC relative offset to GOT.  */ | 
|---|
| 111 | RELOC_NUMBER (R_ARM_GOT32,           26)   /* 32 bit GOT entry.  */ | 
|---|
| 112 | RELOC_NUMBER (R_ARM_PLT32,           27)   /* 32 bit PLT address.  */ | 
|---|
| 113 | #ifdef OLD_ARM_ABI | 
|---|
| 114 | FAKE_RELOC   (FIRST_INVALID_RELOC,   28) | 
|---|
| 115 | FAKE_RELOC   (LAST_INVALID_RELOC,   249) | 
|---|
| 116 | #else /* not OLD_ARM_ABI */ | 
|---|
| 117 | FAKE_RELOC   (FIRST_INVALID_RELOC1,  28) | 
|---|
| 118 | FAKE_RELOC   (LAST_INVALID_RELOC1,   31) | 
|---|
| 119 | RELOC_NUMBER (R_ARM_ALU_PCREL7_0,    32) | 
|---|
| 120 | RELOC_NUMBER (R_ARM_ALU_PCREL15_8,   33) | 
|---|
| 121 | RELOC_NUMBER (R_ARM_ALU_PCREL23_15,  34) | 
|---|
| 122 | RELOC_NUMBER (R_ARM_LDR_SBREL11_0,   35) | 
|---|
| 123 | RELOC_NUMBER (R_ARM_ALU_SBREL19_12,  36) | 
|---|
| 124 | RELOC_NUMBER (R_ARM_ALU_SBREL27_20,  37) | 
|---|
| 125 | FAKE_RELOC   (FIRST_INVALID_RELOC2,  38) | 
|---|
| 126 | FAKE_RELOC   (LAST_INVALID_RELOC2,   99) | 
|---|
| 127 | RELOC_NUMBER (R_ARM_GNU_VTENTRY,    100) | 
|---|
| 128 | RELOC_NUMBER (R_ARM_GNU_VTINHERIT,  101) | 
|---|
| 129 | RELOC_NUMBER (R_ARM_THM_PC11,       102)   /* Cygnus extension to abi: Thumb unconditional branch.  */ | 
|---|
| 130 | RELOC_NUMBER (R_ARM_THM_PC9,        103)   /* Cygnus extension to abi: Thumb conditional branch.  */ | 
|---|
| 131 | FAKE_RELOC   (FIRST_INVALID_RELOC3, 104) | 
|---|
| 132 | FAKE_RELOC   (LAST_INVALID_RELOC3,  248) | 
|---|
| 133 | RELOC_NUMBER (R_ARM_RXPC25,         249) | 
|---|
| 134 | #endif /* not OLD_ARM_ABI */ | 
|---|
| 135 | RELOC_NUMBER (R_ARM_RSBREL32,       250) | 
|---|
| 136 | RELOC_NUMBER (R_ARM_THM_RPC22,      251) | 
|---|
| 137 | RELOC_NUMBER (R_ARM_RREL32,         252) | 
|---|
| 138 | RELOC_NUMBER (R_ARM_RABS32,         253) | 
|---|
| 139 | RELOC_NUMBER (R_ARM_RPC24,          254) | 
|---|
| 140 | RELOC_NUMBER (R_ARM_RBASE,          255) | 
|---|
| 141 | END_RELOC_NUMBERS (R_ARM_max) | 
|---|
| 142 |  | 
|---|
| 143 | /* The name of the note section used to identify arm variants.  */ | 
|---|
| 144 | #define ARM_NOTE_SECTION ".note.gnu.arm.ident" | 
|---|
| 145 |  | 
|---|
| 146 | #endif /* _ELF_ARM_H */ | 
|---|