bintools/elftools/inc/elfdefs.h
changeset 0 044383f39525
equal deleted inserted replaced
-1:000000000000 0:044383f39525
       
     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