Home | History | Annotate | Download | only in elff
      1 /* Copyright (C) 2007-2010 The Android Open Source Project
      2 **
      3 ** This software is licensed under the terms of the GNU General Public
      4 ** License version 2, as published by the Free Software Foundation, and
      5 ** may be copied, distributed, and modified under those terms.
      6 **
      7 ** This program is distributed in the hope that it will be useful,
      8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
      9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 ** GNU General Public License for more details.
     11 */
     12 
     13 /*
     14  * Contains declarations of types, constants and structures
     15  * describing ELF file format.
     16  */
     17 
     18 #ifndef ELFF_ELH_H_
     19 #define ELFF_ELH_H_
     20 
     21 #include <stdint.h>
     22 #include "elff-common.h"
     23 
     24 //=============================================================================
     25 // ELF file definitions
     26 //=============================================================================
     27 
     28 /*
     29  * ELF format documentation uses Elf##_Xxx notation for data types, where
     30  * ## stands for CPU architecture (32, or 64 bit), and Xxx stands for a
     31  * specific type. For the sake of compliance, we will follow doc's notation
     32  * when defining types used in ELF file descriptors. However, for the sake of
     33  * code simplicity, we will drop CPU architecture index from the types that
     34  * have equal sizes on both, 32 and 64 bit architectures.
     35  */
     36 
     37 /*
     38  * Architecture independent types.
     39  */
     40 
     41 typedef uint8_t   Elf_Byte;
     42 typedef int8_t    Elf_Sbyte;
     43 
     44 typedef uint16_t  Elf_Half;
     45 typedef int16_t   Elf_Shalf;
     46 
     47 typedef uint32_t  Elf_Word;
     48 typedef int32_t   Elf_Sword;
     49 
     50 typedef uint64_t  Elf_Xword;
     51 typedef int64_t   Elf_Sxword;
     52 
     53 /*
     54  * Architecture dependent types.
     55  */
     56 
     57 /* 32-bit ELF address. */
     58 typedef uint32_t  Elf32_Addr;
     59 /* 32-bit ELF offset. */
     60 typedef uint32_t  Elf32_Off;
     61 
     62 /* 64-bit ELF address. */
     63 typedef uint64_t  Elf64_Addr;
     64 /* 64-bit ELF offset. */
     65 typedef uint64_t  Elf64_Off;
     66 
     67 //=============================================================================
     68 // ELF file header
     69 //=============================================================================
     70 
     71 /* Byte size of the fixed portion of ELF header. */
     72 #define EI_NIDENT	16
     73 
     74 /* Common (architecture independent portion of) ELF file header,
     75  * that starts at offset 0 in ELF file.
     76  */
     77 typedef struct Elf_CommonHdr {
     78   union {
     79     struct {
     80       /* ei_mag0 - ei_mag3 contain ELF header signature. See ELFMAGx bellow. */
     81       Elf_Byte  ei_mag0;
     82       Elf_Byte  ei_mag1;
     83       Elf_Byte  ei_mag2;
     84       Elf_Byte  ei_mag3;
     85 
     86       /* File class (32, or 64 bits). See ELFCLASSxxx bellow. */
     87       Elf_Byte  ei_class;
     88 
     89       /* Data encoding (endianness). See ELFDATAxxx bellow. */
     90       Elf_Byte  ei_data;
     91 
     92       /* ELF header version number. */
     93       Elf_Byte  ei_version;
     94     } ei_info;
     95     unsigned char e_ident[EI_NIDENT];
     96   };
     97 
     98   /* File type (executable, shared object, etc.) */
     99   Elf_Half      e_type;
    100 
    101   /* Processor type. */
    102   Elf_Half      e_machine;
    103 
    104   /* File version. */
    105   Elf_Word      e_version;
    106 } Elf_CommonHdr;
    107 
    108 
    109 /* ELF header signature. */
    110 #define ELFMAG0		0x7f
    111 #define ELFMAG1		'E'
    112 #define ELFMAG2		'L'
    113 #define ELFMAG3		'F'
    114 #define ELFMAG		"\177ELF"
    115 #define SELFMAG		4
    116 
    117 /*
    118  * Possible ei_class values.
    119  */
    120 
    121 /* Invalid. */
    122 #define ELFCLASSNONE  0
    123 /* It's 32-bit ELF file. */
    124 #define ELFCLASS32    1
    125 /* It's 64-bit ELF file. */
    126 #define ELFCLASS64    2
    127 
    128 /*
    129  * Possible ei_data values.
    130  */
    131 
    132 /* Invalid. */
    133 #define ELFDATANONE   0
    134 /* ELF data is formatted in little-endian. */
    135 #define ELFDATA2LSB   1
    136 /* ELF data is formatted in big-endian. */
    137 #define ELFDATA2MSB   2
    138 
    139 /* Tempated (architecture dependent) ELF file header.
    140  * Template param:
    141  *  Elf_Addr - Actual type for address encoding (Elf32_Addr, or Elf64_Addr).
    142  *  Elf_Off - Actual type for offset encoding (Elf32_Off, or Elf64_Off).
    143  */
    144 template <typename Elf_Addr, typename Elf_Off>
    145 struct Elf_FHdr {
    146   /* Common header. */
    147   Elf_CommonHdr common;
    148 
    149   /* Module entry point. */
    150   Elf_Addr      e_entry;
    151 
    152   /* Programm header table offset (in bytes) from the beginning of the file.
    153    * Zero if there is no programm header in this file.
    154    */
    155   Elf_Off       e_phoff;
    156 
    157   /* Section header table offset (in bytes) from the beginning of the file.
    158    * Zero if there is no section header in this file.
    159    */
    160   Elf_Off       e_shoff;
    161 
    162   /* Processor-specific flags. */
    163   Elf_Word      e_flags;
    164 
    165   /* This header size in bytes. */
    166   Elf_Half      e_ehsize;
    167 
    168   /* Byte size of an entry in programm header table. All entries
    169    * in the table are the same size.
    170    */
    171   Elf_Half      e_phentsize;
    172 
    173   /* Number of entries in programm header table. */
    174   Elf_Half      e_phnum;
    175 
    176   /* Byte size of an entry in section header table. All entries
    177    * in the table are the same size.
    178    */
    179   Elf_Half      e_shentsize;
    180 
    181   /* Number of entries in section header table. */
    182   Elf_Half      e_shnum;
    183 
    184   /* Zero-based index of an entry for name string table section in the section
    185    * header table. If no such section exists in the file this field contains
    186    * SHN_UNDEF value.
    187    */
    188   Elf_Half      e_shstrndx;
    189 };
    190 /* 32-bit ELF header. */
    191 typedef Elf_FHdr<Elf32_Addr, Elf32_Off> Elf32_FHdr;
    192 /* 64-bit ELF header. */
    193 typedef Elf_FHdr<Elf64_Addr, Elf64_Off> Elf64_FHdr;
    194 
    195 //=============================================================================
    196 // ELF section header
    197 //=============================================================================
    198 
    199 /* Templated (architecture dependent) section header for ELF file.
    200  * Template param:
    201  *  Elf_Addr - Actual type for address encoding (Elf32_Addr, or Elf64_Addr).
    202  *  Elf_Off - Actual type for offset encoding (Elf32_Off, or Elf64_Off).
    203  */
    204 template <typename Elf_Addr, typename Elf_Off>
    205 struct Elf_SHdr {
    206   /* Index (byte offset) of section name in the name string table section. */
    207   Elf_Word    sh_name;
    208 
    209   /* Section type and semantics. */
    210   Elf_Word    sh_type;
    211 
    212   /* Section flags and attributes. */
    213   Elf_Word    sh_flags;
    214 
    215   /* Section address in the memory image of the process. */
    216   Elf_Addr    sh_addr;
    217 
    218   /* Byte offset from the beginning of the ELF file to the first
    219    * byte in the section.
    220    */
    221   Elf_Off     sh_offset;
    222 
    223   /* Section size in bytes. */
    224   Elf_Word    sh_size;
    225 
    226   /* Section header table index link. Depends on section type. */
    227   Elf_Word    sh_link;
    228 
    229   /* Extra section information, depending on the section type. */
    230   Elf_Word    sh_info;
    231 
    232   /* Address alignment constrains. 0 and 1 means that section has no
    233    * alignment constrains.
    234    */
    235   Elf_Word    sh_addralign;
    236 
    237   /* Entry size for sections that hold some kind of a table. */
    238   Elf_Word    sh_entsize;
    239 };
    240 /* 32-bit section header. */
    241 typedef Elf_SHdr<Elf32_Addr, Elf32_Off> Elf32_SHdr;
    242 /* 64-bit section header. */
    243 typedef Elf_SHdr<Elf64_Addr, Elf64_Off> Elf64_SHdr;
    244 
    245 /*
    246  * Special section indices
    247  */
    248 #define SHN_UNDEF       0
    249 #define SHN_LORESERVE   0xff00
    250 #define SHN_LOPROC      0xff00
    251 #define SHN_HIPROC      0xff1f
    252 #define SHN_LOOS        0xff20
    253 #define SHN_HIOS        0xff3f
    254 #define SHN_ABS         0xfff1
    255 #define SHN_COMMON      0xfff2
    256 #define SHN_XINDEX      0xffff
    257 #define SHN_HIRESERVE   0xffff
    258 
    259 /*
    260  * Values for sh_type
    261  */
    262 #define SHT_NULL            0
    263 #define SHT_PROGBITS        1
    264 #define SHT_SYMTAB          2
    265 #define SHT_STRTAB          3
    266 #define SHT_RELA            4
    267 #define SHT_HASH            5
    268 #define SHT_DYNAMIC         6
    269 #define SHT_NOTE            7
    270 #define SHT_NOBITS          8
    271 #define SHT_REL             9
    272 #define SHT_SHLIB           10
    273 #define SHT_DYNSYM          11
    274 #define SHT_INIT_ARRAY      14
    275 #define SHT_FINI_ARRAY      15
    276 #define SHT_PREINIT_ARRAY   16
    277 #define SHT_GROUP           17
    278 #define SHT_SYMTAB_SHNDX    18
    279 #define SHT_NUM             19
    280 
    281 #endif  // ELFF_ELH_H_
    282