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