1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/epoc32/include/tools/elfdefs.h Tue Mar 16 16:12:26 2010 +0000
1.3 @@ -0,0 +1,812 @@
1.4 +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// 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
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +// lifted from the ARMELF spec
1.18 +//
1.19 +//
1.20 +
1.21 +#ifndef __ELFDEFS_H__
1.22 +#define __ELFDEFS_H__
1.23 +
1.24 +
1.25 +// ARMELF 3.1.2
1.26 +// Data Representation
1.27 +typedef unsigned int Elf32_Addr; //Unsigned program address
1.28 +typedef unsigned short Elf32_Half; //Unsigned medium integer
1.29 +typedef unsigned int Elf32_Off; //Unsigned file offset
1.30 +typedef signed int Elf32_Sword; //Signed large integer
1.31 +typedef unsigned int Elf32_Word; //Unsigned large integer
1.32 +typedef unsigned char UChar; //Unsigned small integer
1.33 +
1.34 +typedef char* MemAddr;
1.35 +/*
1.36 +3.2 ELF Header
1.37 +Some object file control structures can grow, because the ELF header
1.38 +contains their actual sizes. If the object file format changes, a
1.39 +program may encounter control structures that are larger or smaller
1.40 +than expected. Programs might therefore ignore extra information. The
1.41 +treatment of missing information depends on context and will be
1.42 +specified when and if extensions are defined.
1.43 +*/
1.44 +#define EI_NIDENT 16
1.45 +typedef struct {
1.46 +
1.47 + // marks the file as an object file and provide machine-independent
1.48 + // data with which to decode and interpret the file's contents.
1.49 + unsigned char e_ident[EI_NIDENT];
1.50 +
1.51 + // identifies the object file type.
1.52 + Elf32_Half e_type;
1.53 +
1.54 + // specifies the required architecture for an individual file.
1.55 + Elf32_Half e_machine;
1.56 +
1.57 + // identifies the object file version.
1.58 + Elf32_Word e_version;
1.59 +
1.60 + // gives the virtual address to which the system first transfers
1.61 + // control, thus starting the process. If the file has no associated
1.62 + // entry point, this member holds zero.
1.63 + Elf32_Addr e_entry;
1.64 +
1.65 + // holds the program header table's file offset in bytes. If the
1.66 + // file has no program header table, this member holds zero.
1.67 + Elf32_Off e_phoff;
1.68 +
1.69 + // holds the section header table's file offset in bytes. If the
1.70 + // file has no section header table, this member holds zero.
1.71 + Elf32_Off e_shoff;
1.72 +
1.73 + // holds processor-specific flags associated with the file. Flag
1.74 + // names take the form EF_machine_flag.
1.75 + Elf32_Word e_flags;
1.76 +
1.77 + // holds the ELF header's size in bytes.
1.78 + Elf32_Half e_ehsize;
1.79 +
1.80 + // holds the size in bytes of one entry in the file's program
1.81 + // header table; all entries are the same size.
1.82 + Elf32_Half e_phentsize;
1.83 +
1.84 + // holds the number of entries in the program header table.
1.85 + // Thus the product of e_phentsize and e_phnum gives the table's
1.86 + // size in bytes. If a file has no program header table, e_phnum
1.87 + // holds the value zero.
1.88 + Elf32_Half e_phnum;
1.89 +
1.90 + // holds a section header's size in bytes. A section header is
1.91 + // one entry in the section header table; all entries are the same size.
1.92 + Elf32_Half e_shentsize;
1.93 +
1.94 + // holds the number of entries in the section header table. Thus
1.95 + // the product of e_shentsize and e_shnum gives the section header
1.96 + // table's size in bytes. If a file has no section header table,
1.97 + // e_shnum holds the value zero.
1.98 + Elf32_Half e_shnum;
1.99 +
1.100 + // holds the section header table index of the entry associated
1.101 + // with the section name string table. If the file has no section
1.102 + // name string table, this member holds the value SHN_UNDEF.
1.103 + Elf32_Half e_shstrndx;
1.104 +
1.105 +} Elf32_Ehdr;
1.106 +
1.107 +// values for e_type
1.108 +#define ET_NONE 0 // No file type
1.109 +#define ET_REL 1 // Re-locatable
1.110 +#define ET_EXEC 2 // Executable file
1.111 +#define ET_DYN 3 // Shared object
1.112 +#define ET_CORE 4 // Core file
1.113 +#define ET_LOPROC 0xff00 // Processor-specific
1.114 +#define ET_HIPROC 0xffff // Processor-specific
1.115 +
1.116 +//values for e_machine
1.117 +#define EM_NONE 0 // No machine
1.118 +#define EM_M32 1 // AT&T WE 32100
1.119 +#define EM_SPARC 2 // SPARC
1.120 +#define EM_386 3 // Intel Architecture
1.121 +#define EM_68K 4 // Moto 68000
1.122 +#define EM_88K 5 // Moto 88000
1.123 +#define EM_860 7 // Intel 80860
1.124 +#define EM_MIPS 8 // MIPS RS3000 Big-Endian
1.125 +#define EM_MIPS_RS4_BE 10 // MIPS RS4000 Big-Endian
1.126 +//#define RESERVED 11-16 Reserved for future use
1.127 +#define EM_ARM 40 //ARM/Thumb Architecture
1.128 +
1.129 +// values for e_version
1.130 +#define EV_NONE 0 // Invalid version
1.131 +#define EV_CURRENT 1 // Current version
1.132 +
1.133 +// ELF Identification
1.134 +#define EI_MAG0 0 // File identification
1.135 +#define EI_MAG1 1 // File identification
1.136 +#define EI_MAG2 2 // File identification
1.137 +#define EI_MAG3 3 // File identification
1.138 +#define EI_CLASS 4 // File class
1.139 +#define EI_DATA 5 // Data encoding
1.140 +#define EI_VERSION 6 // File version
1.141 +#define EI_PAD 7 // Start of padding bytes
1.142 +
1.143 +// values for e_ident[0-3]
1.144 +#define ELFMAG0 0x7f // e_ident[EI_MAG0]
1.145 +#define ELFMAG1 'E' // e_ident[EI_MAG1]
1.146 +#define ELFMAG2 'L' // e_ident[EI_MAG2]
1.147 +#define ELFMAG3 'F' // e_ident[EI_MAG3]
1.148 +
1.149 +// values for e_ident[EI_CLASS]- identifies the file's class, or capacity.
1.150 +#define ELFCLASSNONE 0 // Invalid class
1.151 +#define ELFCLASS32 1 // 32-bit objects
1.152 +#define ELFCLASS64 2 // 64-bit objects
1.153 +
1.154 +// values for e_ident[EI_DATA] - specifies the data encoding of the
1.155 +// processor-specific data in the object file.
1.156 +#define ELFDATANONE 0 // Invalid data encoding
1.157 +#define ELFDATA2LSB 1 // 2's complement , with LSB at lowest address.
1.158 +#define ELFDATA2MSB 2 // 2's complement , with MSB at lowest address.
1.159 +
1.160 +// ARM/THUMB specific values for e_flags
1.161 +
1.162 +// e_entry contains a program-loader entry point
1.163 +#define EF_ARM_HASENTRY 0x02
1.164 +// Each subsection of the symbol table is sorted by symbol value
1.165 +#define EF_ARM_SYMSARESORTED 0x04
1.166 +// Symbols in dynamic symbol tables that are defined in sections
1.167 +// included in program segment n have st_shndx = n+ 1.
1.168 +#define EF_ARM_DYNSYMSUSESEGIDX 0x8
1.169 +// Mapping symbols precede other local symbols in the symbol table
1.170 +#define EF_ARM_MAPSYMSFIRST 0x10
1.171 +// This masks an 8-bit version number, the version of the ARM EABI to
1.172 +// which this ELF file conforms. This EABI is version 2. A value of 0
1.173 +// denotes unknown conformance. (current version is 0x02000000)
1.174 +#define EF_ARM_EABIMASK 0xFF000000
1.175 +
1.176 +#define EF_ARM_EABI_VERSION 0x02000000
1.177 +#define EF_ARM_BPABI_VERSION 0x04000000
1.178 +
1.179 +/*
1.180 +3.3 Sections
1.181 +
1.182 +An object file's section header table lets one locate all the file's
1.183 +sections. The section header table is an array of Elf32_Shdr
1.184 +structures as described below. A section header table index is a
1.185 +subscript into this array. The ELF header's e_shoff member gives the
1.186 +byte offset from the beginning of the file to the section header
1.187 +table; e_shnum tells how many entries the section header table
1.188 +contains; e_shentsize gives the size in bytes of each entry.
1.189 +*/
1.190 +
1.191 +// Some section header table indexes are reserved; an object file will
1.192 +// not have sections for these special indexes.
1.193 +
1.194 +// marks an undefined, missing, irrelevant, or otherwise meaningless
1.195 +// section reference.
1.196 +#define SHN_UNDEF 0
1.197 +// specifies the lower bound of the range of reserved indexes.
1.198 +#define SHN_LORESERVE 0xff00
1.199 +// SHN_LOPROC-SHN_HIPRO - this inclusive range reserved for
1.200 +// processor-specific semantics.
1.201 +#define SHN_LOPROC 0xff00
1.202 +#define SHN_HIPROC 0xff1f
1.203 +// Specifies absolute values for the corresponding reference.
1.204 +// For example, symbols defined relative to section number SHN_ABS have
1.205 +// absolute values and are not affected by relocation.
1.206 +#define SHN_ABS 0xfff1
1.207 +// Symbols defined relative to this section are common symbols,
1.208 +// such as FORTRAN COMMON or unallocated C external variables.
1.209 +#define SHN_COMMON 0xfff2
1.210 +// specifies the upper bound of the range of reserved indexes.
1.211 +#define SHN_HIRESERVE 0xffff
1.212 +
1.213 +typedef struct {
1.214 +
1.215 + // specifies the name of the section. Its value is an index into the
1.216 + // section header string table section [see String Tablebelow],
1.217 + // giving the location of a null-terminated string.
1.218 + Elf32_Word sh_name;
1.219 +
1.220 + // categorizes the section's contents and semantics. Section types
1.221 + // and their descriptions appear below.
1.222 + Elf32_Word sh_type;
1.223 +
1.224 + // Sections support 1-bit flags that describe miscellaneous
1.225 + // attributes. Flag definitions appear below.
1.226 + Elf32_Word sh_flags;
1.227 +
1.228 + // If the section will appear in the memory image of a process, this
1.229 + // member gives the address at which the section's first byte should
1.230 + // reside. Otherwise, the member contains 0.
1.231 + Elf32_Addr sh_addr;
1.232 +
1.233 + // gives the byte offset from the beginning of the file to the first
1.234 + // byte in the section.One section type, SHT_NOBITS described below,
1.235 + // occupies no space in the file, and its sh_offset member locates
1.236 + // the conceptual placement in the file.
1.237 + Elf32_Off sh_offset;
1.238 +
1.239 + // gives the section's size in bytes. Unless the section type is
1.240 + // SHT_NOBITS, the section occupies sh_size bytes in the file. A
1.241 + // section of type SHT_NOBITS may have a non-zero size, but it
1.242 + // occupies no space in the file.
1.243 + Elf32_Word sh_size;
1.244 +
1.245 + // holds a section header table index link, whose interpretation
1.246 + // depends on the section type. A table below describes the values.
1.247 + Elf32_Word sh_link;
1.248 +
1.249 + // holds extra information, whose interpretation depends on the
1.250 + // section type. A table below describes the values.
1.251 + Elf32_Word sh_info;
1.252 +
1.253 + // Some sections have address alignment constraints. For example, if
1.254 + // a section holds a doubleword, the system must ensure double-word
1.255 + // alignment for the entire section. That is, the value of sh_addr
1.256 + // must be congruent to 0, modulo the value of
1.257 + // sh_addralign. Currently, only 0 and positive integral powers of
1.258 + // two are allowed. Values 0 and 1 mean the section has no alignment
1.259 + // constraints.
1.260 + Elf32_Word sh_addralign;
1.261 +
1.262 + // Some sections hold a table of fixed-size entries, such as a
1.263 + // symbol table. For such a section, this member gives the size in
1.264 + // bytes of each entry. The member contains 0 if the section does
1.265 + // not hold a table of fixedsize entries. A section header's sh_type
1.266 + // member specifies the section's semantics.
1.267 + Elf32_Word sh_entsize;
1.268 +
1.269 +} Elf32_Shdr;
1.270 +
1.271 +// values for sh_type
1.272 +
1.273 +#define SHT_NULL 0 // marks the section header as inactive; it does
1.274 + // not have an associated section. Other members of the section
1.275 + // header have undefined values.
1.276 +#define SHT_PROGBITS 1 // The section holds information defined by the
1.277 + // program, whose format and meaning are determined solely by the
1.278 + // program.
1.279 +#define SHT_SYMTAB 2 //These sections hold a symbol table.
1.280 +#define SHT_STRTAB 3 // The section holds a string table.
1.281 +#define SHT_RELA 4 // The section holds relocation entries with
1.282 + // explicit addends, such as type Elf32_Rela for the 32-bit class of
1.283 + // object files. An object file may have multiple relocation
1.284 + // sections. See Relocationbelow for details.
1.285 +#define SHT_HASH 5 // The section holds a symbol hash table.
1.286 +#define SHT_DYNAMIC 6 // The section holds information for dynamic
1.287 + // linking.
1.288 +#define SHT_NOTE 7 // This section holds information that marks the
1.289 + // file in some way.
1.290 +#define SHT_NOBITS 8 // A section of this type occupies no space in
1.291 + // the file but otherwise resembles SHT_PROGBITS. Although this
1.292 + // section contains no bytes, the sh_offset member contains the
1.293 + // conceptual file offset.
1.294 +#define SHT_REL 9 // The section holds relocation entries without
1.295 + // explicit addends, such as type Elf32_Rel for the 32-bit class of
1.296 + // object files. An object file may have multiple relocation
1.297 + // sections. See Relocationbelow for details.
1.298 +#define SHT_SHLIB 10 // This section type is reserved but has
1.299 + // unspecified semantics.
1.300 +#define SHT_DYNSYM 11 // This section hold dynamic symbol information
1.301 +// SHT_LOPROC through SHT_HIPROC - Values in this inclusive range are
1.302 +// reserved for processor-specific semantics.
1.303 +#define SHT_LOPROC 0x70000000
1.304 +#define SHT_ARM_EXIDX 0x70000001
1.305 +#define SHT_HIPROC 0x7fffffff
1.306 +// Section types between SHT_LOUSER and SHT_HIUSER may be used by the
1.307 +// application, without conflicting with current or future
1.308 +// system-defined section types.
1.309 +#define SHT_LOUSER 0x80000000 // This value specifies the lower bound
1.310 + // of the range of indexes reserved for application programs.
1.311 +#define SHT_HIUSER 0xffffffff // This value specifies the upper bound
1.312 + // of the range of indexes reserved for application programs.
1.313 +
1.314 +// values for sh_flags
1.315 +
1.316 +// The section contains data that should be writable during process execution
1.317 +#define SHF_WRITE 0x1
1.318 +// The section occupies memory during process execution. Some control
1.319 +// sections do not reside in the memory image of an object file; this
1.320 +// attribute is off for those sections
1.321 +#define SHF_ALLOC 0x2
1.322 +// The section contains executable machine instructions.
1.323 +#define SHF_EXECINSTR 0x4
1.324 +// Bits in this mask are reserved for processor-specific semantics.
1.325 +#define SHF_MASKPROC 0xf0000000
1.326 +
1.327 +
1.328 +typedef struct {
1.329 +
1.330 + // holds an index into the object file's symbol string table, which
1.331 + // holds the character representations of the symbol names.
1.332 + Elf32_Word st_name;
1.333 +
1.334 + // gives the value of the associated symbol. Depending on the
1.335 + // context this may be an absolute value, an address, and so on
1.336 + Elf32_Addr st_value;
1.337 +
1.338 + // Many symbols have associated sizes. For example, a data object's
1.339 + // size is the number of bytes contained in the object. This member
1.340 + // holds 0 if the symbol has no size or an unknown size.
1.341 + Elf32_Word st_size;
1.342 +
1.343 + // This member specifies the symbol's type and binding
1.344 + // attributes. The following code shows how to manipulate the
1.345 + // values.
1.346 +#define ELF32_ST_BIND(i) ((i)>>4)
1.347 +#define ELF32_ST_TYPE(i) ((i)&0xf)
1.348 +#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
1.349 + unsigned char st_info;
1.350 +
1.351 + // This member currently holds 0 and has no defined meaning.
1.352 + unsigned char st_other;
1.353 +
1.354 +
1.355 +#define ELF32_ST_VISIBILITY(o) ((o)&0x3)
1.356 +#define ELF64_ST_VISIBILITY(o) ((o)&0x3)
1.357 +
1.358 + // Every symbol table entry is defined in relation to some section;
1.359 + // this member holds the relevant section header table index.
1.360 + Elf32_Half st_shndx;
1.361 +
1.362 +} Elf32_Sym;
1.363 +
1.364 +// Local symbols are not visible outside the object file containing
1.365 +// their definition. Local symbols of the same name may exist in
1.366 +// multiple files without interfering with each other.
1.367 +#define STB_LOCAL 0
1.368 +// Global symbols are visible to all object files being combined. One
1.369 +// file's definition of a global symbol will satisfy another file's
1.370 +// undefined reference to the same global symbol.
1.371 +#define STB_GLOBAL 1
1.372 +// Weak symbols resemble global symbols, but their definitions have
1.373 +// lower precedence. Undefined weak symbols (weak references) may have
1.374 +// processor- or OS-specific semantics
1.375 +#define STB_WEAK 2
1.376 +// STB_LOPROC through STB_HIPROC - values in this inclusive range are
1.377 +// reserved for processor-specific semantics.
1.378 +#define STB_LOPROC 13
1.379 +#define STB_HIPROC 15
1.380 +
1.381 +// The symbol's type is not specified.
1.382 +#define STT_NOTYPE 0
1.383 +// The symbol is associated with a data object, such as a variable, an
1.384 +// array, and so on.
1.385 +#define STT_OBJECT 1
1.386 +// The symbol is associated with a function or other executable code.
1.387 +#define STT_FUNC 2
1.388 +// The symbol is associated with a section. Symbol table entries of
1.389 +// this type exist primarily for relocation and normally have
1.390 +// STB_LOCAL binding.
1.391 +#define STT_SECTION 3
1.392 +// A file symbol has STB_LOCAL binding, its section index is SHN_A BS,
1.393 +// and it precedes the other STB_LOCAL symbols for the file, if it is
1.394 +// present.
1.395 +#define STT_FILE 4
1.396 +// Values in this inclusive range are reserved for processor-specific
1.397 +// semantics. If a symbol's value refers to a specific location within
1.398 +// a section, its section index member, st_shndx, holds an index into
1.399 +// the section header table. As the section moves during relocation,
1.400 +// the symbol's value changes as well, and references to the symbol
1.401 +// continue to point to the same location in the program. Some special
1.402 +// section index values give other semantics.
1.403 +#define STT_LOPROC 13
1.404 +#define STT_HIPROC 15
1.405 +
1.406 +/*
1.407 +STV_DEFAULT
1.408 +The visibility of symbols with the STV_DEFAULT attribute is as specified by the symbol's
1.409 +binding type. That is, global and weak symbols are visible outside of their defining
1.410 +component, the executable file or shared object. Local symbols are hidden. Global and weak
1.411 + symbols can also be preempted, that is, they may by interposed by definitions of the same
1.412 + name in another component.
1.413 +
1.414 +STV_PROTECTED
1.415 +A symbol defined in the current component is protected if it is visible in other components
1.416 + but cannot be preempted. Any reference to such a symbol from within the defining component
1.417 + must be resolved to the definition in that component, even if there is a definition in
1.418 + another component that would interpose by the default rules. A symbol with STB_LOCAL binding
1.419 + will not have STV_PROTECTED visibility.
1.420 +
1.421 +STV_HIDDEN
1.422 +A symbol defined in the current component is hidden if its name is not visible to other
1.423 + components. Such a symbol is necessarily protected. This attribute is used to control
1.424 + the external interface of a component. An object named by such a symbol may still be
1.425 + referenced from another component if its address is passed outside.
1.426 +
1.427 +A hidden symbol contained in a relocatable object is either removed or converted to
1.428 +STB_LOCAL binding by the link-editor when the relocatable object is included in an
1.429 + executable file or shared object.
1.430 +
1.431 +STV_INTERNAL
1.432 +This visibility attribute is currently reserved.
1.433 +*/
1.434 +#define STV_DEFAULT 0
1.435 +#define STV_INTERNAL 1
1.436 +#define STV_HIDDEN 2
1.437 +#define STV_PROTECTED 3
1.438 +
1.439 +// Relocation Entries
1.440 +
1.441 +typedef struct {
1.442 +
1.443 + // r_offset gives the location at which to apply the relocation
1.444 + // action. For a relocatable file, the value is the byte offset from
1.445 + // the beginning of the section to the storage unit affected by the
1.446 + // relocation. For an executable file or a shared object, the value
1.447 + // is the virtual address of the storage unit affected by the
1.448 + // relocation.
1.449 + Elf32_Addr r_offset;
1.450 +
1.451 + // r_info gives both the symbol table index with respect to which
1.452 + // the relocation must be made, and the type of relocation to
1.453 + // apply. For example, a call instruction's relocation entry would
1.454 + // hold the symbol table index of the function being called. If the
1.455 + // index is STN_UNDEF, the undefined symbol index, the relocation
1.456 + // uses 0 as the symbol value. Relocation types are
1.457 + // processor-specific; descriptions of their behavior appear in
1.458 + // section 4.5, Relocation types. When the text in section 4.5
1.459 + // refers to a relocation entry's relocation type or symbol table
1.460 + // index, it means the result of applying ELF32_R_TYPE or
1.461 + // ELF32_R_SYM, respectively, to the entry's r_info member.
1.462 +
1.463 +#define ELF32_R_SYM(i) ((i)>>8)
1.464 +#define ELF32_R_TYPE(i) ((unsigned char)(i))
1.465 +#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
1.466 +
1.467 + Elf32_Word r_info;
1.468 +} Elf32_Rel;
1.469 +
1.470 +typedef struct {
1.471 + Elf32_Addr r_offset;
1.472 + Elf32_Word r_info;
1.473 + Elf32_Sword r_addend;
1.474 +} Elf32_Rela;
1.475 +
1.476 +// Program Header
1.477 +
1.478 +typedef struct {
1.479 +
1.480 + // p_type tells what kind of segment this array element describes or
1.481 + // how to interpret the array element's information. Type values and
1.482 + // their meanings are given below.
1.483 + Elf32_Word p_type;
1.484 +
1.485 + // p_offset gives the offset from the start of the file at which the
1.486 + // first byte of the segment resides.
1.487 + Elf32_Off p_offset;
1.488 +
1.489 + // p_vaddr gives the virtual address at which the first byte of the
1.490 + // segment resides in memory.
1.491 + Elf32_Addr p_vaddr;
1.492 +
1.493 + // p_paddr - On systems for which physical addressing is relevant,
1.494 + // this member is reserved for the segment's physical address. This
1.495 + // member requires operating system specific information.
1.496 + Elf32_Addr p_paddr;
1.497 +
1.498 + // p_filesz gives the number of bytes in the file image of the
1.499 + // segment; it may be zero.
1.500 + Elf32_Word p_filesz;
1.501 +
1.502 + // p_memsz gives the number of bytes in the memory image of the
1.503 + // segment; it may be zero.
1.504 + Elf32_Word p_memsz;
1.505 +
1.506 + // p_flags gives flags relevant to the segment. Defined flag values
1.507 + // are given below.
1.508 + Elf32_Word p_flags;
1.509 +
1.510 + // p_align - Loadable process segments must have congruent values
1.511 + // for p_vaddr and p_offset, modulo the page size. This member gives
1.512 + // the value to which the segments are aligned in memory and in the
1.513 + // file. Values 0 and 1 mean that no alignment is
1.514 + // required. Otherwise, p_align should be a positive, integral power
1.515 + // of 2, and p_vaddr should equal p_offset, modulo p_align.
1.516 + Elf32_Word p_align;
1.517 +
1.518 +} Elf32_Phdr;
1.519 +
1.520 +// Segment types - values for p_type
1.521 +
1.522 +// The array element is unused; other members' values are
1.523 +// undefined. This type lets the program header table have ignored
1.524 +// entries.
1.525 +#define PT_NULL 0
1.526 +// The array element specifies a loadable segment, described by
1.527 +// p_filesz and p_memsz (for additional explanation, see
1.528 +// PT_LOAD below).
1.529 +#define PT_LOAD 1
1.530 +// The array element specifies dynamic linking information. See
1.531 +// subsection 4.7.
1.532 +#define PT_DYNAMIC 2
1.533 +// The array element specifies the location and size of a
1.534 +// null-terminated pathname to invoke as an interpreter.
1.535 +#define PT_INTERP 3
1.536 +// The array element specifies the location and size of auxiliary
1.537 +// information.
1.538 +#define PT_NOTE 4
1.539 +// This segment type is reserved but has unspecified semantics.
1.540 +#define PT_SHLIB 5
1.541 +// The array element, if present, specifies the location and size of
1.542 +// the program header table itself (for additional explanation, see
1.543 +// PT_ PHDR below).
1.544 +#define PT_PHDR 6
1.545 +// Values in the inclusive [PT_LOPROC, PT_HIPROC] range are reserved
1.546 +// for processor-specific semantics.
1.547 +#define PT_LOPROC 0x70000000
1.548 +#define PT_HIPROC 0x7fffffff
1.549 +
1.550 +// values for p_flags
1.551 +// The segment may be executed.
1.552 +#define PF_X 1
1.553 +// The segment may be written to.
1.554 +#define PF_W 2
1.555 +// The segment may be read.
1.556 +#define PF_R 4
1.557 +// Reserved for processor-specific purposes (see 4.6, Program
1.558 +// headers).
1.559 +#define PF_MASKPROC 0xf0000000
1.560 +#define PF_ARM_ENTRY 0x80000000
1.561 +
1.562 +
1.563 +// Relocation types
1.564 +
1.565 +// ELF defines two sorts of relocation directive, SHT_REL, and
1.566 +// SHT_RELA. Both identify:
1.567 +//
1.568 +// o A section containing the storage unit - byte, half-word, word, or
1.569 +// instruction - being relocated.
1.570 +// o An offset within the section - or the address within an
1.571 +// executable program - of the storage unit itself.
1.572 +// o A symbol,the value of which helps to define a new value for the
1.573 +// storage unit.
1.574 +// o A relocation typethat defines the computation to be
1.575 +// performed. Computations are performed using 2's complement, 32-bit,
1.576 +// unsigned arithmetic with silent overflow.
1.577 +// o An addend, that also helps to define a new value for the storage
1.578 +// unit.
1.579 +//
1.580 +// The addend may be encoded wholly in a field of the storage unit
1.581 +// being relocated - relocation sort SHT_REL - or partly there and
1.582 +// partly in the addendfield of the relocation directive - relocation
1.583 +// sort SHT_RELA. Tables below describe the computation associated
1.584 +// with each relocation type, using the following notation:
1.585 +//
1.586 +// A - denotes the addend used to compute the new value of the storage
1.587 +// unit being relocated.
1.588 +// - It is the value extracted from the storage unit being relocated
1.589 +// (relocation directives of sort SHT_REL) or the sum of that
1.590 +// value and the r_addend field of the relocation directive (sort
1.591 +// SHT_RELA).
1.592 +// - If it has a unit, the unit is bytes. An encoded address or
1.593 +// offset value is converted to bytes on extraction from a storage
1.594 +// unit and re-encoded on insertion into a storage unit.
1.595 +//
1.596 +// P - denotes the place (section offset or address of the storage
1.597 +// unit) being re-located. It is the sum of the r_offset field of
1.598 +// the relocation directive and the base address of the section
1.599 +// being re-located.
1.600 +//
1.601 +// S - denotes the value of the symbol whose symbol table index is
1.602 +// given in the r_info field of the relocation directive.
1.603 +//
1.604 +// B - denotes the base address of the consolidated section in which
1.605 +// the symbol is defined. For relocations of type R_ARM_SBREL32,
1.606 +// this is the least static data address (the static base).
1.607 +//
1.608 +// relocation types 0-16 are generic
1.609 +// Name Type Field Computation
1.610 +//====================================================================
1.611 +#define R_ARM_NONE 0 // Any No relocation.
1.612 +#define R_ARM_PC24 1 // ARM B/BL S - P + A
1.613 +#define R_ARM_ABS32 2 // 32-bit word S + A
1.614 +#define R_ARM_REL32 3 // 32-bit word S - P + A
1.615 +#define R_ARM_PC13 4 // ARM LDR r, [pc,...] S - P + A
1.616 +#define R_ARM_ABS16 5 // 16-bit half-word S + A
1.617 +#define R_ARM_ABS12 6 // ARM LDR/STR S + A
1.618 +#define R_ARM_THM_ABS5 7 // Thumb LDR/STR S + A
1.619 +#define R_ARM_ABS8 8 // 8-bit byte S + A
1.620 +#define R_ARM_SBREL32 9 // 32-bit word S - B + A
1.621 +#define R_ARM_THM_PC22 10 // Thumb BL pair S - P + A
1.622 +#define R_ARM_THM_PC8 11 // Thumb LDR r, [pc,...] S - P + A
1.623 +#define R_ARM_AMP_VCALL9 12 // AMP VCALL Obsolete - SA-1500
1.624 +#define R_ARM_SWI24 13 // ARM SWI S + A
1.625 +#define R_ARM_THM_SWI8 14 // Thumb SWI S + A
1.626 +#define R_ARM_XPC25 15 // ARM BLX S - P + A
1.627 +#define R_ARM_THM_XPC22 16 // Thumb BLX pair S - P + A
1.628 +
1.629 +// relocation types 17-31 are reserved for ARM Linux
1.630 +#define R_ARM_GLOB_DAT 21 // PLT related S + A
1.631 +#define R_ARM_JUMP_SLOT 22 // PLT related S + A
1.632 +#define R_ARM_RELATIVE 23 // 32-bit word B(S) + A
1.633 +
1.634 +#define R_ARM_GOT_BREL 26 //
1.635 +
1.636 +#define R_ARM_ALU_PCREL_7_0 32 // ARM ADD/SUB (S - P + A) & 0x000000FF
1.637 +#define R_ARM_ALU_PCREL_15_8 33 // ARM ADD/SUB (S - P + A) & 0x0000FF00
1.638 +#define R_ARM_ALU_PCREL_23_15 34 // ARM ADD/SUB (S - P + A) & 0x00FF0000
1.639 +#define R_ARM_LDR_SBREL_11_0 35 // ARM ADD/SUB (S - B + A) & 0x00000FFF
1.640 +#define R_ARM_ALU_SBREL_19_12 36 // ARM ADD/SUB (S - B + A) & 0x000FF000
1.641 +#define R_ARM_ALU_SBREL_27_20 37 // ARM ADD/SUB (S - B + A) & 0x0FF00000
1.642 +
1.643 +// Dynamic relocation types
1.644 +
1.645 +// A small set of relocation types supports relocating executable ELF
1.646 +// files. They are used only in a relocation section embedded in a
1.647 +// dynamic segment (see section 4.7, Dynamic linking and
1.648 +// relocation). They cannot be used in a relocation section in a
1.649 +// re-locatable ELF file. In Figure 4-13 below:
1.650 +//
1.651 +// .S is the displacement from its statically linked virtual address
1.652 +// of the segment containing the symbol definition.
1.653 +//
1.654 +// .P is the displacement from its statically linked virtual address
1.655 +// of the segment containing the place to be relocated.
1.656 +//
1.657 +// .SB is the displacement of the segment pointed to by the static
1.658 +// base (PF_ARM_SB is set in the p_flags field of this segment's
1.659 +// program header - see 4.6, Program headers).
1.660 +
1.661 +
1.662 +// types 249 - 255 are dynamic relocation types and are only used in dynamic sections
1.663 +#define R_ARM_RXPC25 249 // ARM BLX (.S - .P) + A
1.664 + // For calls between program segments.
1.665 +#define R_ARM_RSBREL32 250 // Word (.S - .SB) + A
1.666 + // For an offset from SB, the static base.
1.667 +#define R_ARM_THM_RPC22 251 // Thumb BL/BLX pair (.S - .P) + A
1.668 + // For calls between program segments.
1.669 +#define R_ARM_RREL32 252 // Word (.S - .P) + A
1.670 + // For on offset between two segments.
1.671 +#define R_ARM_RABS32 253 // Word .S + A
1.672 + // For the address of a location in the target segment.
1.673 +#define R_ARM_RPC24 254 // ARM B/BL (.S - .P) + A
1.674 + // For calls between program segments.
1.675 +#define R_ARM_RBASE 255 // None Identifies the segment being relocated by
1.676 + // the following relocation directives.
1.677 +// DYNAMIC SEGMENT
1.678 +// The dynamic segment begins with a dynamic section containing an array of structures of type:
1.679 +typedef struct Elf32_Dyn {
1.680 + Elf32_Sword d_tag;
1.681 + Elf32_Word d_val;
1.682 +} Elf32_Dyn;
1.683 +
1.684 +// This entry marks the end of the dynamic array. mandatory
1.685 +#define DT_NULL 0
1.686 +// Index in the string table of the name of a needed library. multiple
1.687 +#define DT_NEEDED 1
1.688 +// These entries are unused by versions 1-2 of the ARM EABI. unused
1.689 +#define DT_PLTRELSZ 2
1.690 +#define DT_PLTGOT 3
1.691 +// The offset of the hash table section in the dynamic segment. mandatory
1.692 +#define DT_HASH 4
1.693 +// The offset of the string table section in the dynamic segment. mandatory
1.694 +#define DT_STRTAB 5
1.695 +// The offset of the symbol table section in the dynamic segment. mandatory
1.696 +#define DT_SYMTAB 6
1.697 +// The offset in the dynamic segment of an SHT_RELA relocation
1.698 +// section, Its bytesize,and the byte size of an ARMRELA-type
1.699 +// relocation entry. optional
1.700 +#define DT_RELA 7
1.701 +#define DT_RELASZ 8
1.702 +#define DT_RELAENT 9
1.703 +// The byte size of the string table section. mandatory
1.704 +#define DT_STRSZ 10
1.705 +// The byte size of an ARM symbol table entry. mandatory
1.706 +#define DT_SYMENT 11
1.707 +// These entries are unused by versions 1-2 of the ARM EABI. unused
1.708 +#define DT_INIT 12
1.709 +#define DT_FINI 13
1.710 +// The Index in the string table of the name of this shared object. mandatory
1.711 +#define DT_SONAME 14
1.712 +// Unused by the ARM EABI. unused
1.713 +#define DT_RPATH 15
1.714 +#define DT_SYMBOLIC 16
1.715 +//The offset in the dynamic segment of an SHT_REL relocation section,
1.716 +//Its bytesize, and the byte size of an ARMREL-type relocation
1.717 +//entry. optional
1.718 +#define DT_REL 17
1.719 +#define DT_RELSZ 18
1.720 +#define DT_RELENT 19
1.721 +// These entries are unused by versions 1-2 of the ARM EABI. unused
1.722 +#define DT_PLTREL 20
1.723 +#define DT_DEBUG 21
1.724 +#define DT_TEXTREL 22
1.725 +#define DT_JMPREL 23
1.726 +#define DT_BIND_NOW 24
1.727 +#define DT_INIT_ARRAY 25
1.728 +#define DT_FINI_ARRAY 26
1.729 +#define DT_INIT_ARRAYSZ 27
1.730 +#define DT_FINI_ARRAYSZ 28
1.731 +
1.732 +#define DT_VERSYM 0x6ffffff0 /* see section 3.3.3.1 in bpabi*/
1.733 +#define DT_RELCOUNT 0x6ffffffa
1.734 +#define DT_VERDEF 0x6ffffffc /* Address of version definition
1.735 + table */
1.736 +#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */
1.737 +#define DT_VERNEED 0x6ffffffe /* Address of table with needed
1.738 + versions */
1.739 +#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */
1.740 +
1.741 +// Values in this range are reserved to the ARM EABI. unused
1.742 +#define DT_LOPROC 0x70000000
1.743 +#define DT_HIPROC 0x7fffffff
1.744 +#define DT_ARM_RESERVED1 0x70000000
1.745 +/* Number of entries in the dynamic symbol table, including the initial dummy symbol. */
1.746 +#define DT_ARM_SYMTABSZ_21 0x70000000 // For RVCT 2.1
1.747 +#define DT_ARM_SYMTABSZ 0x70000001 // The DT_ARM_SYMTABSZ tag value has been changed from RVCT2.2
1.748 +/* Holds the address of the pre-emption map for platforms that use the DLL static binding model. */
1.749 +#define DT_ARM_PREEMPTMAP 0x70000002
1.750 +#define DT_ARM_RESERVED2 0x70000003
1.751 +#define DT_ARM_PLTGOTBASE 0x70000004
1.752 +#define DT_ARM_PLTGOTLIMIT 0x70000005
1.753 +
1.754 +// What the hash table looks like in the dynamic segment
1.755 +typedef struct Elf32_HashTable {
1.756 + Elf32_Word nBuckets;
1.757 + Elf32_Word nChains;
1.758 + // Elf32_Word bucket[nBuckets];
1.759 + // Elf32_Word chain[nChains];
1.760 +} Elf32_HashTable;
1.761 +
1.762 +
1.763 +typedef struct
1.764 +{
1.765 + Elf32_Half vd_version; /* Version revision */
1.766 + Elf32_Half vd_flags; /* Version information */
1.767 + Elf32_Half vd_ndx; /* Version Index */
1.768 + Elf32_Half vd_cnt; /* Number of associated aux entries */
1.769 + Elf32_Word vd_hash; /* Version name hash value */
1.770 + Elf32_Word vd_aux; /* Offset in bytes to verdaux array */
1.771 + Elf32_Word vd_next; /* Offset in bytes to next verdef
1.772 + entry */
1.773 +} Elf32_Verdef;
1.774 +
1.775 +typedef struct
1.776 +{
1.777 + Elf32_Word vda_name; /* Version or dependency names */
1.778 + Elf32_Word vda_next; /* Offset in bytes to next verdaux
1.779 + entry */
1.780 +} Elf32_Verdaux;
1.781 +
1.782 +
1.783 +typedef struct
1.784 +{
1.785 + Elf32_Half vn_version; /* Version of structure */
1.786 + Elf32_Half vn_cnt; /* Number of associated aux entries */
1.787 + Elf32_Word vn_file; /* Offset of filename for this
1.788 + dependency */
1.789 + Elf32_Word vn_aux; /* Offset in bytes to vernaux array */
1.790 + Elf32_Word vn_next; /* Offset in bytes to next verneed
1.791 + entry */
1.792 +} Elf32_Verneed;
1.793 +
1.794 +typedef struct {
1.795 + Elf32_Word vna_hash;
1.796 + Elf32_Half vna_flags;
1.797 + Elf32_Half vna_other;
1.798 + Elf32_Word vna_name;
1.799 + Elf32_Word vna_next;
1.800 +} Elf32_Vernaux;
1.801 +
1.802 +
1.803 +enum ESegmentType
1.804 +{
1.805 + ESegmentUndefined = SHN_UNDEF, // undefined or meaningless section/segment reference
1.806 + ESegmentRO, // Read Only (text) segment
1.807 + ESegmentRW, // Read Write (data) segment
1.808 + ESegmentDynamic, // Dynamic segment
1.809 + ESegmentABS = SHN_ABS, // Symbols defined relative to section number SHN_ABS have
1.810 + // absolute values and are not affected by relocation.
1.811 + ESegmentCommon = SHN_COMMON, // Symbols defined relative to section number SHN_ABS have
1.812 + // absolute values and are not affected by relocation.
1.813 +};
1.814 +
1.815 +#endif