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