1 /* Copyright (C) 2007-2010 The Android Open Source Project 2 ** 3 ** This software is licensed under the terms of the GNU General Public 4 ** License version 2, as published by the Free Software Foundation, and 5 ** may be copied, distributed, and modified under those terms. 6 ** 7 ** This program is distributed in the hope that it will be useful, 8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 ** GNU General Public License for more details. 11 */ 12 13 /* 14 * Contains declarations of types, constants and structures 15 * describing ELF file format. 16 */ 17 18 #ifndef ELFF_ELH_H_ 19 #define ELFF_ELH_H_ 20 21 #include <stdint.h> 22 #include "elff-common.h" 23 24 //============================================================================= 25 // ELF file definitions 26 //============================================================================= 27 28 /* 29 * ELF format documentation uses Elf##_Xxx notation for data types, where 30 * ## stands for CPU architecture (32, or 64 bit), and Xxx stands for a 31 * specific type. For the sake of compliance, we will follow doc's notation 32 * when defining types used in ELF file descriptors. However, for the sake of 33 * code simplicity, we will drop CPU architecture index from the types that 34 * have equal sizes on both, 32 and 64 bit architectures. 35 */ 36 37 /* 38 * Architecture independent types. 39 */ 40 41 typedef uint8_t Elf_Byte; 42 typedef int8_t Elf_Sbyte; 43 44 typedef uint16_t Elf_Half; 45 typedef int16_t Elf_Shalf; 46 47 typedef uint32_t Elf_Word; 48 typedef int32_t Elf_Sword; 49 50 typedef uint64_t Elf_Xword; 51 typedef int64_t Elf_Sxword; 52 53 /* 54 * Architecture dependent types. 55 */ 56 57 /* 32-bit ELF address. */ 58 typedef uint32_t Elf32_Addr; 59 /* 32-bit ELF offset. */ 60 typedef uint32_t Elf32_Off; 61 62 /* 64-bit ELF address. */ 63 typedef uint64_t Elf64_Addr; 64 /* 64-bit ELF offset. */ 65 typedef uint64_t Elf64_Off; 66 67 //============================================================================= 68 // ELF file header 69 //============================================================================= 70 71 /* Byte size of the fixed portion of ELF header. */ 72 #define EI_NIDENT 16 73 74 /* Common (architecture independent portion of) ELF file header, 75 * that starts at offset 0 in ELF file. 76 */ 77 typedef struct Elf_CommonHdr { 78 union { 79 struct { 80 /* ei_mag0 - ei_mag3 contain ELF header signature. See ELFMAGx bellow. */ 81 Elf_Byte ei_mag0; 82 Elf_Byte ei_mag1; 83 Elf_Byte ei_mag2; 84 Elf_Byte ei_mag3; 85 86 /* File class (32, or 64 bits). See ELFCLASSxxx bellow. */ 87 Elf_Byte ei_class; 88 89 /* Data encoding (endianness). See ELFDATAxxx bellow. */ 90 Elf_Byte ei_data; 91 92 /* ELF header version number. */ 93 Elf_Byte ei_version; 94 } ei_info; 95 unsigned char e_ident[EI_NIDENT]; 96 }; 97 98 /* File type (executable, shared object, etc.) */ 99 Elf_Half e_type; 100 101 /* Processor type. */ 102 Elf_Half e_machine; 103 104 /* File version. */ 105 Elf_Word e_version; 106 } Elf_CommonHdr; 107 108 109 /* ELF header signature. */ 110 #define ELFMAG0 0x7f 111 #define ELFMAG1 'E' 112 #define ELFMAG2 'L' 113 #define ELFMAG3 'F' 114 #define ELFMAG "\177ELF" 115 #define SELFMAG 4 116 117 /* 118 * Possible ei_class values. 119 */ 120 121 /* Invalid. */ 122 #define ELFCLASSNONE 0 123 /* It's 32-bit ELF file. */ 124 #define ELFCLASS32 1 125 /* It's 64-bit ELF file. */ 126 #define ELFCLASS64 2 127 128 /* 129 * Possible ei_data values. 130 */ 131 132 /* Invalid. */ 133 #define ELFDATANONE 0 134 /* ELF data is formatted in little-endian. */ 135 #define ELFDATA2LSB 1 136 /* ELF data is formatted in big-endian. */ 137 #define ELFDATA2MSB 2 138 139 /* Tempated (architecture dependent) ELF file header. 140 * Template param: 141 * Elf_Addr - Actual type for address encoding (Elf32_Addr, or Elf64_Addr). 142 * Elf_Off - Actual type for offset encoding (Elf32_Off, or Elf64_Off). 143 */ 144 template <typename Elf_Addr, typename Elf_Off> 145 struct Elf_FHdr { 146 /* Common header. */ 147 Elf_CommonHdr common; 148 149 /* Module entry point. */ 150 Elf_Addr e_entry; 151 152 /* Programm header table offset (in bytes) from the beginning of the file. 153 * Zero if there is no programm header in this file. 154 */ 155 Elf_Off e_phoff; 156 157 /* Section header table offset (in bytes) from the beginning of the file. 158 * Zero if there is no section header in this file. 159 */ 160 Elf_Off e_shoff; 161 162 /* Processor-specific flags. */ 163 Elf_Word e_flags; 164 165 /* This header size in bytes. */ 166 Elf_Half e_ehsize; 167 168 /* Byte size of an entry in programm header table. All entries 169 * in the table are the same size. 170 */ 171 Elf_Half e_phentsize; 172 173 /* Number of entries in programm header table. */ 174 Elf_Half e_phnum; 175 176 /* Byte size of an entry in section header table. All entries 177 * in the table are the same size. 178 */ 179 Elf_Half e_shentsize; 180 181 /* Number of entries in section header table. */ 182 Elf_Half e_shnum; 183 184 /* Zero-based index of an entry for name string table section in the section 185 * header table. If no such section exists in the file this field contains 186 * SHN_UNDEF value. 187 */ 188 Elf_Half e_shstrndx; 189 }; 190 /* 32-bit ELF header. */ 191 typedef Elf_FHdr<Elf32_Addr, Elf32_Off> Elf32_FHdr; 192 /* 64-bit ELF header. */ 193 typedef Elf_FHdr<Elf64_Addr, Elf64_Off> Elf64_FHdr; 194 195 //============================================================================= 196 // ELF section header 197 //============================================================================= 198 199 /* Templated (architecture dependent) section header for ELF file. 200 * Template param: 201 * Elf_Addr - Actual type for address encoding (Elf32_Addr, or Elf64_Addr). 202 * Elf_Off - Actual type for offset encoding (Elf32_Off, or Elf64_Off). 203 */ 204 template <typename Elf_Addr, typename Elf_Off> 205 struct Elf_SHdr { 206 /* Index (byte offset) of section name in the name string table section. */ 207 Elf_Word sh_name; 208 209 /* Section type and semantics. */ 210 Elf_Word sh_type; 211 212 /* Section flags and attributes. */ 213 Elf_Word sh_flags; 214 215 /* Section address in the memory image of the process. */ 216 Elf_Addr sh_addr; 217 218 /* Byte offset from the beginning of the ELF file to the first 219 * byte in the section. 220 */ 221 Elf_Off sh_offset; 222 223 /* Section size in bytes. */ 224 Elf_Word sh_size; 225 226 /* Section header table index link. Depends on section type. */ 227 Elf_Word sh_link; 228 229 /* Extra section information, depending on the section type. */ 230 Elf_Word sh_info; 231 232 /* Address alignment constrains. 0 and 1 means that section has no 233 * alignment constrains. 234 */ 235 Elf_Word sh_addralign; 236 237 /* Entry size for sections that hold some kind of a table. */ 238 Elf_Word sh_entsize; 239 }; 240 /* 32-bit section header. */ 241 typedef Elf_SHdr<Elf32_Addr, Elf32_Off> Elf32_SHdr; 242 /* 64-bit section header. */ 243 typedef Elf_SHdr<Elf64_Addr, Elf64_Off> Elf64_SHdr; 244 245 /* 246 * Special section indices 247 */ 248 #define SHN_UNDEF 0 249 #define SHN_LORESERVE 0xff00 250 #define SHN_LOPROC 0xff00 251 #define SHN_HIPROC 0xff1f 252 #define SHN_LOOS 0xff20 253 #define SHN_HIOS 0xff3f 254 #define SHN_ABS 0xfff1 255 #define SHN_COMMON 0xfff2 256 #define SHN_XINDEX 0xffff 257 #define SHN_HIRESERVE 0xffff 258 259 /* 260 * Values for sh_type 261 */ 262 #define SHT_NULL 0 263 #define SHT_PROGBITS 1 264 #define SHT_SYMTAB 2 265 #define SHT_STRTAB 3 266 #define SHT_RELA 4 267 #define SHT_HASH 5 268 #define SHT_DYNAMIC 6 269 #define SHT_NOTE 7 270 #define SHT_NOBITS 8 271 #define SHT_REL 9 272 #define SHT_SHLIB 10 273 #define SHT_DYNSYM 11 274 #define SHT_INIT_ARRAY 14 275 #define SHT_FINI_ARRAY 15 276 #define SHT_PREINIT_ARRAY 16 277 #define SHT_GROUP 17 278 #define SHT_SYMTAB_SHNDX 18 279 #define SHT_NUM 19 280 281 #endif // ELFF_ELH_H_ 282