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