Home | History | Annotate | Download | only in elfcpp
      1 // elfcpp_internal.h -- internals for elfcpp   -*- C++ -*-
      2 
      3 // Copyright (C) 2006-2014 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) google.com>.
      5 
      6 // This file is part of elfcpp.
      7 
      8 // This program is free software; you can redistribute it and/or
      9 // modify it under the terms of the GNU Library General Public License
     10 // as published by the Free Software Foundation; either version 2, or
     11 // (at your option) any later version.
     12 
     13 // In addition to the permissions in the GNU Library General Public
     14 // License, the Free Software Foundation gives you unlimited
     15 // permission to link the compiled version of this file into
     16 // combinations with other programs, and to distribute those
     17 // combinations without any restriction coming from the use of this
     18 // file.  (The Library Public License restrictions do apply in other
     19 // respects; for example, they cover modification of the file, and
     20 /// distribution when not linked into a combined executable.)
     21 
     22 // This program is distributed in the hope that it will be useful, but
     23 // WITHOUT ANY WARRANTY; without even the implied warranty of
     24 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     25 // Library General Public License for more details.
     26 
     27 // You should have received a copy of the GNU Library General Public
     28 // License along with this program; if not, write to the Free Software
     29 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
     30 // 02110-1301, USA.
     31 
     32 // This is included by elfcpp.h, the external interface, but holds
     33 // information which we want to keep private.
     34 
     35 #ifndef ELFCPP_INTERNAL_H
     36 #define ELFCPP_INTERNAL_H
     37 
     38 namespace elfcpp
     39 {
     40 
     41 namespace internal
     42 {
     43 
     44 // The ELF file header.
     45 
     46 template<int size>
     47 struct Ehdr_data
     48 {
     49   unsigned char e_ident[EI_NIDENT];
     50   Elf_Half e_type;
     51   Elf_Half e_machine;
     52   Elf_Word e_version;
     53   typename Elf_types<size>::Elf_Addr e_entry;
     54   typename Elf_types<size>::Elf_Off e_phoff;
     55   typename Elf_types<size>::Elf_Off e_shoff;
     56   Elf_Word e_flags;
     57   Elf_Half e_ehsize;
     58   Elf_Half e_phentsize;
     59   Elf_Half e_phnum;
     60   Elf_Half e_shentsize;
     61   Elf_Half e_shnum;
     62   Elf_Half e_shstrndx;
     63 };
     64 
     65 // An ELF section header.
     66 
     67 template<int size>
     68 struct Shdr_data
     69 {
     70   Elf_Word sh_name;
     71   Elf_Word sh_type;
     72   typename Elf_types<size>::Elf_WXword sh_flags;
     73   typename Elf_types<size>::Elf_Addr sh_addr;
     74   typename Elf_types<size>::Elf_Off sh_offset;
     75   typename Elf_types<size>::Elf_WXword sh_size;
     76   Elf_Word sh_link;
     77   Elf_Word sh_info;
     78   typename Elf_types<size>::Elf_WXword sh_addralign;
     79   typename Elf_types<size>::Elf_WXword sh_entsize;
     80 };
     81 
     82 // An ELF segment header.  We use template specialization for the
     83 // 32-bit and 64-bit versions because the fields are in a different
     84 // order.
     85 
     86 template<int size>
     87 struct Phdr_data;
     88 
     89 template<>
     90 struct Phdr_data<32>
     91 {
     92   Elf_Word p_type;
     93   Elf_types<32>::Elf_Off p_offset;
     94   Elf_types<32>::Elf_Addr p_vaddr;
     95   Elf_types<32>::Elf_Addr p_paddr;
     96   Elf_Word p_filesz;
     97   Elf_Word p_memsz;
     98   Elf_Word p_flags;
     99   Elf_Word p_align;
    100 };
    101 
    102 template<>
    103 struct Phdr_data<64>
    104 {
    105   Elf_Word p_type;
    106   Elf_Word p_flags;
    107   Elf_types<64>::Elf_Off p_offset;
    108   Elf_types<64>::Elf_Addr p_vaddr;
    109   Elf_types<64>::Elf_Addr p_paddr;
    110   Elf_Xword p_filesz;
    111   Elf_Xword p_memsz;
    112   Elf_Xword p_align;
    113 };
    114 
    115 // An ELF symbol table entry.  We use template specialization for the
    116 // 32-bit and 64-bit versions because the fields are in a different
    117 // order.
    118 
    119 template<int size>
    120 struct Sym_data;
    121 
    122 template<>
    123 struct Sym_data<32>
    124 {
    125   Elf_Word st_name;
    126   Elf_types<32>::Elf_Addr st_value;
    127   Elf_Word st_size;
    128   unsigned char st_info;
    129   unsigned char st_other;
    130   Elf_Half st_shndx;
    131 };
    132 
    133 template<>
    134 struct Sym_data<64>
    135 {
    136   Elf_Word st_name;
    137   unsigned char st_info;
    138   unsigned char st_other;
    139   Elf_Half st_shndx;
    140   Elf_types<64>::Elf_Addr st_value;
    141   Elf_Xword st_size;
    142 };
    143 
    144 // ELF relocation table entries.
    145 
    146 template<int size>
    147 struct Rel_data
    148 {
    149   typename Elf_types<size>::Elf_Addr r_offset;
    150   typename Elf_types<size>::Elf_WXword r_info;
    151 };
    152 
    153 template<int size>
    154 struct Rela_data
    155 {
    156   typename Elf_types<size>::Elf_Addr r_offset;
    157   typename Elf_types<size>::Elf_WXword r_info;
    158   typename Elf_types<size>::Elf_Swxword r_addend;
    159 };
    160 
    161 // An entry in the ELF SHT_DYNAMIC section aka PT_DYNAMIC segment.
    162 
    163 template<int size>
    164 struct Dyn_data
    165 {
    166   typename Elf_types<size>::Elf_Swxword d_tag;
    167   typename Elf_types<size>::Elf_WXword d_val;
    168 };
    169 
    170 // An entry in a SHT_GNU_verdef section.  This structure is the same
    171 // in 32-bit and 64-bit ELF files.
    172 
    173 struct Verdef_data
    174 {
    175   // Version number of structure (VER_DEF_*).
    176   Elf_Half vd_version;
    177   // Bit flags (VER_FLG_*).
    178   Elf_Half vd_flags;
    179   // Version index.
    180   Elf_Half vd_ndx;
    181   // Number of auxiliary Verdaux entries.
    182   Elf_Half vd_cnt;
    183   // Hash of name.
    184   Elf_Word vd_hash;
    185   // Byte offset to first Verdaux entry.
    186   Elf_Word vd_aux;
    187   // Byte offset to next Verdef entry.
    188   Elf_Word vd_next;
    189 };
    190 
    191 // An auxiliary entry in a SHT_GNU_verdef section.  This structure is
    192 // the same in 32-bit and 64-bit ELF files.
    193 
    194 struct Verdaux_data
    195 {
    196   // Offset in string table of version name.
    197   Elf_Word vda_name;
    198   // Byte offset to next Verdaux entry.
    199   Elf_Word vda_next;
    200 };
    201 
    202 // An entry in a SHT_GNU_verneed section.  This structure is the same
    203 // in 32-bit and 64-bit ELF files.
    204 
    205 struct Verneed_data
    206 {
    207   // Version number of structure (VER_NEED_*).
    208   Elf_Half vn_version;
    209   // Number of auxiliary Vernaux entries.
    210   Elf_Half vn_cnt;
    211   // Offset in string table of library name.
    212   Elf_Word vn_file;
    213   // Byte offset to first Vernaux entry.
    214   Elf_Word vn_aux;
    215   // Byt eoffset to next Verneed entry.
    216   Elf_Word vn_next;
    217 };
    218 
    219 // An auxiliary entry in a SHT_GNU_verneed section.  This structure is
    220 // the same in 32-bit and 64-bit ELF files.
    221 
    222 struct Vernaux_data
    223 {
    224   // Hash of dependency name.
    225   Elf_Word vna_hash;
    226   // Bit flags (VER_FLG_*).
    227   Elf_Half vna_flags;
    228   // Version index used in SHT_GNU_versym entries.
    229   Elf_Half vna_other;
    230   // Offset in string table of version name.
    231   Elf_Word vna_name;
    232   // Byte offset to next Vernaux entry.
    233   Elf_Word vna_next;
    234 };
    235 
    236 } // End namespace internal.
    237 
    238 } // End namespace elfcpp.
    239 
    240 #endif // !defined(ELFCPP_INTERNAL_H)
    241