|
1 /* |
|
2 * Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of the License "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * lifted from the ARMELF spec |
|
16 * |
|
17 */ |
|
18 |
|
19 |
|
20 #ifndef __ELFDEFS_H__ |
|
21 #define __ELFDEFS_H__ |
|
22 |
|
23 |
|
24 // ARMELF 3.1.2 |
|
25 // Data Representation |
|
26 typedef unsigned int Elf32_Addr; //Unsigned program address |
|
27 typedef unsigned short Elf32_Half; //Unsigned medium integer |
|
28 typedef unsigned int Elf32_Off; //Unsigned file offset |
|
29 typedef signed int Elf32_Sword; //Signed large integer |
|
30 typedef unsigned int Elf32_Word; //Unsigned large integer |
|
31 typedef unsigned char UChar; //Unsigned small integer |
|
32 |
|
33 typedef char* MemAddr; |
|
34 /* |
|
35 3.2 ELF Header |
|
36 Some object file control structures can grow, because the ELF header |
|
37 contains their actual sizes. If the object file format changes, a |
|
38 program may encounter control structures that are larger or smaller |
|
39 than expected. Programs might therefore ignore extra information. The |
|
40 treatment of missing information depends on context and will be |
|
41 specified when and if extensions are defined. |
|
42 */ |
|
43 #define EI_NIDENT 16 |
|
44 typedef struct { |
|
45 |
|
46 // marks the file as an object file and provide machine-independent |
|
47 // data with which to decode and interpret the file's contents. |
|
48 unsigned char e_ident[EI_NIDENT]; |
|
49 |
|
50 // identifies the object file type. |
|
51 Elf32_Half e_type; |
|
52 |
|
53 // specifies the required architecture for an individual file. |
|
54 Elf32_Half e_machine; |
|
55 |
|
56 // identifies the object file version. |
|
57 Elf32_Word e_version; |
|
58 |
|
59 // gives the virtual address to which the system first transfers |
|
60 // control, thus starting the process. If the file has no associated |
|
61 // entry point, this member holds zero. |
|
62 Elf32_Addr e_entry; |
|
63 |
|
64 // holds the program header table's file offset in bytes. If the |
|
65 // file has no program header table, this member holds zero. |
|
66 Elf32_Off e_phoff; |
|
67 |
|
68 // holds the section header table's file offset in bytes. If the |
|
69 // file has no section header table, this member holds zero. |
|
70 Elf32_Off e_shoff; |
|
71 |
|
72 // holds processor-specific flags associated with the file. Flag |
|
73 // names take the form EF_machine_flag. |
|
74 Elf32_Word e_flags; |
|
75 |
|
76 // holds the ELF header's size in bytes. |
|
77 Elf32_Half e_ehsize; |
|
78 |
|
79 // holds the size in bytes of one entry in the file's program |
|
80 // header table; all entries are the same size. |
|
81 Elf32_Half e_phentsize; |
|
82 |
|
83 // holds the number of entries in the program header table. |
|
84 // Thus the product of e_phentsize and e_phnum gives the table's |
|
85 // size in bytes. If a file has no program header table, e_phnum |
|
86 // holds the value zero. |
|
87 Elf32_Half e_phnum; |
|
88 |
|
89 // holds a section header's size in bytes. A section header is |
|
90 // one entry in the section header table; all entries are the same size. |
|
91 Elf32_Half e_shentsize; |
|
92 |
|
93 // holds the number of entries in the section header table. Thus |
|
94 // the product of e_shentsize and e_shnum gives the section header |
|
95 // table's size in bytes. If a file has no section header table, |
|
96 // e_shnum holds the value zero. |
|
97 Elf32_Half e_shnum; |
|
98 |
|
99 // holds the section header table index of the entry associated |
|
100 // with the section name string table. If the file has no section |
|
101 // name string table, this member holds the value SHN_UNDEF. |
|
102 Elf32_Half e_shstrndx; |
|
103 |
|
104 } Elf32_Ehdr; |
|
105 |
|
106 // values for e_type |
|
107 #define ET_NONE 0 // No file type |
|
108 #define ET_REL 1 // Re-locatable |
|
109 #define ET_EXEC 2 // Executable file |
|
110 #define ET_DYN 3 // Shared object |
|
111 #define ET_CORE 4 // Core file |
|
112 #define ET_LOPROC 0xff00 // Processor-specific |
|
113 #define ET_HIPROC 0xffff // Processor-specific |
|
114 |
|
115 //values for e_machine |
|
116 #define EM_NONE 0 // No machine |
|
117 #define EM_M32 1 // AT&T WE 32100 |
|
118 #define EM_SPARC 2 // SPARC |
|
119 #define EM_386 3 // Intel Architecture |
|
120 #define EM_68K 4 // Moto 68000 |
|
121 #define EM_88K 5 // Moto 88000 |
|
122 #define EM_860 7 // Intel 80860 |
|
123 #define EM_MIPS 8 // MIPS RS3000 Big-Endian |
|
124 #define EM_MIPS_RS4_BE 10 // MIPS RS4000 Big-Endian |
|
125 //#define RESERVED 11-16 Reserved for future use |
|
126 #define EM_ARM 40 //ARM/Thumb Architecture |
|
127 |
|
128 // values for e_version |
|
129 #define EV_NONE 0 // Invalid version |
|
130 #define EV_CURRENT 1 // Current version |
|
131 |
|
132 // ELF Identification |
|
133 #define EI_MAG0 0 // File identification |
|
134 #define EI_MAG1 1 // File identification |
|
135 #define EI_MAG2 2 // File identification |
|
136 #define EI_MAG3 3 // File identification |
|
137 #define EI_CLASS 4 // File class |
|
138 #define EI_DATA 5 // Data encoding |
|
139 #define EI_VERSION 6 // File version |
|
140 #define EI_PAD 7 // Start of padding bytes |
|
141 |
|
142 // values for e_ident[0-3] |
|
143 #define ELFMAG0 0x7f // e_ident[EI_MAG0] |
|
144 #define ELFMAG1 'E' // e_ident[EI_MAG1] |
|
145 #define ELFMAG2 'L' // e_ident[EI_MAG2] |
|
146 #define ELFMAG3 'F' // e_ident[EI_MAG3] |
|
147 |
|
148 // values for e_ident[EI_CLASS]- identifies the file's class, or capacity. |
|
149 #define ELFCLASSNONE 0 // Invalid class |
|
150 #define ELFCLASS32 1 // 32-bit objects |
|
151 #define ELFCLASS64 2 // 64-bit objects |
|
152 |
|
153 // values for e_ident[EI_DATA] - specifies the data encoding of the |
|
154 // processor-specific data in the object file. |
|
155 #define ELFDATANONE 0 // Invalid data encoding |
|
156 #define ELFDATA2LSB 1 // 2's complement , with LSB at lowest address. |
|
157 #define ELFDATA2MSB 2 // 2's complement , with MSB at lowest address. |
|
158 |
|
159 // ARM/THUMB specific values for e_flags |
|
160 |
|
161 // e_entry contains a program-loader entry point |
|
162 #define EF_ARM_HASENTRY 0x02 |
|
163 // Each subsection of the symbol table is sorted by symbol value |
|
164 #define EF_ARM_SYMSARESORTED 0x04 |
|
165 // Symbols in dynamic symbol tables that are defined in sections |
|
166 // included in program segment n have st_shndx = n+ 1. |
|
167 #define EF_ARM_DYNSYMSUSESEGIDX 0x8 |
|
168 // Mapping symbols precede other local symbols in the symbol table |
|
169 #define EF_ARM_MAPSYMSFIRST 0x10 |
|
170 // This masks an 8-bit version number, the version of the ARM EABI to |
|
171 // which this ELF file conforms. This EABI is version 2. A value of 0 |
|
172 // denotes unknown conformance. (current version is 0x02000000) |
|
173 #define EF_ARM_EABIMASK 0xFF000000 |
|
174 |
|
175 #define EF_ARM_EABI_VERSION 0x02000000 |
|
176 #define EF_ARM_BPABI_VERSION 0x04000000 |
|
177 |
|
178 /* |
|
179 3.3 Sections |
|
180 |
|
181 An object file's section header table lets one locate all the file's |
|
182 sections. The section header table is an array of Elf32_Shdr |
|
183 structures as described below. A section header table index is a |
|
184 subscript into this array. The ELF header's e_shoff member gives the |
|
185 byte offset from the beginning of the file to the section header |
|
186 table; e_shnum tells how many entries the section header table |
|
187 contains; e_shentsize gives the size in bytes of each entry. |
|
188 */ |
|
189 |
|
190 // Some section header table indexes are reserved; an object file will |
|
191 // not have sections for these special indexes. |
|
192 |
|
193 // marks an undefined, missing, irrelevant, or otherwise meaningless |
|
194 // section reference. |
|
195 #define SHN_UNDEF 0 |
|
196 // specifies the lower bound of the range of reserved indexes. |
|
197 #define SHN_LORESERVE 0xff00 |
|
198 // SHN_LOPROC-SHN_HIPRO - this inclusive range reserved for |
|
199 // processor-specific semantics. |
|
200 #define SHN_LOPROC 0xff00 |
|
201 #define SHN_HIPROC 0xff1f |
|
202 // Specifies absolute values for the corresponding reference. |
|
203 // For example, symbols defined relative to section number SHN_ABS have |
|
204 // absolute values and are not affected by relocation. |
|
205 #define SHN_ABS 0xfff1 |
|
206 // Symbols defined relative to this section are common symbols, |
|
207 // such as FORTRAN COMMON or unallocated C external variables. |
|
208 #define SHN_COMMON 0xfff2 |
|
209 // specifies the upper bound of the range of reserved indexes. |
|
210 #define SHN_HIRESERVE 0xffff |
|
211 |
|
212 typedef struct { |
|
213 |
|
214 // specifies the name of the section. Its value is an index into the |
|
215 // section header string table section [see String Tablebelow], |
|
216 // giving the location of a null-terminated string. |
|
217 Elf32_Word sh_name; |
|
218 |
|
219 // categorizes the section's contents and semantics. Section types |
|
220 // and their descriptions appear below. |
|
221 Elf32_Word sh_type; |
|
222 |
|
223 // Sections support 1-bit flags that describe miscellaneous |
|
224 // attributes. Flag definitions appear below. |
|
225 Elf32_Word sh_flags; |
|
226 |
|
227 // If the section will appear in the memory image of a process, this |
|
228 // member gives the address at which the section's first byte should |
|
229 // reside. Otherwise, the member contains 0. |
|
230 Elf32_Addr sh_addr; |
|
231 |
|
232 // gives the byte offset from the beginning of the file to the first |
|
233 // byte in the section.One section type, SHT_NOBITS described below, |
|
234 // occupies no space in the file, and its sh_offset member locates |
|
235 // the conceptual placement in the file. |
|
236 Elf32_Off sh_offset; |
|
237 |
|
238 // gives the section's size in bytes. Unless the section type is |
|
239 // SHT_NOBITS, the section occupies sh_size bytes in the file. A |
|
240 // section of type SHT_NOBITS may have a non-zero size, but it |
|
241 // occupies no space in the file. |
|
242 Elf32_Word sh_size; |
|
243 |
|
244 // holds a section header table index link, whose interpretation |
|
245 // depends on the section type. A table below describes the values. |
|
246 Elf32_Word sh_link; |
|
247 |
|
248 // holds extra information, whose interpretation depends on the |
|
249 // section type. A table below describes the values. |
|
250 Elf32_Word sh_info; |
|
251 |
|
252 // Some sections have address alignment constraints. For example, if |
|
253 // a section holds a doubleword, the system must ensure double-word |
|
254 // alignment for the entire section. That is, the value of sh_addr |
|
255 // must be congruent to 0, modulo the value of |
|
256 // sh_addralign. Currently, only 0 and positive integral powers of |
|
257 // two are allowed. Values 0 and 1 mean the section has no alignment |
|
258 // constraints. |
|
259 Elf32_Word sh_addralign; |
|
260 |
|
261 // Some sections hold a table of fixed-size entries, such as a |
|
262 // symbol table. For such a section, this member gives the size in |
|
263 // bytes of each entry. The member contains 0 if the section does |
|
264 // not hold a table of fixedsize entries. A section header's sh_type |
|
265 // member specifies the section's semantics. |
|
266 Elf32_Word sh_entsize; |
|
267 |
|
268 } Elf32_Shdr; |
|
269 |
|
270 // values for sh_type |
|
271 |
|
272 #define SHT_NULL 0 // marks the section header as inactive; it does |
|
273 // not have an associated section. Other members of the section |
|
274 // header have undefined values. |
|
275 #define SHT_PROGBITS 1 // The section holds information defined by the |
|
276 // program, whose format and meaning are determined solely by the |
|
277 // program. |
|
278 #define SHT_SYMTAB 2 //These sections hold a symbol table. |
|
279 #define SHT_STRTAB 3 // The section holds a string table. |
|
280 #define SHT_RELA 4 // The section holds relocation entries with |
|
281 // explicit addends, such as type Elf32_Rela for the 32-bit class of |
|
282 // object files. An object file may have multiple relocation |
|
283 // sections. See Relocationbelow for details. |
|
284 #define SHT_HASH 5 // The section holds a symbol hash table. |
|
285 #define SHT_DYNAMIC 6 // The section holds information for dynamic |
|
286 // linking. |
|
287 #define SHT_NOTE 7 // This section holds information that marks the |
|
288 // file in some way. |
|
289 #define SHT_NOBITS 8 // A section of this type occupies no space in |
|
290 // the file but otherwise resembles SHT_PROGBITS. Although this |
|
291 // section contains no bytes, the sh_offset member contains the |
|
292 // conceptual file offset. |
|
293 #define SHT_REL 9 // The section holds relocation entries without |
|
294 // explicit addends, such as type Elf32_Rel for the 32-bit class of |
|
295 // object files. An object file may have multiple relocation |
|
296 // sections. See Relocationbelow for details. |
|
297 #define SHT_SHLIB 10 // This section type is reserved but has |
|
298 // unspecified semantics. |
|
299 #define SHT_DYNSYM 11 // This section hold dynamic symbol information |
|
300 // SHT_LOPROC through SHT_HIPROC - Values in this inclusive range are |
|
301 // reserved for processor-specific semantics. |
|
302 #define SHT_LOPROC 0x70000000 |
|
303 #define SHT_ARM_EXIDX 0x70000001 |
|
304 #define SHT_HIPROC 0x7fffffff |
|
305 // Section types between SHT_LOUSER and SHT_HIUSER may be used by the |
|
306 // application, without conflicting with current or future |
|
307 // system-defined section types. |
|
308 #define SHT_LOUSER 0x80000000 // This value specifies the lower bound |
|
309 // of the range of indexes reserved for application programs. |
|
310 #define SHT_HIUSER 0xffffffff // This value specifies the upper bound |
|
311 // of the range of indexes reserved for application programs. |
|
312 |
|
313 // values for sh_flags |
|
314 |
|
315 // The section contains data that should be writable during process execution |
|
316 #define SHF_WRITE 0x1 |
|
317 // The section occupies memory during process execution. Some control |
|
318 // sections do not reside in the memory image of an object file; this |
|
319 // attribute is off for those sections |
|
320 #define SHF_ALLOC 0x2 |
|
321 // The section contains executable machine instructions. |
|
322 #define SHF_EXECINSTR 0x4 |
|
323 // Bits in this mask are reserved for processor-specific semantics. |
|
324 #define SHF_MASKPROC 0xf0000000 |
|
325 |
|
326 |
|
327 typedef struct { |
|
328 |
|
329 // holds an index into the object file's symbol string table, which |
|
330 // holds the character representations of the symbol names. |
|
331 Elf32_Word st_name; |
|
332 |
|
333 // gives the value of the associated symbol. Depending on the |
|
334 // context this may be an absolute value, an address, and so on |
|
335 Elf32_Addr st_value; |
|
336 |
|
337 // Many symbols have associated sizes. For example, a data object's |
|
338 // size is the number of bytes contained in the object. This member |
|
339 // holds 0 if the symbol has no size or an unknown size. |
|
340 Elf32_Word st_size; |
|
341 |
|
342 // This member specifies the symbol's type and binding |
|
343 // attributes. The following code shows how to manipulate the |
|
344 // values. |
|
345 #define ELF32_ST_BIND(i) ((i)>>4) |
|
346 #define ELF32_ST_TYPE(i) ((i)&0xf) |
|
347 #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) |
|
348 unsigned char st_info; |
|
349 |
|
350 // This member currently holds 0 and has no defined meaning. |
|
351 unsigned char st_other; |
|
352 |
|
353 |
|
354 #define ELF32_ST_VISIBILITY(o) ((o)&0x3) |
|
355 #define ELF64_ST_VISIBILITY(o) ((o)&0x3) |
|
356 |
|
357 // Every symbol table entry is defined in relation to some section; |
|
358 // this member holds the relevant section header table index. |
|
359 Elf32_Half st_shndx; |
|
360 |
|
361 } Elf32_Sym; |
|
362 |
|
363 // Local symbols are not visible outside the object file containing |
|
364 // their definition. Local symbols of the same name may exist in |
|
365 // multiple files without interfering with each other. |
|
366 #define STB_LOCAL 0 |
|
367 // Global symbols are visible to all object files being combined. One |
|
368 // file's definition of a global symbol will satisfy another file's |
|
369 // undefined reference to the same global symbol. |
|
370 #define STB_GLOBAL 1 |
|
371 // Weak symbols resemble global symbols, but their definitions have |
|
372 // lower precedence. Undefined weak symbols (weak references) may have |
|
373 // processor- or OS-specific semantics |
|
374 #define STB_WEAK 2 |
|
375 // STB_LOPROC through STB_HIPROC - values in this inclusive range are |
|
376 // reserved for processor-specific semantics. |
|
377 #define STB_LOPROC 13 |
|
378 #define STB_HIPROC 15 |
|
379 |
|
380 // The symbol's type is not specified. |
|
381 #define STT_NOTYPE 0 |
|
382 // The symbol is associated with a data object, such as a variable, an |
|
383 // array, and so on. |
|
384 #define STT_OBJECT 1 |
|
385 // The symbol is associated with a function or other executable code. |
|
386 #define STT_FUNC 2 |
|
387 // The symbol is associated with a section. Symbol table entries of |
|
388 // this type exist primarily for relocation and normally have |
|
389 // STB_LOCAL binding. |
|
390 #define STT_SECTION 3 |
|
391 // A file symbol has STB_LOCAL binding, its section index is SHN_A BS, |
|
392 // and it precedes the other STB_LOCAL symbols for the file, if it is |
|
393 // present. |
|
394 #define STT_FILE 4 |
|
395 // Values in this inclusive range are reserved for processor-specific |
|
396 // semantics. If a symbol's value refers to a specific location within |
|
397 // a section, its section index member, st_shndx, holds an index into |
|
398 // the section header table. As the section moves during relocation, |
|
399 // the symbol's value changes as well, and references to the symbol |
|
400 // continue to point to the same location in the program. Some special |
|
401 // section index values give other semantics. |
|
402 #define STT_LOPROC 13 |
|
403 #define STT_HIPROC 15 |
|
404 |
|
405 /* |
|
406 STV_DEFAULT |
|
407 The visibility of symbols with the STV_DEFAULT attribute is as specified by the symbol's |
|
408 binding type. That is, global and weak symbols are visible outside of their defining |
|
409 component, the executable file or shared object. Local symbols are hidden. Global and weak |
|
410 symbols can also be preempted, that is, they may by interposed by definitions of the same |
|
411 name in another component. |
|
412 |
|
413 STV_PROTECTED |
|
414 A symbol defined in the current component is protected if it is visible in other components |
|
415 but cannot be preempted. Any reference to such a symbol from within the defining component |
|
416 must be resolved to the definition in that component, even if there is a definition in |
|
417 another component that would interpose by the default rules. A symbol with STB_LOCAL binding |
|
418 will not have STV_PROTECTED visibility. |
|
419 |
|
420 STV_HIDDEN |
|
421 A symbol defined in the current component is hidden if its name is not visible to other |
|
422 components. Such a symbol is necessarily protected. This attribute is used to control |
|
423 the external interface of a component. An object named by such a symbol may still be |
|
424 referenced from another component if its address is passed outside. |
|
425 |
|
426 A hidden symbol contained in a relocatable object is either removed or converted to |
|
427 STB_LOCAL binding by the link-editor when the relocatable object is included in an |
|
428 executable file or shared object. |
|
429 |
|
430 STV_INTERNAL |
|
431 This visibility attribute is currently reserved. |
|
432 */ |
|
433 #define STV_DEFAULT 0 |
|
434 #define STV_INTERNAL 1 |
|
435 #define STV_HIDDEN 2 |
|
436 #define STV_PROTECTED 3 |
|
437 |
|
438 // Relocation Entries |
|
439 |
|
440 typedef struct { |
|
441 |
|
442 // r_offset gives the location at which to apply the relocation |
|
443 // action. For a relocatable file, the value is the byte offset from |
|
444 // the beginning of the section to the storage unit affected by the |
|
445 // relocation. For an executable file or a shared object, the value |
|
446 // is the virtual address of the storage unit affected by the |
|
447 // relocation. |
|
448 Elf32_Addr r_offset; |
|
449 |
|
450 // r_info gives both the symbol table index with respect to which |
|
451 // the relocation must be made, and the type of relocation to |
|
452 // apply. For example, a call instruction's relocation entry would |
|
453 // hold the symbol table index of the function being called. If the |
|
454 // index is STN_UNDEF, the undefined symbol index, the relocation |
|
455 // uses 0 as the symbol value. Relocation types are |
|
456 // processor-specific; descriptions of their behavior appear in |
|
457 // section 4.5, Relocation types. When the text in section 4.5 |
|
458 // refers to a relocation entry's relocation type or symbol table |
|
459 // index, it means the result of applying ELF32_R_TYPE or |
|
460 // ELF32_R_SYM, respectively, to the entry's r_info member. |
|
461 |
|
462 #define ELF32_R_SYM(i) ((i)>>8) |
|
463 #define ELF32_R_TYPE(i) ((unsigned char)(i)) |
|
464 #define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t)) |
|
465 |
|
466 Elf32_Word r_info; |
|
467 } Elf32_Rel; |
|
468 |
|
469 typedef struct { |
|
470 Elf32_Addr r_offset; |
|
471 Elf32_Word r_info; |
|
472 Elf32_Sword r_addend; |
|
473 } Elf32_Rela; |
|
474 |
|
475 // Program Header |
|
476 |
|
477 typedef struct { |
|
478 |
|
479 // p_type tells what kind of segment this array element describes or |
|
480 // how to interpret the array element's information. Type values and |
|
481 // their meanings are given below. |
|
482 Elf32_Word p_type; |
|
483 |
|
484 // p_offset gives the offset from the start of the file at which the |
|
485 // first byte of the segment resides. |
|
486 Elf32_Off p_offset; |
|
487 |
|
488 // p_vaddr gives the virtual address at which the first byte of the |
|
489 // segment resides in memory. |
|
490 Elf32_Addr p_vaddr; |
|
491 |
|
492 // p_paddr - On systems for which physical addressing is relevant, |
|
493 // this member is reserved for the segment's physical address. This |
|
494 // member requires operating system specific information. |
|
495 Elf32_Addr p_paddr; |
|
496 |
|
497 // p_filesz gives the number of bytes in the file image of the |
|
498 // segment; it may be zero. |
|
499 Elf32_Word p_filesz; |
|
500 |
|
501 // p_memsz gives the number of bytes in the memory image of the |
|
502 // segment; it may be zero. |
|
503 Elf32_Word p_memsz; |
|
504 |
|
505 // p_flags gives flags relevant to the segment. Defined flag values |
|
506 // are given below. |
|
507 Elf32_Word p_flags; |
|
508 |
|
509 // p_align - Loadable process segments must have congruent values |
|
510 // for p_vaddr and p_offset, modulo the page size. This member gives |
|
511 // the value to which the segments are aligned in memory and in the |
|
512 // file. Values 0 and 1 mean that no alignment is |
|
513 // required. Otherwise, p_align should be a positive, integral power |
|
514 // of 2, and p_vaddr should equal p_offset, modulo p_align. |
|
515 Elf32_Word p_align; |
|
516 |
|
517 } Elf32_Phdr; |
|
518 |
|
519 // Segment types - values for p_type |
|
520 |
|
521 // The array element is unused; other members' values are |
|
522 // undefined. This type lets the program header table have ignored |
|
523 // entries. |
|
524 #define PT_NULL 0 |
|
525 // The array element specifies a loadable segment, described by |
|
526 // p_filesz and p_memsz (for additional explanation, see |
|
527 // PT_LOAD below). |
|
528 #define PT_LOAD 1 |
|
529 // The array element specifies dynamic linking information. See |
|
530 // subsection 4.7. |
|
531 #define PT_DYNAMIC 2 |
|
532 // The array element specifies the location and size of a |
|
533 // null-terminated pathname to invoke as an interpreter. |
|
534 #define PT_INTERP 3 |
|
535 // The array element specifies the location and size of auxiliary |
|
536 // information. |
|
537 #define PT_NOTE 4 |
|
538 // This segment type is reserved but has unspecified semantics. |
|
539 #define PT_SHLIB 5 |
|
540 // The array element, if present, specifies the location and size of |
|
541 // the program header table itself (for additional explanation, see |
|
542 // PT_ PHDR below). |
|
543 #define PT_PHDR 6 |
|
544 // Values in the inclusive [PT_LOPROC, PT_HIPROC] range are reserved |
|
545 // for processor-specific semantics. |
|
546 #define PT_LOPROC 0x70000000 |
|
547 #define PT_HIPROC 0x7fffffff |
|
548 |
|
549 // values for p_flags |
|
550 // The segment may be executed. |
|
551 #define PF_X 1 |
|
552 // The segment may be written to. |
|
553 #define PF_W 2 |
|
554 // The segment may be read. |
|
555 #define PF_R 4 |
|
556 // Reserved for processor-specific purposes (see 4.6, Program |
|
557 // headers). |
|
558 #define PF_MASKPROC 0xf0000000 |
|
559 #define PF_ARM_ENTRY 0x80000000 |
|
560 |
|
561 |
|
562 // Relocation types |
|
563 |
|
564 // ELF defines two sorts of relocation directive, SHT_REL, and |
|
565 // SHT_RELA. Both identify: |
|
566 // |
|
567 // o A section containing the storage unit - byte, half-word, word, or |
|
568 // instruction - being relocated. |
|
569 // o An offset within the section - or the address within an |
|
570 // executable program - of the storage unit itself. |
|
571 // o A symbol,the value of which helps to define a new value for the |
|
572 // storage unit. |
|
573 // o A relocation typethat defines the computation to be |
|
574 // performed. Computations are performed using 2's complement, 32-bit, |
|
575 // unsigned arithmetic with silent overflow. |
|
576 // o An addend, that also helps to define a new value for the storage |
|
577 // unit. |
|
578 // |
|
579 // The addend may be encoded wholly in a field of the storage unit |
|
580 // being relocated - relocation sort SHT_REL - or partly there and |
|
581 // partly in the addendfield of the relocation directive - relocation |
|
582 // sort SHT_RELA. Tables below describe the computation associated |
|
583 // with each relocation type, using the following notation: |
|
584 // |
|
585 // A - denotes the addend used to compute the new value of the storage |
|
586 // unit being relocated. |
|
587 // - It is the value extracted from the storage unit being relocated |
|
588 // (relocation directives of sort SHT_REL) or the sum of that |
|
589 // value and the r_addend field of the relocation directive (sort |
|
590 // SHT_RELA). |
|
591 // - If it has a unit, the unit is bytes. An encoded address or |
|
592 // offset value is converted to bytes on extraction from a storage |
|
593 // unit and re-encoded on insertion into a storage unit. |
|
594 // |
|
595 // P - denotes the place (section offset or address of the storage |
|
596 // unit) being re-located. It is the sum of the r_offset field of |
|
597 // the relocation directive and the base address of the section |
|
598 // being re-located. |
|
599 // |
|
600 // S - denotes the value of the symbol whose symbol table index is |
|
601 // given in the r_info field of the relocation directive. |
|
602 // |
|
603 // B - denotes the base address of the consolidated section in which |
|
604 // the symbol is defined. For relocations of type R_ARM_SBREL32, |
|
605 // this is the least static data address (the static base). |
|
606 // |
|
607 // relocation types 0-16 are generic |
|
608 // Name Type Field Computation |
|
609 //==================================================================== |
|
610 #define R_ARM_NONE 0 // Any No relocation. |
|
611 #define R_ARM_PC24 1 // ARM B/BL S - P + A |
|
612 #define R_ARM_ABS32 2 // 32-bit word S + A |
|
613 #define R_ARM_REL32 3 // 32-bit word S - P + A |
|
614 #define R_ARM_PC13 4 // ARM LDR r, [pc,...] S - P + A |
|
615 #define R_ARM_ABS16 5 // 16-bit half-word S + A |
|
616 #define R_ARM_ABS12 6 // ARM LDR/STR S + A |
|
617 #define R_ARM_THM_ABS5 7 // Thumb LDR/STR S + A |
|
618 #define R_ARM_ABS8 8 // 8-bit byte S + A |
|
619 #define R_ARM_SBREL32 9 // 32-bit word S - B + A |
|
620 #define R_ARM_THM_PC22 10 // Thumb BL pair S - P + A |
|
621 #define R_ARM_THM_PC8 11 // Thumb LDR r, [pc,...] S - P + A |
|
622 #define R_ARM_AMP_VCALL9 12 // AMP VCALL Obsolete - SA-1500 |
|
623 #define R_ARM_SWI24 13 // ARM SWI S + A |
|
624 #define R_ARM_THM_SWI8 14 // Thumb SWI S + A |
|
625 #define R_ARM_XPC25 15 // ARM BLX S - P + A |
|
626 #define R_ARM_THM_XPC22 16 // Thumb BLX pair S - P + A |
|
627 |
|
628 // relocation types 17-31 are reserved for ARM Linux |
|
629 #define R_ARM_GLOB_DAT 21 // PLT related S + A |
|
630 #define R_ARM_JUMP_SLOT 22 // PLT related S + A |
|
631 #define R_ARM_RELATIVE 23 // 32-bit word B(S) + A |
|
632 |
|
633 #define R_ARM_GOT_BREL 26 // |
|
634 |
|
635 #define R_ARM_ALU_PCREL_7_0 32 // ARM ADD/SUB (S - P + A) & 0x000000FF |
|
636 #define R_ARM_ALU_PCREL_15_8 33 // ARM ADD/SUB (S - P + A) & 0x0000FF00 |
|
637 #define R_ARM_ALU_PCREL_23_15 34 // ARM ADD/SUB (S - P + A) & 0x00FF0000 |
|
638 #define R_ARM_LDR_SBREL_11_0 35 // ARM ADD/SUB (S - B + A) & 0x00000FFF |
|
639 #define R_ARM_ALU_SBREL_19_12 36 // ARM ADD/SUB (S - B + A) & 0x000FF000 |
|
640 #define R_ARM_ALU_SBREL_27_20 37 // ARM ADD/SUB (S - B + A) & 0x0FF00000 |
|
641 |
|
642 // Dynamic relocation types |
|
643 |
|
644 // A small set of relocation types supports relocating executable ELF |
|
645 // files. They are used only in a relocation section embedded in a |
|
646 // dynamic segment (see section 4.7, Dynamic linking and |
|
647 // relocation). They cannot be used in a relocation section in a |
|
648 // re-locatable ELF file. In Figure 4-13 below: |
|
649 // |
|
650 // .S is the displacement from its statically linked virtual address |
|
651 // of the segment containing the symbol definition. |
|
652 // |
|
653 // .P is the displacement from its statically linked virtual address |
|
654 // of the segment containing the place to be relocated. |
|
655 // |
|
656 // .SB is the displacement of the segment pointed to by the static |
|
657 // base (PF_ARM_SB is set in the p_flags field of this segment's |
|
658 // program header - see 4.6, Program headers). |
|
659 |
|
660 |
|
661 // types 249 - 255 are dynamic relocation types and are only used in dynamic sections |
|
662 #define R_ARM_RXPC25 249 // ARM BLX (.S - .P) + A |
|
663 // For calls between program segments. |
|
664 #define R_ARM_RSBREL32 250 // Word (.S - .SB) + A |
|
665 // For an offset from SB, the static base. |
|
666 #define R_ARM_THM_RPC22 251 // Thumb BL/BLX pair (.S - .P) + A |
|
667 // For calls between program segments. |
|
668 #define R_ARM_RREL32 252 // Word (.S - .P) + A |
|
669 // For on offset between two segments. |
|
670 #define R_ARM_RABS32 253 // Word .S + A |
|
671 // For the address of a location in the target segment. |
|
672 #define R_ARM_RPC24 254 // ARM B/BL (.S - .P) + A |
|
673 // For calls between program segments. |
|
674 #define R_ARM_RBASE 255 // None Identifies the segment being relocated by |
|
675 // the following relocation directives. |
|
676 // DYNAMIC SEGMENT |
|
677 // The dynamic segment begins with a dynamic section containing an array of structures of type: |
|
678 typedef struct Elf32_Dyn { |
|
679 Elf32_Sword d_tag; |
|
680 Elf32_Word d_val; |
|
681 } Elf32_Dyn; |
|
682 |
|
683 // This entry marks the end of the dynamic array. mandatory |
|
684 #define DT_NULL 0 |
|
685 // Index in the string table of the name of a needed library. multiple |
|
686 #define DT_NEEDED 1 |
|
687 // These entries are unused by versions 1-2 of the ARM EABI. unused |
|
688 #define DT_PLTRELSZ 2 |
|
689 #define DT_PLTGOT 3 |
|
690 // The offset of the hash table section in the dynamic segment. mandatory |
|
691 #define DT_HASH 4 |
|
692 // The offset of the string table section in the dynamic segment. mandatory |
|
693 #define DT_STRTAB 5 |
|
694 // The offset of the symbol table section in the dynamic segment. mandatory |
|
695 #define DT_SYMTAB 6 |
|
696 // The offset in the dynamic segment of an SHT_RELA relocation |
|
697 // section, Its bytesize,and the byte size of an ARMRELA-type |
|
698 // relocation entry. optional |
|
699 #define DT_RELA 7 |
|
700 #define DT_RELASZ 8 |
|
701 #define DT_RELAENT 9 |
|
702 // The byte size of the string table section. mandatory |
|
703 #define DT_STRSZ 10 |
|
704 // The byte size of an ARM symbol table entry. mandatory |
|
705 #define DT_SYMENT 11 |
|
706 // These entries are unused by versions 1-2 of the ARM EABI. unused |
|
707 #define DT_INIT 12 |
|
708 #define DT_FINI 13 |
|
709 // The Index in the string table of the name of this shared object. mandatory |
|
710 #define DT_SONAME 14 |
|
711 // Unused by the ARM EABI. unused |
|
712 #define DT_RPATH 15 |
|
713 #define DT_SYMBOLIC 16 |
|
714 //The offset in the dynamic segment of an SHT_REL relocation section, |
|
715 //Its bytesize, and the byte size of an ARMREL-type relocation |
|
716 //entry. optional |
|
717 #define DT_REL 17 |
|
718 #define DT_RELSZ 18 |
|
719 #define DT_RELENT 19 |
|
720 // These entries are unused by versions 1-2 of the ARM EABI. unused |
|
721 #define DT_PLTREL 20 |
|
722 #define DT_DEBUG 21 |
|
723 #define DT_TEXTREL 22 |
|
724 #define DT_JMPREL 23 |
|
725 #define DT_BIND_NOW 24 |
|
726 #define DT_INIT_ARRAY 25 |
|
727 #define DT_FINI_ARRAY 26 |
|
728 #define DT_INIT_ARRAYSZ 27 |
|
729 #define DT_FINI_ARRAYSZ 28 |
|
730 |
|
731 #define DT_VERSYM 0x6ffffff0 /* see section 3.3.3.1 in bpabi*/ |
|
732 #define DT_RELCOUNT 0x6ffffffa |
|
733 #define DT_VERDEF 0x6ffffffc /* Address of version definition |
|
734 table */ |
|
735 #define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */ |
|
736 #define DT_VERNEED 0x6ffffffe /* Address of table with needed |
|
737 versions */ |
|
738 #define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */ |
|
739 |
|
740 // Values in this range are reserved to the ARM EABI. unused |
|
741 #define DT_LOPROC 0x70000000 |
|
742 #define DT_HIPROC 0x7fffffff |
|
743 #define DT_ARM_RESERVED1 0x70000000 |
|
744 /* Number of entries in the dynamic symbol table, including the initial dummy symbol. */ |
|
745 #define DT_ARM_SYMTABSZ_21 0x70000000 // For RVCT 2.1 |
|
746 #define DT_ARM_SYMTABSZ 0x70000001 // The DT_ARM_SYMTABSZ tag value has been changed from RVCT2.2 |
|
747 /* Holds the address of the pre-emption map for platforms that use the DLL static binding model. */ |
|
748 #define DT_ARM_PREEMPTMAP 0x70000002 |
|
749 #define DT_ARM_RESERVED2 0x70000003 |
|
750 #define DT_ARM_PLTGOTBASE 0x70000004 |
|
751 #define DT_ARM_PLTGOTLIMIT 0x70000005 |
|
752 |
|
753 // What the hash table looks like in the dynamic segment |
|
754 typedef struct Elf32_HashTable { |
|
755 Elf32_Word nBuckets; |
|
756 Elf32_Word nChains; |
|
757 // Elf32_Word bucket[nBuckets]; |
|
758 // Elf32_Word chain[nChains]; |
|
759 } Elf32_HashTable; |
|
760 |
|
761 |
|
762 typedef struct |
|
763 { |
|
764 Elf32_Half vd_version; /* Version revision */ |
|
765 Elf32_Half vd_flags; /* Version information */ |
|
766 Elf32_Half vd_ndx; /* Version Index */ |
|
767 Elf32_Half vd_cnt; /* Number of associated aux entries */ |
|
768 Elf32_Word vd_hash; /* Version name hash value */ |
|
769 Elf32_Word vd_aux; /* Offset in bytes to verdaux array */ |
|
770 Elf32_Word vd_next; /* Offset in bytes to next verdef |
|
771 entry */ |
|
772 } Elf32_Verdef; |
|
773 |
|
774 typedef struct |
|
775 { |
|
776 Elf32_Word vda_name; /* Version or dependency names */ |
|
777 Elf32_Word vda_next; /* Offset in bytes to next verdaux |
|
778 entry */ |
|
779 } Elf32_Verdaux; |
|
780 |
|
781 |
|
782 typedef struct |
|
783 { |
|
784 Elf32_Half vn_version; /* Version of structure */ |
|
785 Elf32_Half vn_cnt; /* Number of associated aux entries */ |
|
786 Elf32_Word vn_file; /* Offset of filename for this |
|
787 dependency */ |
|
788 Elf32_Word vn_aux; /* Offset in bytes to vernaux array */ |
|
789 Elf32_Word vn_next; /* Offset in bytes to next verneed |
|
790 entry */ |
|
791 } Elf32_Verneed; |
|
792 |
|
793 typedef struct { |
|
794 Elf32_Word vna_hash; |
|
795 Elf32_Half vna_flags; |
|
796 Elf32_Half vna_other; |
|
797 Elf32_Word vna_name; |
|
798 Elf32_Word vna_next; |
|
799 } Elf32_Vernaux; |
|
800 |
|
801 |
|
802 enum ESegmentType |
|
803 { |
|
804 ESegmentUndefined = SHN_UNDEF, // undefined or meaningless section/segment reference |
|
805 ESegmentRO, // Read Only (text) segment |
|
806 ESegmentRW, // Read Write (data) segment |
|
807 ESegmentDynamic, // Dynamic segment |
|
808 ESegmentABS = SHN_ABS, // Symbols defined relative to section number SHN_ABS have |
|
809 // absolute values and are not affected by relocation. |
|
810 ESegmentCommon = SHN_COMMON, // Symbols defined relative to section number SHN_ABS have |
|
811 // absolute values and are not affected by relocation. |
|
812 }; |
|
813 |
|
814 #endif |
|
815 |
|
816 |
|
817 |
|
818 |
|
819 |