toolsandutils/e32tools/elftools/inc/elfdefs.h
changeset 0 83f4b4db085c
child 10 d4b442d23379
equal deleted inserted replaced
-1:000000000000 0:83f4b4db085c
       
     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 "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // lifted from the ARMELF spec
       
    15 // 
       
    16 //
       
    17 
       
    18 #ifndef __ELFDEFS_H__
       
    19 #define __ELFDEFS_H__
       
    20 
       
    21 
       
    22 // ARMELF 3.1.2
       
    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
       
    30 
       
    31 typedef char* MemAddr;
       
    32 /*
       
    33 3.2 ELF Header 
       
    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.
       
    40 */
       
    41 #define EI_NIDENT 16
       
    42 typedef struct {
       
    43 
       
    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];
       
    47 
       
    48   // identifies the object file type.
       
    49   Elf32_Half e_type;
       
    50 
       
    51   // specifies the required architecture for an individual file.
       
    52   Elf32_Half e_machine;
       
    53 
       
    54   // identifies the object file version.
       
    55   Elf32_Word e_version;
       
    56 
       
    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.
       
    60   Elf32_Addr e_entry;
       
    61 
       
    62   // holds the program header table's file offset in bytes. If the 
       
    63   // file has no program header table, this member holds zero.
       
    64   Elf32_Off e_phoff;
       
    65 
       
    66   // holds the section header table's file offset in bytes. If the 
       
    67   // file has no section header table, this member holds zero.
       
    68   Elf32_Off e_shoff;
       
    69 
       
    70   // holds processor-specific flags associated with the file. Flag 
       
    71   // names take the form EF_machine_flag.
       
    72   Elf32_Word e_flags;
       
    73 
       
    74   // holds the ELF header's size in bytes.
       
    75   Elf32_Half e_ehsize;
       
    76 
       
    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;
       
    80 
       
    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.
       
    85   Elf32_Half e_phnum;
       
    86 
       
    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;
       
    90 
       
    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.
       
    95   Elf32_Half e_shnum;
       
    96 
       
    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;
       
   101 
       
   102 } Elf32_Ehdr;
       
   103 
       
   104 // values for e_type
       
   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
       
   112 
       
   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
       
   125 
       
   126 // values for e_version
       
   127 #define EV_NONE 	0 // Invalid version
       
   128 #define EV_CURRENT 	1 // Current version
       
   129 
       
   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
       
   139 
       
   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]
       
   145 
       
   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
       
   150 
       
   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.
       
   156 
       
   157 // ARM/THUMB specific values for e_flags
       
   158 
       
   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
       
   172 
       
   173 #define EF_ARM_EABI_VERSION 0x02000000
       
   174 #define EF_ARM_BPABI_VERSION 0x04000000
       
   175 
       
   176 /* 
       
   177 3.3 Sections
       
   178 
       
   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.
       
   186 */
       
   187 
       
   188 // Some section header table indexes are reserved; an object file will
       
   189 // not have sections for these special indexes.
       
   190 
       
   191 // marks an undefined, missing, irrelevant, or otherwise meaningless 
       
   192 // section reference.
       
   193 #define SHN_UNDEF 	0
       
   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
       
   209 
       
   210 typedef struct {
       
   211 
       
   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.
       
   215   Elf32_Word sh_name;
       
   216 
       
   217   // categorizes the section's contents and semantics. Section types
       
   218   // and their descriptions appear below.
       
   219   Elf32_Word sh_type;
       
   220 
       
   221   // Sections support 1-bit flags that describe miscellaneous
       
   222   // attributes. Flag definitions appear below.
       
   223   Elf32_Word sh_flags;
       
   224 
       
   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.
       
   228   Elf32_Addr sh_addr;
       
   229 
       
   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.
       
   234   Elf32_Off sh_offset;
       
   235 
       
   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.
       
   240   Elf32_Word sh_size;
       
   241 
       
   242   // holds a section header table index link, whose interpretation
       
   243   // depends on the section type. A table below describes the values.
       
   244   Elf32_Word sh_link;
       
   245 
       
   246   // holds extra information, whose interpretation depends on the
       
   247   // section type. A table below describes the values.
       
   248   Elf32_Word sh_info;
       
   249 
       
   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
       
   256   // constraints.
       
   257   Elf32_Word sh_addralign;
       
   258 
       
   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;
       
   265 
       
   266 } Elf32_Shdr;
       
   267 
       
   268 // values for sh_type 
       
   269 
       
   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
       
   275  // program.
       
   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
       
   284  // linking.
       
   285 #define SHT_NOTE 7 // This section holds information that marks the
       
   286  // file in some way.
       
   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.
       
   310 
       
   311 // values for sh_flags
       
   312 
       
   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 
       
   323 
       
   324 
       
   325 typedef struct {
       
   326 
       
   327   // holds an index into the object file's symbol string table, which
       
   328   // holds the character representations of the symbol names.
       
   329   Elf32_Word st_name;
       
   330 
       
   331   // gives the value of the associated symbol. Depending on the
       
   332   // context this may be an absolute value, an address, and so on
       
   333   Elf32_Addr st_value;
       
   334 
       
   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.
       
   338   Elf32_Word st_size;
       
   339 
       
   340   // This member specifies the symbol's type and binding
       
   341   // attributes. The following code shows how to manipulate the
       
   342   // values.
       
   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;
       
   347 
       
   348   // This member currently holds 0 and has no defined meaning.
       
   349   unsigned char st_other;
       
   350 
       
   351 
       
   352 #define ELF32_ST_VISIBILITY(o)       ((o)&0x3)
       
   353 #define ELF64_ST_VISIBILITY(o)       ((o)&0x3)
       
   354 
       
   355   // Every symbol table entry is defined in relation to some section;
       
   356   // this member holds the relevant section header table index.
       
   357   Elf32_Half st_shndx;
       
   358 
       
   359 } Elf32_Sym;
       
   360 
       
   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.
       
   364 #define STB_LOCAL 0
       
   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.
       
   368 #define STB_GLOBAL 1
       
   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
       
   372 #define STB_WEAK 2 
       
   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
       
   377 
       
   378 // The symbol's type is not specified.
       
   379 #define STT_NOTYPE 0 
       
   380 // The symbol is associated with a data object, such as a variable, an
       
   381 // array, and so on.
       
   382 #define STT_OBJECT 1 
       
   383 // The symbol is associated with a function or other executable code.
       
   384 #define STT_FUNC 2 
       
   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
       
   391 // present.
       
   392 #define STT_FILE 4 
       
   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
       
   402 
       
   403 /*
       
   404 STV_DEFAULT
       
   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. 
       
   410 
       
   411 STV_PROTECTED
       
   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.
       
   417 
       
   418 STV_HIDDEN
       
   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.
       
   423 
       
   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.
       
   427 
       
   428 STV_INTERNAL
       
   429 This visibility attribute is currently reserved.
       
   430 */
       
   431 #define STV_DEFAULT		0
       
   432 #define STV_INTERNAL	1
       
   433 #define STV_HIDDEN		2
       
   434 #define	STV_PROTECTED	3
       
   435 
       
   436 // Relocation Entries
       
   437 
       
   438 typedef struct { 
       
   439 
       
   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
       
   445   // relocation.
       
   446   Elf32_Addr r_offset;
       
   447 
       
   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.
       
   459 
       
   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))
       
   463 
       
   464   Elf32_Word r_info; 
       
   465 } Elf32_Rel; 
       
   466 
       
   467 typedef struct {
       
   468   Elf32_Addr r_offset;
       
   469   Elf32_Word r_info;
       
   470   Elf32_Sword r_addend;
       
   471 } Elf32_Rela;
       
   472 
       
   473 // Program Header
       
   474 
       
   475 typedef struct {
       
   476 
       
   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.
       
   480   Elf32_Word p_type;
       
   481 
       
   482   // p_offset gives the offset from the start of the file at which the
       
   483   // first byte of the segment resides.
       
   484   Elf32_Off p_offset;
       
   485 
       
   486   // p_vaddr gives the virtual address at which the first byte of the
       
   487   // segment resides in memory.
       
   488   Elf32_Addr p_vaddr;
       
   489 
       
   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.
       
   493   Elf32_Addr p_paddr;
       
   494 
       
   495   // p_filesz gives the number of bytes in the file image of the
       
   496   // segment; it may be zero.
       
   497   Elf32_Word p_filesz;
       
   498 
       
   499   // p_memsz gives the number of bytes in the memory image of the
       
   500   // segment; it may be zero.
       
   501   Elf32_Word p_memsz;
       
   502 
       
   503   // p_flags gives flags relevant to the segment. Defined flag values
       
   504   // are given below.
       
   505   Elf32_Word p_flags;
       
   506 
       
   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.
       
   513   Elf32_Word p_align;
       
   514 
       
   515 } Elf32_Phdr;
       
   516 
       
   517 // Segment types - values for p_type
       
   518 
       
   519 // The array element is unused; other members' values are
       
   520 // undefined. This type lets the program header table have ignored
       
   521 // entries.
       
   522 #define PT_NULL 0 
       
   523 // The array element specifies a loadable segment, described by
       
   524 // p_filesz and p_memsz (for additional explanation, see
       
   525 // PT_LOAD below).
       
   526 #define PT_LOAD 1 
       
   527 // The array element specifies dynamic linking information. See
       
   528 // subsection 4.7.
       
   529 #define PT_DYNAMIC 2 
       
   530 // The array element specifies the location and size of a
       
   531 // null-terminated pathname to invoke as an interpreter.
       
   532 #define PT_INTERP 3 
       
   533 // The array element specifies the location and size of auxiliary
       
   534 // information.
       
   535 #define PT_NOTE 4 
       
   536 // This segment type is reserved but has unspecified semantics.
       
   537 #define PT_SHLIB 5 
       
   538 // The array element, if present, specifies the location and size of
       
   539 // the program header table itself (for additional explanation, see
       
   540 // PT_ PHDR below).
       
   541 #define PT_PHDR 6 
       
   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
       
   546 
       
   547 // values for p_flags
       
   548 // The segment may be executed.
       
   549 #define PF_X 1 
       
   550 // The segment may be written to.
       
   551 #define PF_W 2 
       
   552 // The segment may be read.
       
   553 #define PF_R 4 
       
   554 // Reserved for processor-specific purposes (see 4.6, Program
       
   555 // headers).
       
   556 #define PF_MASKPROC 0xf0000000 
       
   557 #define PF_ARM_ENTRY 0x80000000
       
   558 
       
   559 
       
   560 // Relocation types
       
   561 
       
   562 // ELF defines two sorts of relocation directive, SHT_REL, and
       
   563 // SHT_RELA. Both identify:
       
   564 //
       
   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
       
   570 //   storage unit.
       
   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
       
   575 //   unit.
       
   576 //
       
   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:
       
   582 //
       
   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
       
   588 //     SHT_RELA).
       
   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.
       
   592 //
       
   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
       
   596 //     being re-located.
       
   597 //
       
   598 // S - denotes the value of the symbol whose symbol table index is
       
   599 //     given in the r_info field of the relocation directive.
       
   600 //
       
   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).
       
   604 //
       
   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
       
   625 
       
   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
       
   630 
       
   631 #define R_ARM_GOT_BREL	  26  //  			
       
   632 
       
   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
       
   639 
       
   640 // Dynamic relocation types 
       
   641 
       
   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:
       
   647 //
       
   648 // .S is the displacement from its statically linked virtual address
       
   649 //    of the segment containing the symbol definition.
       
   650 //
       
   651 // .P is the displacement from its statically linked virtual address
       
   652 //    of the segment containing the place to be relocated.
       
   653 //
       
   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).
       
   657 
       
   658 
       
   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.
       
   674 // DYNAMIC SEGMENT
       
   675 // The dynamic segment begins with a dynamic section containing an array of structures of type:
       
   676 typedef struct Elf32_Dyn {
       
   677   Elf32_Sword d_tag;
       
   678   Elf32_Word d_val;
       
   679 } Elf32_Dyn;
       
   680 
       
   681 // This entry marks the end of the dynamic array. mandatory
       
   682 #define DT_NULL 0
       
   683 // Index in the string table of the name of a needed library. multiple
       
   684 #define DT_NEEDED 1
       
   685 // These entries are unused by versions 1-2 of the ARM EABI. unused
       
   686 #define DT_PLTRELSZ 2
       
   687 #define DT_PLTGOT 3
       
   688 // The offset of the hash table section in the dynamic segment. mandatory
       
   689 #define DT_HASH 4
       
   690 // The offset of the string table section in the dynamic segment. mandatory
       
   691 #define DT_STRTAB 5
       
   692 //  The offset of the symbol table section in the dynamic segment. mandatory
       
   693 #define DT_SYMTAB 6
       
   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
       
   697 #define DT_RELA 7
       
   698 #define DT_RELASZ 8
       
   699 #define DT_RELAENT 9
       
   700 // The byte size of the string table section. mandatory
       
   701 #define DT_STRSZ 10
       
   702 // The byte size of an ARM symbol table entry. mandatory
       
   703 #define DT_SYMENT 11
       
   704 // These entries are unused by versions 1-2 of the ARM EABI. unused
       
   705 #define DT_INIT 12
       
   706 #define DT_FINI 13
       
   707 // The Index in the string table of the name of this shared object. mandatory
       
   708 #define DT_SONAME 14
       
   709 // Unused by the ARM EABI. unused
       
   710 #define DT_RPATH 15
       
   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
       
   714 //entry. optional
       
   715 #define DT_REL 17
       
   716 #define DT_RELSZ 18
       
   717 #define DT_RELENT 19
       
   718 // These entries are unused by versions 1-2 of the ARM EABI. unused
       
   719 #define DT_PLTREL 20
       
   720 #define DT_DEBUG 21
       
   721 #define DT_TEXTREL 22
       
   722 #define DT_JMPREL 23
       
   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
       
   728 
       
   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
       
   732 										table */
       
   733 #define	DT_VERDEFNUM	0x6ffffffd	/* Number of version definitions */
       
   734 #define	DT_VERNEED		0x6ffffffe	/* Address of table with needed
       
   735 										versions */
       
   736 #define	DT_VERNEEDNUM	0x6fffffff	/* Number of needed versions */
       
   737 
       
   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
       
   750 
       
   751 // What the hash table looks like in the dynamic segment
       
   752 typedef struct Elf32_HashTable {
       
   753   Elf32_Word nBuckets;
       
   754   Elf32_Word nChains;
       
   755   // Elf32_Word bucket[nBuckets];
       
   756   // Elf32_Word chain[nChains];
       
   757 } Elf32_HashTable;
       
   758 
       
   759 
       
   760 typedef struct
       
   761 {
       
   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
       
   769 									entry */
       
   770 } Elf32_Verdef;
       
   771 
       
   772 typedef struct
       
   773 {
       
   774   Elf32_Word	vda_name;		/* Version or dependency names */
       
   775   Elf32_Word	vda_next;		/* Offset in bytes to next verdaux
       
   776 									entry */
       
   777 } Elf32_Verdaux;
       
   778 
       
   779 
       
   780 typedef struct
       
   781 {
       
   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
       
   785 									dependency */
       
   786   Elf32_Word	vn_aux;			/* Offset in bytes to vernaux array */
       
   787   Elf32_Word	vn_next;		/* Offset in bytes to next verneed
       
   788 					   entry */
       
   789 } Elf32_Verneed;
       
   790 
       
   791 typedef struct {
       
   792 	Elf32_Word    vna_hash;
       
   793 	Elf32_Half    vna_flags;
       
   794 	Elf32_Half    vna_other;
       
   795 	Elf32_Word    vna_name;
       
   796 	Elf32_Word    vna_next;
       
   797 } Elf32_Vernaux;
       
   798 
       
   799 
       
   800 enum ESegmentType 
       
   801 {
       
   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.
       
   810 };
       
   811 
       
   812 #endif
       
   813 
       
   814 
       
   815 
       
   816 
       
   817