epoc32/include/tools/elfdefs.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
     1 // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
     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