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