Home | History | Annotate | Download | only in courgette
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef COURGETTE_ELF_TYPES_H_
      6 #define COURGETTE_ELF_TYPES_H_
      7 
      8 //
      9 // This header defines various types from the ELF file spec, but no code
     10 // related to using them.
     11 //
     12 
     13 typedef uint32 Elf32_Addr;  // Unsigned program address
     14 typedef uint16 Elf32_Half;  // Unsigned medium integer
     15 typedef uint32 Elf32_Off;  // Unsigned file offset
     16 typedef int32 Elf32_Sword;  // Signed large integer
     17 typedef uint32 Elf32_Word;  // Unsigned large integer
     18 
     19 
     20 // The header at the top of the file
     21 struct Elf32_Ehdr {
     22   unsigned char  e_ident[16];
     23   Elf32_Half     e_type;
     24   Elf32_Half     e_machine;
     25   Elf32_Word     e_version;
     26   Elf32_Addr     e_entry;
     27   Elf32_Off      e_phoff;
     28   Elf32_Off      e_shoff;
     29   Elf32_Word     e_flags;
     30   Elf32_Half     e_ehsize;
     31   Elf32_Half     e_phentsize;
     32   Elf32_Half     e_phnum;
     33   Elf32_Half     e_shentsize;
     34   Elf32_Half     e_shnum;
     35   Elf32_Half     e_shstrndx;
     36 };
     37 
     38 // values for header->e_type
     39 enum e_type_values {
     40   ET_NONE = 0,  // No file type
     41   ET_REL = 1,  // Relocatable file
     42   ET_EXEC = 2,  // Executable file
     43   ET_DYN = 3,  // Shared object file
     44   ET_CORE = 4,  // Core file
     45   ET_LOPROC = 0xff00,  // Processor-specific
     46   ET_HIPROC = 0xfff  // Processor-specific
     47 };
     48 
     49 // values for header->e_machine
     50 enum e_machine_values {
     51   EM_NONE = 0,  // No machine
     52   EM_386 = 3,  // Intel Architecture
     53   EM_ARM = 40,  // ARM Architecture
     54   EM_x86_64 = 62,  // Intel x86-64 Architecture
     55   // Other values skipped
     56 };
     57 
     58 // A section header in the section header table
     59 struct Elf32_Shdr {
     60   Elf32_Word   sh_name;
     61   Elf32_Word   sh_type;
     62   Elf32_Word   sh_flags;
     63   Elf32_Addr   sh_addr;
     64   Elf32_Off    sh_offset;
     65   Elf32_Word   sh_size;
     66   Elf32_Word   sh_link;
     67   Elf32_Word   sh_info;
     68   Elf32_Word   sh_addralign;
     69   Elf32_Word   sh_entsize;
     70 };
     71 
     72 // Values for the section type field in a section header
     73 enum sh_type_values {
     74   SHT_NULL = 0,
     75   SHT_PROGBITS = 1,
     76   SHT_SYMTAB = 2,
     77   SHT_STRTAB = 3,
     78   SHT_RELA = 4,
     79   SHT_HASH = 5,
     80   SHT_DYNAMIC = 6,
     81   SHT_NOTE = 7,
     82   SHT_NOBITS = 8,
     83   SHT_REL = 9,
     84   SHT_SHLIB = 10,
     85   SHT_DYNSYM = 11,
     86   SHT_INIT_ARRAY = 14,
     87   SHT_FINI_ARRAY = 15,
     88   SHT_LOPROC = 0x70000000,
     89   SHT_HIPROC = 0x7fffffff,
     90   SHT_LOUSER = 0x80000000,
     91   SHT_HIUSER = 0xffffffff,
     92 };
     93 
     94 struct Elf32_Phdr {
     95   Elf32_Word    p_type;
     96   Elf32_Off     p_offset;
     97   Elf32_Addr    p_vaddr;
     98   Elf32_Addr    p_paddr;
     99   Elf32_Word    p_filesz;
    100   Elf32_Word    p_memsz;
    101   Elf32_Word    p_flags;
    102   Elf32_Word    p_align;
    103 };
    104 
    105 // Values for the segment type field in a program segment header
    106 enum ph_type_values {
    107   PT_NULL = 0,
    108   PT_LOAD = 1,
    109   PT_DYNAMIC = 2,
    110   PT_INTERP = 3,
    111   PT_NOTE = 4,
    112   PT_SHLIB = 5,
    113   PT_PHDR = 6,
    114   PT_LOPROC = 0x70000000,
    115   PT_HIPROC = 0x7fffffff
    116 };
    117 
    118 struct Elf32_Rel {
    119   Elf32_Addr    r_offset;
    120   Elf32_Word    r_info;
    121 };
    122 
    123 struct Elf32_Rela {
    124   Elf32_Addr    r_offset;
    125   Elf32_Word    r_info;
    126   Elf32_Sword   r_addend;
    127 };
    128 
    129 enum elf32_rel_386_type_values {
    130   R_386_NONE = 0,
    131   R_386_32 = 1,
    132   R_386_PC32 = 2,
    133   R_386_GOT32 = 3,
    134   R_386_PLT32 = 4,
    135   R_386_COPY = 5,
    136   R_386_GLOB_DAT = 6,
    137   R_386_JMP_SLOT = 7,
    138   R_386_RELATIVE = 8,
    139   R_386_GOTOFF = 9,
    140   R_386_GOTPC = 10,
    141   R_386_TLS_TPOFF = 14,
    142 };
    143 
    144 enum elf32_rel_arm_type_values {
    145   R_ARM_RELATIVE = 23,
    146 };
    147 
    148 #endif  // COURGETTE_ELF_TYPES_H_
    149