1*a9fa9459Szrj // elfcpp.h -- main header file for elfcpp -*- C++ -*- 2*a9fa9459Szrj 3*a9fa9459Szrj // Copyright (C) 2006-2016 Free Software Foundation, Inc. 4*a9fa9459Szrj // Written by Ian Lance Taylor <iant@google.com>. 5*a9fa9459Szrj 6*a9fa9459Szrj // This file is part of elfcpp. 7*a9fa9459Szrj 8*a9fa9459Szrj // This program is free software; you can redistribute it and/or 9*a9fa9459Szrj // modify it under the terms of the GNU Library General Public License 10*a9fa9459Szrj // as published by the Free Software Foundation; either version 2, or 11*a9fa9459Szrj // (at your option) any later version. 12*a9fa9459Szrj 13*a9fa9459Szrj // In addition to the permissions in the GNU Library General Public 14*a9fa9459Szrj // License, the Free Software Foundation gives you unlimited 15*a9fa9459Szrj // permission to link the compiled version of this file into 16*a9fa9459Szrj // combinations with other programs, and to distribute those 17*a9fa9459Szrj // combinations without any restriction coming from the use of this 18*a9fa9459Szrj // file. (The Library Public License restrictions do apply in other 19*a9fa9459Szrj // respects; for example, they cover modification of the file, and 20*a9fa9459Szrj // distribution when not linked into a combined executable.) 21*a9fa9459Szrj 22*a9fa9459Szrj // This program is distributed in the hope that it will be useful, but 23*a9fa9459Szrj // WITHOUT ANY WARRANTY; without even the implied warranty of 24*a9fa9459Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 25*a9fa9459Szrj // Library General Public License for more details. 26*a9fa9459Szrj 27*a9fa9459Szrj // You should have received a copy of the GNU Library General Public 28*a9fa9459Szrj // License along with this program; if not, write to the Free Software 29*a9fa9459Szrj // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 30*a9fa9459Szrj // 02110-1301, USA. 31*a9fa9459Szrj 32*a9fa9459Szrj // This is the external interface for elfcpp. 33*a9fa9459Szrj 34*a9fa9459Szrj #ifndef ELFCPP_H 35*a9fa9459Szrj #define ELFCPP_H 36*a9fa9459Szrj 37*a9fa9459Szrj #include "elfcpp_swap.h" 38*a9fa9459Szrj 39*a9fa9459Szrj #include <stdint.h> 40*a9fa9459Szrj 41*a9fa9459Szrj namespace elfcpp 42*a9fa9459Szrj { 43*a9fa9459Szrj 44*a9fa9459Szrj // Basic ELF types. 45*a9fa9459Szrj 46*a9fa9459Szrj // These types are always the same size. 47*a9fa9459Szrj 48*a9fa9459Szrj typedef uint16_t Elf_Half; 49*a9fa9459Szrj typedef uint32_t Elf_Word; 50*a9fa9459Szrj typedef int32_t Elf_Sword; 51*a9fa9459Szrj typedef uint64_t Elf_Xword; 52*a9fa9459Szrj typedef int64_t Elf_Sxword; 53*a9fa9459Szrj 54*a9fa9459Szrj // These types vary in size depending on the ELF file class. The 55*a9fa9459Szrj // template parameter should be 32 or 64. 56*a9fa9459Szrj 57*a9fa9459Szrj template<int size> 58*a9fa9459Szrj struct Elf_types; 59*a9fa9459Szrj 60*a9fa9459Szrj template<> 61*a9fa9459Szrj struct Elf_types<32> 62*a9fa9459Szrj { 63*a9fa9459Szrj typedef uint32_t Elf_Addr; 64*a9fa9459Szrj typedef uint32_t Elf_Off; 65*a9fa9459Szrj typedef uint32_t Elf_WXword; 66*a9fa9459Szrj typedef int32_t Elf_Swxword; 67*a9fa9459Szrj }; 68*a9fa9459Szrj 69*a9fa9459Szrj template<> 70*a9fa9459Szrj struct Elf_types<64> 71*a9fa9459Szrj { 72*a9fa9459Szrj typedef uint64_t Elf_Addr; 73*a9fa9459Szrj typedef uint64_t Elf_Off; 74*a9fa9459Szrj typedef uint64_t Elf_WXword; 75*a9fa9459Szrj typedef int64_t Elf_Swxword; 76*a9fa9459Szrj }; 77*a9fa9459Szrj 78*a9fa9459Szrj // Offsets within the Ehdr e_ident field. 79*a9fa9459Szrj 80*a9fa9459Szrj const int EI_MAG0 = 0; 81*a9fa9459Szrj const int EI_MAG1 = 1; 82*a9fa9459Szrj const int EI_MAG2 = 2; 83*a9fa9459Szrj const int EI_MAG3 = 3; 84*a9fa9459Szrj const int EI_CLASS = 4; 85*a9fa9459Szrj const int EI_DATA = 5; 86*a9fa9459Szrj const int EI_VERSION = 6; 87*a9fa9459Szrj const int EI_OSABI = 7; 88*a9fa9459Szrj const int EI_ABIVERSION = 8; 89*a9fa9459Szrj const int EI_PAD = 9; 90*a9fa9459Szrj const int EI_NIDENT = 16; 91*a9fa9459Szrj 92*a9fa9459Szrj // The valid values found in Ehdr e_ident[EI_MAG0 through EI_MAG3]. 93*a9fa9459Szrj 94*a9fa9459Szrj const int ELFMAG0 = 0x7f; 95*a9fa9459Szrj const int ELFMAG1 = 'E'; 96*a9fa9459Szrj const int ELFMAG2 = 'L'; 97*a9fa9459Szrj const int ELFMAG3 = 'F'; 98*a9fa9459Szrj 99*a9fa9459Szrj // The valid values found in Ehdr e_ident[EI_CLASS]. 100*a9fa9459Szrj 101*a9fa9459Szrj enum 102*a9fa9459Szrj { 103*a9fa9459Szrj ELFCLASSNONE = 0, 104*a9fa9459Szrj ELFCLASS32 = 1, 105*a9fa9459Szrj ELFCLASS64 = 2 106*a9fa9459Szrj }; 107*a9fa9459Szrj 108*a9fa9459Szrj // The valid values found in Ehdr e_ident[EI_DATA]. 109*a9fa9459Szrj 110*a9fa9459Szrj enum 111*a9fa9459Szrj { 112*a9fa9459Szrj ELFDATANONE = 0, 113*a9fa9459Szrj ELFDATA2LSB = 1, 114*a9fa9459Szrj ELFDATA2MSB = 2 115*a9fa9459Szrj }; 116*a9fa9459Szrj 117*a9fa9459Szrj // The valid values found in Ehdr e_ident[EI_VERSION] and e_version. 118*a9fa9459Szrj 119*a9fa9459Szrj enum 120*a9fa9459Szrj { 121*a9fa9459Szrj EV_NONE = 0, 122*a9fa9459Szrj EV_CURRENT = 1 123*a9fa9459Szrj }; 124*a9fa9459Szrj 125*a9fa9459Szrj // The valid values found in Ehdr e_ident[EI_OSABI]. 126*a9fa9459Szrj 127*a9fa9459Szrj enum ELFOSABI 128*a9fa9459Szrj { 129*a9fa9459Szrj ELFOSABI_NONE = 0, 130*a9fa9459Szrj ELFOSABI_HPUX = 1, 131*a9fa9459Szrj ELFOSABI_NETBSD = 2, 132*a9fa9459Szrj ELFOSABI_GNU = 3, 133*a9fa9459Szrj // ELFOSABI_LINUX is an alias for ELFOSABI_GNU. 134*a9fa9459Szrj ELFOSABI_LINUX = 3, 135*a9fa9459Szrj ELFOSABI_SOLARIS = 6, 136*a9fa9459Szrj ELFOSABI_AIX = 7, 137*a9fa9459Szrj ELFOSABI_IRIX = 8, 138*a9fa9459Szrj ELFOSABI_FREEBSD = 9, 139*a9fa9459Szrj ELFOSABI_TRU64 = 10, 140*a9fa9459Szrj ELFOSABI_MODESTO = 11, 141*a9fa9459Szrj ELFOSABI_OPENBSD = 12, 142*a9fa9459Szrj ELFOSABI_OPENVMS = 13, 143*a9fa9459Szrj ELFOSABI_NSK = 14, 144*a9fa9459Szrj ELFOSABI_AROS = 15, 145*a9fa9459Szrj // A GNU extension for the ARM. 146*a9fa9459Szrj ELFOSABI_ARM = 97, 147*a9fa9459Szrj // A GNU extension for the MSP. 148*a9fa9459Szrj ELFOSABI_STANDALONE = 255 149*a9fa9459Szrj }; 150*a9fa9459Szrj 151*a9fa9459Szrj // The valid values found in the Ehdr e_type field. 152*a9fa9459Szrj 153*a9fa9459Szrj enum ET 154*a9fa9459Szrj { 155*a9fa9459Szrj ET_NONE = 0, 156*a9fa9459Szrj ET_REL = 1, 157*a9fa9459Szrj ET_EXEC = 2, 158*a9fa9459Szrj ET_DYN = 3, 159*a9fa9459Szrj ET_CORE = 4, 160*a9fa9459Szrj ET_LOOS = 0xfe00, 161*a9fa9459Szrj ET_HIOS = 0xfeff, 162*a9fa9459Szrj ET_LOPROC = 0xff00, 163*a9fa9459Szrj ET_HIPROC = 0xffff 164*a9fa9459Szrj }; 165*a9fa9459Szrj 166*a9fa9459Szrj // The valid values found in the Ehdr e_machine field. 167*a9fa9459Szrj 168*a9fa9459Szrj enum EM 169*a9fa9459Szrj { 170*a9fa9459Szrj EM_NONE = 0, 171*a9fa9459Szrj EM_M32 = 1, 172*a9fa9459Szrj EM_SPARC = 2, 173*a9fa9459Szrj EM_386 = 3, 174*a9fa9459Szrj EM_68K = 4, 175*a9fa9459Szrj EM_88K = 5, 176*a9fa9459Szrj EM_IAMCU = 6, 177*a9fa9459Szrj EM_860 = 7, 178*a9fa9459Szrj EM_MIPS = 8, 179*a9fa9459Szrj EM_S370 = 9, 180*a9fa9459Szrj EM_MIPS_RS3_LE = 10, 181*a9fa9459Szrj // 11 was the old Sparc V9 ABI. 182*a9fa9459Szrj // 12 through 14 are reserved. 183*a9fa9459Szrj EM_PARISC = 15, 184*a9fa9459Szrj // 16 is reserved. 185*a9fa9459Szrj // Some old PowerPC object files use 17. 186*a9fa9459Szrj EM_VPP500 = 17, 187*a9fa9459Szrj EM_SPARC32PLUS = 18, 188*a9fa9459Szrj EM_960 = 19, 189*a9fa9459Szrj EM_PPC = 20, 190*a9fa9459Szrj EM_PPC64 = 21, 191*a9fa9459Szrj EM_S390 = 22, 192*a9fa9459Szrj // 23 through 35 are served. 193*a9fa9459Szrj EM_V800 = 36, 194*a9fa9459Szrj EM_FR20 = 37, 195*a9fa9459Szrj EM_RH32 = 38, 196*a9fa9459Szrj EM_RCE = 39, 197*a9fa9459Szrj EM_ARM = 40, 198*a9fa9459Szrj EM_ALPHA = 41, 199*a9fa9459Szrj EM_SH = 42, 200*a9fa9459Szrj EM_SPARCV9 = 43, 201*a9fa9459Szrj EM_TRICORE = 44, 202*a9fa9459Szrj EM_ARC = 45, 203*a9fa9459Szrj EM_H8_300 = 46, 204*a9fa9459Szrj EM_H8_300H = 47, 205*a9fa9459Szrj EM_H8S = 48, 206*a9fa9459Szrj EM_H8_500 = 49, 207*a9fa9459Szrj EM_IA_64 = 50, 208*a9fa9459Szrj EM_MIPS_X = 51, 209*a9fa9459Szrj EM_COLDFIRE = 52, 210*a9fa9459Szrj EM_68HC12 = 53, 211*a9fa9459Szrj EM_MMA = 54, 212*a9fa9459Szrj EM_PCP = 55, 213*a9fa9459Szrj EM_NCPU = 56, 214*a9fa9459Szrj EM_NDR1 = 57, 215*a9fa9459Szrj EM_STARCORE = 58, 216*a9fa9459Szrj EM_ME16 = 59, 217*a9fa9459Szrj EM_ST100 = 60, 218*a9fa9459Szrj EM_TINYJ = 61, 219*a9fa9459Szrj EM_X86_64 = 62, 220*a9fa9459Szrj EM_PDSP = 63, 221*a9fa9459Szrj EM_PDP10 = 64, 222*a9fa9459Szrj EM_PDP11 = 65, 223*a9fa9459Szrj EM_FX66 = 66, 224*a9fa9459Szrj EM_ST9PLUS = 67, 225*a9fa9459Szrj EM_ST7 = 68, 226*a9fa9459Szrj EM_68HC16 = 69, 227*a9fa9459Szrj EM_68HC11 = 70, 228*a9fa9459Szrj EM_68HC08 = 71, 229*a9fa9459Szrj EM_68HC05 = 72, 230*a9fa9459Szrj EM_SVX = 73, 231*a9fa9459Szrj EM_ST19 = 74, 232*a9fa9459Szrj EM_VAX = 75, 233*a9fa9459Szrj EM_CRIS = 76, 234*a9fa9459Szrj EM_JAVELIN = 77, 235*a9fa9459Szrj EM_FIREPATH = 78, 236*a9fa9459Szrj EM_ZSP = 79, 237*a9fa9459Szrj EM_MMIX = 80, 238*a9fa9459Szrj EM_HUANY = 81, 239*a9fa9459Szrj EM_PRISM = 82, 240*a9fa9459Szrj EM_AVR = 83, 241*a9fa9459Szrj EM_FR30 = 84, 242*a9fa9459Szrj EM_D10V = 85, 243*a9fa9459Szrj EM_D30V = 86, 244*a9fa9459Szrj EM_V850 = 87, 245*a9fa9459Szrj EM_M32R = 88, 246*a9fa9459Szrj EM_MN10300 = 89, 247*a9fa9459Szrj EM_MN10200 = 90, 248*a9fa9459Szrj EM_PJ = 91, 249*a9fa9459Szrj EM_OR1K = 92, 250*a9fa9459Szrj EM_ARC_A5 = 93, 251*a9fa9459Szrj EM_XTENSA = 94, 252*a9fa9459Szrj EM_VIDEOCORE = 95, 253*a9fa9459Szrj EM_TMM_GPP = 96, 254*a9fa9459Szrj EM_NS32K = 97, 255*a9fa9459Szrj EM_TPC = 98, 256*a9fa9459Szrj // Some old picoJava object files use 99 (EM_PJ is correct). 257*a9fa9459Szrj EM_SNP1K = 99, 258*a9fa9459Szrj EM_ST200 = 100, 259*a9fa9459Szrj EM_IP2K = 101, 260*a9fa9459Szrj EM_MAX = 102, 261*a9fa9459Szrj EM_CR = 103, 262*a9fa9459Szrj EM_F2MC16 = 104, 263*a9fa9459Szrj EM_MSP430 = 105, 264*a9fa9459Szrj EM_BLACKFIN = 106, 265*a9fa9459Szrj EM_SE_C33 = 107, 266*a9fa9459Szrj EM_SEP = 108, 267*a9fa9459Szrj EM_ARCA = 109, 268*a9fa9459Szrj EM_UNICORE = 110, 269*a9fa9459Szrj EM_ALTERA_NIOS2 = 113, 270*a9fa9459Szrj EM_CRX = 114, 271*a9fa9459Szrj EM_AARCH64 = 183, 272*a9fa9459Szrj EM_TILEGX = 191, 273*a9fa9459Szrj // The Morph MT. 274*a9fa9459Szrj EM_MT = 0x2530, 275*a9fa9459Szrj // DLX. 276*a9fa9459Szrj EM_DLX = 0x5aa5, 277*a9fa9459Szrj // FRV. 278*a9fa9459Szrj EM_FRV = 0x5441, 279*a9fa9459Szrj // Infineon Technologies 16-bit microcontroller with C166-V2 core. 280*a9fa9459Szrj EM_X16X = 0x4688, 281*a9fa9459Szrj // Xstorym16 282*a9fa9459Szrj EM_XSTORMY16 = 0xad45, 283*a9fa9459Szrj // Renesas M32C 284*a9fa9459Szrj EM_M32C = 0xfeb0, 285*a9fa9459Szrj // Vitesse IQ2000 286*a9fa9459Szrj EM_IQ2000 = 0xfeba, 287*a9fa9459Szrj // NIOS 288*a9fa9459Szrj EM_NIOS32 = 0xfebb 289*a9fa9459Szrj // Old AVR objects used 0x1057 (EM_AVR is correct). 290*a9fa9459Szrj // Old MSP430 objects used 0x1059 (EM_MSP430 is correct). 291*a9fa9459Szrj // Old FR30 objects used 0x3330 (EM_FR30 is correct). 292*a9fa9459Szrj // Old OpenRISC objects used 0x3426 and 0x8472 (EM_OR1K is correct). 293*a9fa9459Szrj // Old D10V objects used 0x7650 (EM_D10V is correct). 294*a9fa9459Szrj // Old D30V objects used 0x7676 (EM_D30V is correct). 295*a9fa9459Szrj // Old IP2X objects used 0x8217 (EM_IP2K is correct). 296*a9fa9459Szrj // Old PowerPC objects used 0x9025 (EM_PPC is correct). 297*a9fa9459Szrj // Old Alpha objects used 0x9026 (EM_ALPHA is correct). 298*a9fa9459Szrj // Old M32R objects used 0x9041 (EM_M32R is correct). 299*a9fa9459Szrj // Old V850 objects used 0x9080 (EM_V850 is correct). 300*a9fa9459Szrj // Old S/390 objects used 0xa390 (EM_S390 is correct). 301*a9fa9459Szrj // Old Xtensa objects used 0xabc7 (EM_XTENSA is correct). 302*a9fa9459Szrj // Old MN10300 objects used 0xbeef (EM_MN10300 is correct). 303*a9fa9459Szrj // Old MN10200 objects used 0xdead (EM_MN10200 is correct). 304*a9fa9459Szrj }; 305*a9fa9459Szrj 306*a9fa9459Szrj // A special value found in the Ehdr e_phnum field. 307*a9fa9459Szrj 308*a9fa9459Szrj enum 309*a9fa9459Szrj { 310*a9fa9459Szrj // Number of program segments stored in sh_info field of first 311*a9fa9459Szrj // section headre. 312*a9fa9459Szrj PN_XNUM = 0xffff 313*a9fa9459Szrj }; 314*a9fa9459Szrj 315*a9fa9459Szrj // Special section indices. 316*a9fa9459Szrj 317*a9fa9459Szrj enum 318*a9fa9459Szrj { 319*a9fa9459Szrj SHN_UNDEF = 0, 320*a9fa9459Szrj SHN_LORESERVE = 0xff00, 321*a9fa9459Szrj SHN_LOPROC = 0xff00, 322*a9fa9459Szrj SHN_HIPROC = 0xff1f, 323*a9fa9459Szrj SHN_LOOS = 0xff20, 324*a9fa9459Szrj SHN_HIOS = 0xff3f, 325*a9fa9459Szrj SHN_ABS = 0xfff1, 326*a9fa9459Szrj SHN_COMMON = 0xfff2, 327*a9fa9459Szrj SHN_XINDEX = 0xffff, 328*a9fa9459Szrj SHN_HIRESERVE = 0xffff, 329*a9fa9459Szrj 330*a9fa9459Szrj // Provide for initial and final section ordering in conjunction 331*a9fa9459Szrj // with the SHF_LINK_ORDER and SHF_ORDERED section flags. 332*a9fa9459Szrj SHN_BEFORE = 0xff00, 333*a9fa9459Szrj SHN_AFTER = 0xff01, 334*a9fa9459Szrj 335*a9fa9459Szrj // x86_64 specific large common symbol. 336*a9fa9459Szrj SHN_X86_64_LCOMMON = 0xff02 337*a9fa9459Szrj }; 338*a9fa9459Szrj 339*a9fa9459Szrj // The valid values found in the Shdr sh_type field. 340*a9fa9459Szrj 341*a9fa9459Szrj enum SHT 342*a9fa9459Szrj { 343*a9fa9459Szrj SHT_NULL = 0, 344*a9fa9459Szrj SHT_PROGBITS = 1, 345*a9fa9459Szrj SHT_SYMTAB = 2, 346*a9fa9459Szrj SHT_STRTAB = 3, 347*a9fa9459Szrj SHT_RELA = 4, 348*a9fa9459Szrj SHT_HASH = 5, 349*a9fa9459Szrj SHT_DYNAMIC = 6, 350*a9fa9459Szrj SHT_NOTE = 7, 351*a9fa9459Szrj SHT_NOBITS = 8, 352*a9fa9459Szrj SHT_REL = 9, 353*a9fa9459Szrj SHT_SHLIB = 10, 354*a9fa9459Szrj SHT_DYNSYM = 11, 355*a9fa9459Szrj SHT_INIT_ARRAY = 14, 356*a9fa9459Szrj SHT_FINI_ARRAY = 15, 357*a9fa9459Szrj SHT_PREINIT_ARRAY = 16, 358*a9fa9459Szrj SHT_GROUP = 17, 359*a9fa9459Szrj SHT_SYMTAB_SHNDX = 18, 360*a9fa9459Szrj SHT_LOOS = 0x60000000, 361*a9fa9459Szrj SHT_HIOS = 0x6fffffff, 362*a9fa9459Szrj SHT_LOPROC = 0x70000000, 363*a9fa9459Szrj SHT_HIPROC = 0x7fffffff, 364*a9fa9459Szrj SHT_LOUSER = 0x80000000, 365*a9fa9459Szrj SHT_HIUSER = 0xffffffff, 366*a9fa9459Szrj // The remaining values are not in the standard. 367*a9fa9459Szrj // Incremental build data. 368*a9fa9459Szrj SHT_GNU_INCREMENTAL_INPUTS = 0x6fff4700, 369*a9fa9459Szrj SHT_GNU_INCREMENTAL_SYMTAB = 0x6fff4701, 370*a9fa9459Szrj SHT_GNU_INCREMENTAL_RELOCS = 0x6fff4702, 371*a9fa9459Szrj SHT_GNU_INCREMENTAL_GOT_PLT = 0x6fff4703, 372*a9fa9459Szrj // Object attributes. 373*a9fa9459Szrj SHT_GNU_ATTRIBUTES = 0x6ffffff5, 374*a9fa9459Szrj // GNU style dynamic hash table. 375*a9fa9459Szrj SHT_GNU_HASH = 0x6ffffff6, 376*a9fa9459Szrj // List of prelink dependencies. 377*a9fa9459Szrj SHT_GNU_LIBLIST = 0x6ffffff7, 378*a9fa9459Szrj // Versions defined by file. 379*a9fa9459Szrj SHT_SUNW_verdef = 0x6ffffffd, 380*a9fa9459Szrj SHT_GNU_verdef = 0x6ffffffd, 381*a9fa9459Szrj // Versions needed by file. 382*a9fa9459Szrj SHT_SUNW_verneed = 0x6ffffffe, 383*a9fa9459Szrj SHT_GNU_verneed = 0x6ffffffe, 384*a9fa9459Szrj // Symbol versions, 385*a9fa9459Szrj SHT_SUNW_versym = 0x6fffffff, 386*a9fa9459Szrj SHT_GNU_versym = 0x6fffffff, 387*a9fa9459Szrj 388*a9fa9459Szrj SHT_SPARC_GOTDATA = 0x70000000, 389*a9fa9459Szrj 390*a9fa9459Szrj // ARM-specific section types. 391*a9fa9459Szrj // Exception Index table. 392*a9fa9459Szrj SHT_ARM_EXIDX = 0x70000001, 393*a9fa9459Szrj // BPABI DLL dynamic linking pre-emption map. 394*a9fa9459Szrj SHT_ARM_PREEMPTMAP = 0x70000002, 395*a9fa9459Szrj // Object file compatibility attributes. 396*a9fa9459Szrj SHT_ARM_ATTRIBUTES = 0x70000003, 397*a9fa9459Szrj // Support for debugging overlaid programs. 398*a9fa9459Szrj SHT_ARM_DEBUGOVERLAY = 0x70000004, 399*a9fa9459Szrj SHT_ARM_OVERLAYSECTION = 0x70000005, 400*a9fa9459Szrj 401*a9fa9459Szrj // x86_64 unwind information. 402*a9fa9459Szrj SHT_X86_64_UNWIND = 0x70000001, 403*a9fa9459Szrj 404*a9fa9459Szrj // MIPS-specific section types. 405*a9fa9459Szrj // Section contains register usage information. 406*a9fa9459Szrj SHT_MIPS_REGINFO = 0x70000006, 407*a9fa9459Szrj // Section contains miscellaneous options. 408*a9fa9459Szrj SHT_MIPS_OPTIONS = 0x7000000d, 409*a9fa9459Szrj // ABI related flags section. 410*a9fa9459Szrj SHT_MIPS_ABIFLAGS = 0x7000002a, 411*a9fa9459Szrj 412*a9fa9459Szrj // AARCH64-specific section type. 413*a9fa9459Szrj SHT_AARCH64_ATTRIBUTES = 0x70000003, 414*a9fa9459Szrj 415*a9fa9459Szrj // Link editor is to sort the entries in this section based on the 416*a9fa9459Szrj // address specified in the associated symbol table entry. 417*a9fa9459Szrj SHT_ORDERED = 0x7fffffff 418*a9fa9459Szrj }; 419*a9fa9459Szrj 420*a9fa9459Szrj // The valid bit flags found in the Shdr sh_flags field. 421*a9fa9459Szrj 422*a9fa9459Szrj enum SHF 423*a9fa9459Szrj { 424*a9fa9459Szrj SHF_WRITE = 0x1, 425*a9fa9459Szrj SHF_ALLOC = 0x2, 426*a9fa9459Szrj SHF_EXECINSTR = 0x4, 427*a9fa9459Szrj SHF_MERGE = 0x10, 428*a9fa9459Szrj SHF_STRINGS = 0x20, 429*a9fa9459Szrj SHF_INFO_LINK = 0x40, 430*a9fa9459Szrj SHF_LINK_ORDER = 0x80, 431*a9fa9459Szrj SHF_OS_NONCONFORMING = 0x100, 432*a9fa9459Szrj SHF_GROUP = 0x200, 433*a9fa9459Szrj SHF_TLS = 0x400, 434*a9fa9459Szrj SHF_COMPRESSED = 0x800, 435*a9fa9459Szrj SHF_MASKOS = 0x0ff00000, 436*a9fa9459Szrj SHF_MASKPROC = 0xf0000000, 437*a9fa9459Szrj 438*a9fa9459Szrj // Indicates this section requires ordering in relation to 439*a9fa9459Szrj // other sections of the same type. Ordered sections are 440*a9fa9459Szrj // combined within the section pointed to by the sh_link entry. 441*a9fa9459Szrj // The sh_info values SHN_BEFORE and SHN_AFTER imply that the 442*a9fa9459Szrj // sorted section is to precede or follow, respectively, all 443*a9fa9459Szrj // other sections in the set being ordered. 444*a9fa9459Szrj SHF_ORDERED = 0x40000000, 445*a9fa9459Szrj // This section is excluded from input to the link-edit of an 446*a9fa9459Szrj // executable or shared object. This flag is ignored if SHF_ALLOC 447*a9fa9459Szrj // is also set, or if relocations exist against the section. 448*a9fa9459Szrj SHF_EXCLUDE = 0x80000000, 449*a9fa9459Szrj 450*a9fa9459Szrj // Section with data that is GP relative addressable. 451*a9fa9459Szrj SHF_MIPS_GPREL = 0x10000000, 452*a9fa9459Szrj 453*a9fa9459Szrj // x86_64 specific large section. 454*a9fa9459Szrj SHF_X86_64_LARGE = 0x10000000 455*a9fa9459Szrj }; 456*a9fa9459Szrj 457*a9fa9459Szrj // Values which appear in the first Elf_WXword of the section data 458*a9fa9459Szrj // of a SHF_COMPRESSED section. 459*a9fa9459Szrj enum 460*a9fa9459Szrj { 461*a9fa9459Szrj ELFCOMPRESS_ZLIB = 1, 462*a9fa9459Szrj ELFCOMPRESS_LOOS = 0x60000000, 463*a9fa9459Szrj ELFCOMPRESS_HIOS = 0x6fffffff, 464*a9fa9459Szrj ELFCOMPRESS_LOPROC = 0x70000000, 465*a9fa9459Szrj ELFCOMPRESS_HIPROC = 0x7fffffff, 466*a9fa9459Szrj }; 467*a9fa9459Szrj 468*a9fa9459Szrj // Bit flags which appear in the first 32-bit word of the section data 469*a9fa9459Szrj // of a SHT_GROUP section. 470*a9fa9459Szrj 471*a9fa9459Szrj enum 472*a9fa9459Szrj { 473*a9fa9459Szrj GRP_COMDAT = 0x1, 474*a9fa9459Szrj GRP_MASKOS = 0x0ff00000, 475*a9fa9459Szrj GRP_MASKPROC = 0xf0000000 476*a9fa9459Szrj }; 477*a9fa9459Szrj 478*a9fa9459Szrj // The valid values found in the Phdr p_type field. 479*a9fa9459Szrj 480*a9fa9459Szrj enum PT 481*a9fa9459Szrj { 482*a9fa9459Szrj PT_NULL = 0, 483*a9fa9459Szrj PT_LOAD = 1, 484*a9fa9459Szrj PT_DYNAMIC = 2, 485*a9fa9459Szrj PT_INTERP = 3, 486*a9fa9459Szrj PT_NOTE = 4, 487*a9fa9459Szrj PT_SHLIB = 5, 488*a9fa9459Szrj PT_PHDR = 6, 489*a9fa9459Szrj PT_TLS = 7, 490*a9fa9459Szrj PT_LOOS = 0x60000000, 491*a9fa9459Szrj PT_HIOS = 0x6fffffff, 492*a9fa9459Szrj PT_LOPROC = 0x70000000, 493*a9fa9459Szrj PT_HIPROC = 0x7fffffff, 494*a9fa9459Szrj // The remaining values are not in the standard. 495*a9fa9459Szrj // Frame unwind information. 496*a9fa9459Szrj PT_GNU_EH_FRAME = 0x6474e550, 497*a9fa9459Szrj PT_SUNW_EH_FRAME = 0x6474e550, 498*a9fa9459Szrj // Stack flags. 499*a9fa9459Szrj PT_GNU_STACK = 0x6474e551, 500*a9fa9459Szrj // Read only after relocation. 501*a9fa9459Szrj PT_GNU_RELRO = 0x6474e552, 502*a9fa9459Szrj // Platform architecture compatibility information 503*a9fa9459Szrj PT_ARM_ARCHEXT = 0x70000000, 504*a9fa9459Szrj // Exception unwind tables 505*a9fa9459Szrj PT_ARM_EXIDX = 0x70000001, 506*a9fa9459Szrj // Register usage information. Identifies one .reginfo section. 507*a9fa9459Szrj PT_MIPS_REGINFO =0x70000000, 508*a9fa9459Szrj // Runtime procedure table. 509*a9fa9459Szrj PT_MIPS_RTPROC = 0x70000001, 510*a9fa9459Szrj // .MIPS.options section. 511*a9fa9459Szrj PT_MIPS_OPTIONS = 0x70000002, 512*a9fa9459Szrj // .MIPS.abiflags section. 513*a9fa9459Szrj PT_MIPS_ABIFLAGS = 0x70000003, 514*a9fa9459Szrj // Platform architecture compatibility information 515*a9fa9459Szrj PT_AARCH64_ARCHEXT = 0x70000000, 516*a9fa9459Szrj // Exception unwind tables 517*a9fa9459Szrj PT_AARCH64_UNWIND = 0x70000001 518*a9fa9459Szrj }; 519*a9fa9459Szrj 520*a9fa9459Szrj // The valid bit flags found in the Phdr p_flags field. 521*a9fa9459Szrj 522*a9fa9459Szrj enum PF 523*a9fa9459Szrj { 524*a9fa9459Szrj PF_X = 0x1, 525*a9fa9459Szrj PF_W = 0x2, 526*a9fa9459Szrj PF_R = 0x4, 527*a9fa9459Szrj PF_MASKOS = 0x0ff00000, 528*a9fa9459Szrj PF_MASKPROC = 0xf0000000 529*a9fa9459Szrj }; 530*a9fa9459Szrj 531*a9fa9459Szrj // Symbol binding from Sym st_info field. 532*a9fa9459Szrj 533*a9fa9459Szrj enum STB 534*a9fa9459Szrj { 535*a9fa9459Szrj STB_LOCAL = 0, 536*a9fa9459Szrj STB_GLOBAL = 1, 537*a9fa9459Szrj STB_WEAK = 2, 538*a9fa9459Szrj STB_LOOS = 10, 539*a9fa9459Szrj STB_GNU_UNIQUE = 10, 540*a9fa9459Szrj STB_HIOS = 12, 541*a9fa9459Szrj STB_LOPROC = 13, 542*a9fa9459Szrj STB_HIPROC = 15 543*a9fa9459Szrj }; 544*a9fa9459Szrj 545*a9fa9459Szrj // Symbol types from Sym st_info field. 546*a9fa9459Szrj 547*a9fa9459Szrj enum STT 548*a9fa9459Szrj { 549*a9fa9459Szrj STT_NOTYPE = 0, 550*a9fa9459Szrj STT_OBJECT = 1, 551*a9fa9459Szrj STT_FUNC = 2, 552*a9fa9459Szrj STT_SECTION = 3, 553*a9fa9459Szrj STT_FILE = 4, 554*a9fa9459Szrj STT_COMMON = 5, 555*a9fa9459Szrj STT_TLS = 6, 556*a9fa9459Szrj 557*a9fa9459Szrj // GNU extension: symbol value points to a function which is called 558*a9fa9459Szrj // at runtime to determine the final value of the symbol. 559*a9fa9459Szrj STT_GNU_IFUNC = 10, 560*a9fa9459Szrj 561*a9fa9459Szrj STT_LOOS = 10, 562*a9fa9459Szrj STT_HIOS = 12, 563*a9fa9459Szrj STT_LOPROC = 13, 564*a9fa9459Szrj STT_HIPROC = 15, 565*a9fa9459Szrj 566*a9fa9459Szrj // The section type that must be used for register symbols on 567*a9fa9459Szrj // Sparc. These symbols initialize a global register. 568*a9fa9459Szrj STT_SPARC_REGISTER = 13, 569*a9fa9459Szrj 570*a9fa9459Szrj // ARM: a THUMB function. This is not defined in ARM ELF Specification but 571*a9fa9459Szrj // used by the GNU tool-chain. 572*a9fa9459Szrj STT_ARM_TFUNC = 13 573*a9fa9459Szrj }; 574*a9fa9459Szrj 575*a9fa9459Szrj inline STB 576*a9fa9459Szrj elf_st_bind(unsigned char info) 577*a9fa9459Szrj { 578*a9fa9459Szrj return static_cast<STB>(info >> 4); 579*a9fa9459Szrj } 580*a9fa9459Szrj 581*a9fa9459Szrj inline STT 582*a9fa9459Szrj elf_st_type(unsigned char info) 583*a9fa9459Szrj { 584*a9fa9459Szrj return static_cast<STT>(info & 0xf); 585*a9fa9459Szrj } 586*a9fa9459Szrj 587*a9fa9459Szrj inline unsigned char 588*a9fa9459Szrj elf_st_info(STB bind, STT type) 589*a9fa9459Szrj { 590*a9fa9459Szrj return ((static_cast<unsigned char>(bind) << 4) 591*a9fa9459Szrj + (static_cast<unsigned char>(type) & 0xf)); 592*a9fa9459Szrj } 593*a9fa9459Szrj 594*a9fa9459Szrj // Symbol visibility from Sym st_other field. 595*a9fa9459Szrj 596*a9fa9459Szrj enum STV 597*a9fa9459Szrj { 598*a9fa9459Szrj STV_DEFAULT = 0, 599*a9fa9459Szrj STV_INTERNAL = 1, 600*a9fa9459Szrj STV_HIDDEN = 2, 601*a9fa9459Szrj STV_PROTECTED = 3 602*a9fa9459Szrj }; 603*a9fa9459Szrj 604*a9fa9459Szrj inline STV 605*a9fa9459Szrj elf_st_visibility(unsigned char other) 606*a9fa9459Szrj { 607*a9fa9459Szrj return static_cast<STV>(other & 0x3); 608*a9fa9459Szrj } 609*a9fa9459Szrj 610*a9fa9459Szrj inline unsigned char 611*a9fa9459Szrj elf_st_nonvis(unsigned char other) 612*a9fa9459Szrj { 613*a9fa9459Szrj return static_cast<STV>(other >> 2); 614*a9fa9459Szrj } 615*a9fa9459Szrj 616*a9fa9459Szrj inline unsigned char 617*a9fa9459Szrj elf_st_other(STV vis, unsigned char nonvis) 618*a9fa9459Szrj { 619*a9fa9459Szrj return ((nonvis << 2) 620*a9fa9459Szrj + (static_cast<unsigned char>(vis) & 3)); 621*a9fa9459Szrj } 622*a9fa9459Szrj 623*a9fa9459Szrj // Reloc information from Rel/Rela r_info field. 624*a9fa9459Szrj 625*a9fa9459Szrj template<int size> 626*a9fa9459Szrj unsigned int 627*a9fa9459Szrj elf_r_sym(typename Elf_types<size>::Elf_WXword); 628*a9fa9459Szrj 629*a9fa9459Szrj template<> 630*a9fa9459Szrj inline unsigned int 631*a9fa9459Szrj elf_r_sym<32>(Elf_Word v) 632*a9fa9459Szrj { 633*a9fa9459Szrj return v >> 8; 634*a9fa9459Szrj } 635*a9fa9459Szrj 636*a9fa9459Szrj template<> 637*a9fa9459Szrj inline unsigned int 638*a9fa9459Szrj elf_r_sym<64>(Elf_Xword v) 639*a9fa9459Szrj { 640*a9fa9459Szrj return v >> 32; 641*a9fa9459Szrj } 642*a9fa9459Szrj 643*a9fa9459Szrj template<int size> 644*a9fa9459Szrj unsigned int 645*a9fa9459Szrj elf_r_type(typename Elf_types<size>::Elf_WXword); 646*a9fa9459Szrj 647*a9fa9459Szrj template<> 648*a9fa9459Szrj inline unsigned int 649*a9fa9459Szrj elf_r_type<32>(Elf_Word v) 650*a9fa9459Szrj { 651*a9fa9459Szrj return v & 0xff; 652*a9fa9459Szrj } 653*a9fa9459Szrj 654*a9fa9459Szrj template<> 655*a9fa9459Szrj inline unsigned int 656*a9fa9459Szrj elf_r_type<64>(Elf_Xword v) 657*a9fa9459Szrj { 658*a9fa9459Szrj return v & 0xffffffff; 659*a9fa9459Szrj } 660*a9fa9459Szrj 661*a9fa9459Szrj template<int size> 662*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 663*a9fa9459Szrj elf_r_info(unsigned int s, unsigned int t); 664*a9fa9459Szrj 665*a9fa9459Szrj template<> 666*a9fa9459Szrj inline Elf_Word 667*a9fa9459Szrj elf_r_info<32>(unsigned int s, unsigned int t) 668*a9fa9459Szrj { 669*a9fa9459Szrj return (s << 8) + (t & 0xff); 670*a9fa9459Szrj } 671*a9fa9459Szrj 672*a9fa9459Szrj template<> 673*a9fa9459Szrj inline Elf_Xword 674*a9fa9459Szrj elf_r_info<64>(unsigned int s, unsigned int t) 675*a9fa9459Szrj { 676*a9fa9459Szrj return (static_cast<Elf_Xword>(s) << 32) + (t & 0xffffffff); 677*a9fa9459Szrj } 678*a9fa9459Szrj 679*a9fa9459Szrj // Dynamic tags found in the PT_DYNAMIC segment. 680*a9fa9459Szrj 681*a9fa9459Szrj enum DT 682*a9fa9459Szrj { 683*a9fa9459Szrj DT_NULL = 0, 684*a9fa9459Szrj DT_NEEDED = 1, 685*a9fa9459Szrj DT_PLTRELSZ = 2, 686*a9fa9459Szrj DT_PLTGOT = 3, 687*a9fa9459Szrj DT_HASH = 4, 688*a9fa9459Szrj DT_STRTAB = 5, 689*a9fa9459Szrj DT_SYMTAB = 6, 690*a9fa9459Szrj DT_RELA = 7, 691*a9fa9459Szrj DT_RELASZ = 8, 692*a9fa9459Szrj DT_RELAENT = 9, 693*a9fa9459Szrj DT_STRSZ = 10, 694*a9fa9459Szrj DT_SYMENT = 11, 695*a9fa9459Szrj DT_INIT = 12, 696*a9fa9459Szrj DT_FINI = 13, 697*a9fa9459Szrj DT_SONAME = 14, 698*a9fa9459Szrj DT_RPATH = 15, 699*a9fa9459Szrj DT_SYMBOLIC = 16, 700*a9fa9459Szrj DT_REL = 17, 701*a9fa9459Szrj DT_RELSZ = 18, 702*a9fa9459Szrj DT_RELENT = 19, 703*a9fa9459Szrj DT_PLTREL = 20, 704*a9fa9459Szrj DT_DEBUG = 21, 705*a9fa9459Szrj DT_TEXTREL = 22, 706*a9fa9459Szrj DT_JMPREL = 23, 707*a9fa9459Szrj DT_BIND_NOW = 24, 708*a9fa9459Szrj DT_INIT_ARRAY = 25, 709*a9fa9459Szrj DT_FINI_ARRAY = 26, 710*a9fa9459Szrj DT_INIT_ARRAYSZ = 27, 711*a9fa9459Szrj DT_FINI_ARRAYSZ = 28, 712*a9fa9459Szrj DT_RUNPATH = 29, 713*a9fa9459Szrj DT_FLAGS = 30, 714*a9fa9459Szrj 715*a9fa9459Szrj // This is used to mark a range of dynamic tags. It is not really 716*a9fa9459Szrj // a tag value. 717*a9fa9459Szrj DT_ENCODING = 32, 718*a9fa9459Szrj 719*a9fa9459Szrj DT_PREINIT_ARRAY = 32, 720*a9fa9459Szrj DT_PREINIT_ARRAYSZ = 33, 721*a9fa9459Szrj DT_LOOS = 0x6000000d, 722*a9fa9459Szrj DT_HIOS = 0x6ffff000, 723*a9fa9459Szrj DT_LOPROC = 0x70000000, 724*a9fa9459Szrj DT_HIPROC = 0x7fffffff, 725*a9fa9459Szrj 726*a9fa9459Szrj // The remaining values are extensions used by GNU or Solaris. 727*a9fa9459Szrj DT_VALRNGLO = 0x6ffffd00, 728*a9fa9459Szrj DT_GNU_PRELINKED = 0x6ffffdf5, 729*a9fa9459Szrj DT_GNU_CONFLICTSZ = 0x6ffffdf6, 730*a9fa9459Szrj DT_GNU_LIBLISTSZ = 0x6ffffdf7, 731*a9fa9459Szrj DT_CHECKSUM = 0x6ffffdf8, 732*a9fa9459Szrj DT_PLTPADSZ = 0x6ffffdf9, 733*a9fa9459Szrj DT_MOVEENT = 0x6ffffdfa, 734*a9fa9459Szrj DT_MOVESZ = 0x6ffffdfb, 735*a9fa9459Szrj DT_FEATURE = 0x6ffffdfc, 736*a9fa9459Szrj DT_POSFLAG_1 = 0x6ffffdfd, 737*a9fa9459Szrj DT_SYMINSZ = 0x6ffffdfe, 738*a9fa9459Szrj DT_SYMINENT = 0x6ffffdff, 739*a9fa9459Szrj DT_VALRNGHI = 0x6ffffdff, 740*a9fa9459Szrj 741*a9fa9459Szrj DT_ADDRRNGLO = 0x6ffffe00, 742*a9fa9459Szrj DT_GNU_HASH = 0x6ffffef5, 743*a9fa9459Szrj DT_TLSDESC_PLT = 0x6ffffef6, 744*a9fa9459Szrj DT_TLSDESC_GOT = 0x6ffffef7, 745*a9fa9459Szrj DT_GNU_CONFLICT = 0x6ffffef8, 746*a9fa9459Szrj DT_GNU_LIBLIST = 0x6ffffef9, 747*a9fa9459Szrj DT_CONFIG = 0x6ffffefa, 748*a9fa9459Szrj DT_DEPAUDIT = 0x6ffffefb, 749*a9fa9459Szrj DT_AUDIT = 0x6ffffefc, 750*a9fa9459Szrj DT_PLTPAD = 0x6ffffefd, 751*a9fa9459Szrj DT_MOVETAB = 0x6ffffefe, 752*a9fa9459Szrj DT_SYMINFO = 0x6ffffeff, 753*a9fa9459Szrj DT_ADDRRNGHI = 0x6ffffeff, 754*a9fa9459Szrj 755*a9fa9459Szrj DT_RELACOUNT = 0x6ffffff9, 756*a9fa9459Szrj DT_RELCOUNT = 0x6ffffffa, 757*a9fa9459Szrj DT_FLAGS_1 = 0x6ffffffb, 758*a9fa9459Szrj DT_VERDEF = 0x6ffffffc, 759*a9fa9459Szrj DT_VERDEFNUM = 0x6ffffffd, 760*a9fa9459Szrj DT_VERNEED = 0x6ffffffe, 761*a9fa9459Szrj DT_VERNEEDNUM = 0x6fffffff, 762*a9fa9459Szrj 763*a9fa9459Szrj DT_VERSYM = 0x6ffffff0, 764*a9fa9459Szrj 765*a9fa9459Szrj // Specify the value of _GLOBAL_OFFSET_TABLE_. 766*a9fa9459Szrj DT_PPC_GOT = 0x70000000, 767*a9fa9459Szrj 768*a9fa9459Szrj // Specify the start of the .glink section. 769*a9fa9459Szrj DT_PPC64_GLINK = 0x70000000, 770*a9fa9459Szrj 771*a9fa9459Szrj // Specify the start and size of the .opd section. 772*a9fa9459Szrj DT_PPC64_OPD = 0x70000001, 773*a9fa9459Szrj DT_PPC64_OPDSZ = 0x70000002, 774*a9fa9459Szrj 775*a9fa9459Szrj // The index of an STT_SPARC_REGISTER symbol within the DT_SYMTAB 776*a9fa9459Szrj // symbol table. One dynamic entry exists for every STT_SPARC_REGISTER 777*a9fa9459Szrj // symbol in the symbol table. 778*a9fa9459Szrj DT_SPARC_REGISTER = 0x70000001, 779*a9fa9459Szrj 780*a9fa9459Szrj // MIPS specific dynamic array tags. 781*a9fa9459Szrj // 32 bit version number for runtime linker interface. 782*a9fa9459Szrj DT_MIPS_RLD_VERSION = 0x70000001, 783*a9fa9459Szrj // Time stamp. 784*a9fa9459Szrj DT_MIPS_TIME_STAMP = 0x70000002, 785*a9fa9459Szrj // Checksum of external strings and common sizes. 786*a9fa9459Szrj DT_MIPS_ICHECKSUM = 0x70000003, 787*a9fa9459Szrj // Index of version string in string table. 788*a9fa9459Szrj DT_MIPS_IVERSION = 0x70000004, 789*a9fa9459Szrj // 32 bits of flags. 790*a9fa9459Szrj DT_MIPS_FLAGS = 0x70000005, 791*a9fa9459Szrj // Base address of the segment. 792*a9fa9459Szrj DT_MIPS_BASE_ADDRESS = 0x70000006, 793*a9fa9459Szrj // ??? 794*a9fa9459Szrj DT_MIPS_MSYM = 0x70000007, 795*a9fa9459Szrj // Address of .conflict section. 796*a9fa9459Szrj DT_MIPS_CONFLICT = 0x70000008, 797*a9fa9459Szrj // Address of .liblist section. 798*a9fa9459Szrj DT_MIPS_LIBLIST = 0x70000009, 799*a9fa9459Szrj // Number of local global offset table entries. 800*a9fa9459Szrj DT_MIPS_LOCAL_GOTNO = 0x7000000a, 801*a9fa9459Szrj // Number of entries in the .conflict section. 802*a9fa9459Szrj DT_MIPS_CONFLICTNO = 0x7000000b, 803*a9fa9459Szrj // Number of entries in the .liblist section. 804*a9fa9459Szrj DT_MIPS_LIBLISTNO = 0x70000010, 805*a9fa9459Szrj // Number of entries in the .dynsym section. 806*a9fa9459Szrj DT_MIPS_SYMTABNO = 0x70000011, 807*a9fa9459Szrj // Index of first external dynamic symbol not referenced locally. 808*a9fa9459Szrj DT_MIPS_UNREFEXTNO = 0x70000012, 809*a9fa9459Szrj // Index of first dynamic symbol in global offset table. 810*a9fa9459Szrj DT_MIPS_GOTSYM = 0x70000013, 811*a9fa9459Szrj // Number of page table entries in global offset table. 812*a9fa9459Szrj DT_MIPS_HIPAGENO = 0x70000014, 813*a9fa9459Szrj // Address of run time loader map, used for debugging. 814*a9fa9459Szrj DT_MIPS_RLD_MAP = 0x70000016, 815*a9fa9459Szrj // Delta C++ class definition. 816*a9fa9459Szrj DT_MIPS_DELTA_CLASS = 0x70000017, 817*a9fa9459Szrj // Number of entries in DT_MIPS_DELTA_CLASS. 818*a9fa9459Szrj DT_MIPS_DELTA_CLASS_NO = 0x70000018, 819*a9fa9459Szrj // Delta C++ class instances. 820*a9fa9459Szrj DT_MIPS_DELTA_INSTANCE = 0x70000019, 821*a9fa9459Szrj // Number of entries in DT_MIPS_DELTA_INSTANCE. 822*a9fa9459Szrj DT_MIPS_DELTA_INSTANCE_NO = 0x7000001a, 823*a9fa9459Szrj // Delta relocations. 824*a9fa9459Szrj DT_MIPS_DELTA_RELOC = 0x7000001b, 825*a9fa9459Szrj // Number of entries in DT_MIPS_DELTA_RELOC. 826*a9fa9459Szrj DT_MIPS_DELTA_RELOC_NO = 0x7000001c, 827*a9fa9459Szrj // Delta symbols that Delta relocations refer to. 828*a9fa9459Szrj DT_MIPS_DELTA_SYM = 0x7000001d, 829*a9fa9459Szrj // Number of entries in DT_MIPS_DELTA_SYM. 830*a9fa9459Szrj DT_MIPS_DELTA_SYM_NO = 0x7000001e, 831*a9fa9459Szrj // Delta symbols that hold class declarations. 832*a9fa9459Szrj DT_MIPS_DELTA_CLASSSYM = 0x70000020, 833*a9fa9459Szrj // Number of entries in DT_MIPS_DELTA_CLASSSYM. 834*a9fa9459Szrj DT_MIPS_DELTA_CLASSSYM_NO = 0x70000021, 835*a9fa9459Szrj // Flags indicating information about C++ flavor. 836*a9fa9459Szrj DT_MIPS_CXX_FLAGS = 0x70000022, 837*a9fa9459Szrj // Pixie information (???). 838*a9fa9459Szrj DT_MIPS_PIXIE_INIT = 0x70000023, 839*a9fa9459Szrj // Address of .MIPS.symlib 840*a9fa9459Szrj DT_MIPS_SYMBOL_LIB = 0x70000024, 841*a9fa9459Szrj // The GOT index of the first PTE for a segment 842*a9fa9459Szrj DT_MIPS_LOCALPAGE_GOTIDX = 0x70000025, 843*a9fa9459Szrj // The GOT index of the first PTE for a local symbol 844*a9fa9459Szrj DT_MIPS_LOCAL_GOTIDX = 0x70000026, 845*a9fa9459Szrj // The GOT index of the first PTE for a hidden symbol 846*a9fa9459Szrj DT_MIPS_HIDDEN_GOTIDX = 0x70000027, 847*a9fa9459Szrj // The GOT index of the first PTE for a protected symbol 848*a9fa9459Szrj DT_MIPS_PROTECTED_GOTIDX = 0x70000028, 849*a9fa9459Szrj // Address of `.MIPS.options'. 850*a9fa9459Szrj DT_MIPS_OPTIONS = 0x70000029, 851*a9fa9459Szrj // Address of `.interface'. 852*a9fa9459Szrj DT_MIPS_INTERFACE = 0x7000002a, 853*a9fa9459Szrj // ??? 854*a9fa9459Szrj DT_MIPS_DYNSTR_ALIGN = 0x7000002b, 855*a9fa9459Szrj // Size of the .interface section. 856*a9fa9459Szrj DT_MIPS_INTERFACE_SIZE = 0x7000002c, 857*a9fa9459Szrj // Size of rld_text_resolve function stored in the GOT. 858*a9fa9459Szrj DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d, 859*a9fa9459Szrj // Default suffix of DSO to be added by rld on dlopen() calls. 860*a9fa9459Szrj DT_MIPS_PERF_SUFFIX = 0x7000002e, 861*a9fa9459Szrj // Size of compact relocation section (O32). 862*a9fa9459Szrj DT_MIPS_COMPACT_SIZE = 0x7000002f, 863*a9fa9459Szrj // GP value for auxiliary GOTs. 864*a9fa9459Szrj DT_MIPS_GP_VALUE = 0x70000030, 865*a9fa9459Szrj // Address of auxiliary .dynamic. 866*a9fa9459Szrj DT_MIPS_AUX_DYNAMIC = 0x70000031, 867*a9fa9459Szrj // Address of the base of the PLTGOT. 868*a9fa9459Szrj DT_MIPS_PLTGOT = 0x70000032, 869*a9fa9459Szrj // Points to the base of a writable PLT. 870*a9fa9459Szrj DT_MIPS_RWPLT = 0x70000034, 871*a9fa9459Szrj // Relative offset of run time loader map, used for debugging. 872*a9fa9459Szrj DT_MIPS_RLD_MAP_REL = 0x70000035, 873*a9fa9459Szrj 874*a9fa9459Szrj DT_AUXILIARY = 0x7ffffffd, 875*a9fa9459Szrj DT_USED = 0x7ffffffe, 876*a9fa9459Szrj DT_FILTER = 0x7fffffff 877*a9fa9459Szrj }; 878*a9fa9459Szrj 879*a9fa9459Szrj // Flags found in the DT_FLAGS dynamic element. 880*a9fa9459Szrj 881*a9fa9459Szrj enum DF 882*a9fa9459Szrj { 883*a9fa9459Szrj DF_ORIGIN = 0x1, 884*a9fa9459Szrj DF_SYMBOLIC = 0x2, 885*a9fa9459Szrj DF_TEXTREL = 0x4, 886*a9fa9459Szrj DF_BIND_NOW = 0x8, 887*a9fa9459Szrj DF_STATIC_TLS = 0x10 888*a9fa9459Szrj }; 889*a9fa9459Szrj 890*a9fa9459Szrj // Flags found in the DT_FLAGS_1 dynamic element. 891*a9fa9459Szrj 892*a9fa9459Szrj enum DF_1 893*a9fa9459Szrj { 894*a9fa9459Szrj DF_1_NOW = 0x1, 895*a9fa9459Szrj DF_1_GLOBAL = 0x2, 896*a9fa9459Szrj DF_1_GROUP = 0x4, 897*a9fa9459Szrj DF_1_NODELETE = 0x8, 898*a9fa9459Szrj DF_1_LOADFLTR = 0x10, 899*a9fa9459Szrj DF_1_INITFIRST = 0x20, 900*a9fa9459Szrj DF_1_NOOPEN = 0x40, 901*a9fa9459Szrj DF_1_ORIGIN = 0x80, 902*a9fa9459Szrj DF_1_DIRECT = 0x100, 903*a9fa9459Szrj DF_1_TRANS = 0x200, 904*a9fa9459Szrj DF_1_INTERPOSE = 0x400, 905*a9fa9459Szrj DF_1_NODEFLIB = 0x800, 906*a9fa9459Szrj DF_1_NODUMP = 0x1000, 907*a9fa9459Szrj DF_1_CONLFAT = 0x2000 908*a9fa9459Szrj }; 909*a9fa9459Szrj 910*a9fa9459Szrj // Version numbers which appear in the vd_version field of a Verdef 911*a9fa9459Szrj // structure. 912*a9fa9459Szrj 913*a9fa9459Szrj const int VER_DEF_NONE = 0; 914*a9fa9459Szrj const int VER_DEF_CURRENT = 1; 915*a9fa9459Szrj 916*a9fa9459Szrj // Version numbers which appear in the vn_version field of a Verneed 917*a9fa9459Szrj // structure. 918*a9fa9459Szrj 919*a9fa9459Szrj const int VER_NEED_NONE = 0; 920*a9fa9459Szrj const int VER_NEED_CURRENT = 1; 921*a9fa9459Szrj 922*a9fa9459Szrj // Bit flags which appear in vd_flags of Verdef and vna_flags of 923*a9fa9459Szrj // Vernaux. 924*a9fa9459Szrj 925*a9fa9459Szrj const int VER_FLG_BASE = 0x1; 926*a9fa9459Szrj const int VER_FLG_WEAK = 0x2; 927*a9fa9459Szrj const int VER_FLG_INFO = 0x4; 928*a9fa9459Szrj 929*a9fa9459Szrj // Special constants found in the SHT_GNU_versym entries. 930*a9fa9459Szrj 931*a9fa9459Szrj const int VER_NDX_LOCAL = 0; 932*a9fa9459Szrj const int VER_NDX_GLOBAL = 1; 933*a9fa9459Szrj 934*a9fa9459Szrj // A SHT_GNU_versym section holds 16-bit words. This bit is set if 935*a9fa9459Szrj // the symbol is hidden and can only be seen when referenced using an 936*a9fa9459Szrj // explicit version number. This is a GNU extension. 937*a9fa9459Szrj 938*a9fa9459Szrj const int VERSYM_HIDDEN = 0x8000; 939*a9fa9459Szrj 940*a9fa9459Szrj // This is the mask for the rest of the data in a word read from a 941*a9fa9459Szrj // SHT_GNU_versym section. 942*a9fa9459Szrj 943*a9fa9459Szrj const int VERSYM_VERSION = 0x7fff; 944*a9fa9459Szrj 945*a9fa9459Szrj // Note descriptor type codes for notes in a non-core file with an 946*a9fa9459Szrj // empty name. 947*a9fa9459Szrj 948*a9fa9459Szrj enum 949*a9fa9459Szrj { 950*a9fa9459Szrj // A version string. 951*a9fa9459Szrj NT_VERSION = 1, 952*a9fa9459Szrj // An architecture string. 953*a9fa9459Szrj NT_ARCH = 2 954*a9fa9459Szrj }; 955*a9fa9459Szrj 956*a9fa9459Szrj // Note descriptor type codes for notes in a non-core file with the 957*a9fa9459Szrj // name "GNU". 958*a9fa9459Szrj 959*a9fa9459Szrj enum 960*a9fa9459Szrj { 961*a9fa9459Szrj // The minimum ABI level. This is used by the dynamic linker to 962*a9fa9459Szrj // describe the minimal kernel version on which a shared library may 963*a9fa9459Szrj // be used. Th value should be four words. Word 0 is an OS 964*a9fa9459Szrj // descriptor (see below). Word 1 is the major version of the ABI. 965*a9fa9459Szrj // Word 2 is the minor version. Word 3 is the subminor version. 966*a9fa9459Szrj NT_GNU_ABI_TAG = 1, 967*a9fa9459Szrj // Hardware capabilities information. Word 0 is the number of 968*a9fa9459Szrj // entries. Word 1 is a bitmask of enabled entries. The rest of 969*a9fa9459Szrj // the descriptor is a series of entries, where each entry is a 970*a9fa9459Szrj // single byte followed by a nul terminated string. The byte gives 971*a9fa9459Szrj // the bit number to test if enabled in the bitmask. 972*a9fa9459Szrj NT_GNU_HWCAP = 2, 973*a9fa9459Szrj // The build ID as set by the linker's --build-id option. The 974*a9fa9459Szrj // format of the descriptor depends on the build ID style. 975*a9fa9459Szrj NT_GNU_BUILD_ID = 3, 976*a9fa9459Szrj // The version of gold used to link. Th descriptor is just a 977*a9fa9459Szrj // string. 978*a9fa9459Szrj NT_GNU_GOLD_VERSION = 4 979*a9fa9459Szrj }; 980*a9fa9459Szrj 981*a9fa9459Szrj // The OS values which may appear in word 0 of a NT_GNU_ABI_TAG note. 982*a9fa9459Szrj 983*a9fa9459Szrj enum 984*a9fa9459Szrj { 985*a9fa9459Szrj ELF_NOTE_OS_LINUX = 0, 986*a9fa9459Szrj ELF_NOTE_OS_GNU = 1, 987*a9fa9459Szrj ELF_NOTE_OS_SOLARIS2 = 2, 988*a9fa9459Szrj ELF_NOTE_OS_FREEBSD = 3, 989*a9fa9459Szrj ELF_NOTE_OS_NETBSD = 4, 990*a9fa9459Szrj ELF_NOTE_OS_SYLLABLE = 5 991*a9fa9459Szrj }; 992*a9fa9459Szrj 993*a9fa9459Szrj } // End namespace elfcpp. 994*a9fa9459Szrj 995*a9fa9459Szrj // Include internal details after defining the types. 996*a9fa9459Szrj #include "elfcpp_internal.h" 997*a9fa9459Szrj 998*a9fa9459Szrj namespace elfcpp 999*a9fa9459Szrj { 1000*a9fa9459Szrj 1001*a9fa9459Szrj // The offset of the ELF file header in the ELF file. 1002*a9fa9459Szrj 1003*a9fa9459Szrj const int file_header_offset = 0; 1004*a9fa9459Szrj 1005*a9fa9459Szrj // ELF structure sizes. 1006*a9fa9459Szrj 1007*a9fa9459Szrj template<int size> 1008*a9fa9459Szrj struct Elf_sizes 1009*a9fa9459Szrj { 1010*a9fa9459Szrj // Size of ELF file header. 1011*a9fa9459Szrj static const int ehdr_size = sizeof(internal::Ehdr_data<size>); 1012*a9fa9459Szrj // Size of ELF segment header. 1013*a9fa9459Szrj static const int phdr_size = sizeof(internal::Phdr_data<size>); 1014*a9fa9459Szrj // Size of ELF section header. 1015*a9fa9459Szrj static const int shdr_size = sizeof(internal::Shdr_data<size>); 1016*a9fa9459Szrj // Size of ELF compression header. 1017*a9fa9459Szrj static const int chdr_size = sizeof(internal::Chdr_data<size>); 1018*a9fa9459Szrj // Size of ELF symbol table entry. 1019*a9fa9459Szrj static const int sym_size = sizeof(internal::Sym_data<size>); 1020*a9fa9459Szrj // Sizes of ELF reloc entries. 1021*a9fa9459Szrj static const int rel_size = sizeof(internal::Rel_data<size>); 1022*a9fa9459Szrj static const int rela_size = sizeof(internal::Rela_data<size>); 1023*a9fa9459Szrj // Size of ELF dynamic entry. 1024*a9fa9459Szrj static const int dyn_size = sizeof(internal::Dyn_data<size>); 1025*a9fa9459Szrj // Size of ELF version structures. 1026*a9fa9459Szrj static const int verdef_size = sizeof(internal::Verdef_data); 1027*a9fa9459Szrj static const int verdaux_size = sizeof(internal::Verdaux_data); 1028*a9fa9459Szrj static const int verneed_size = sizeof(internal::Verneed_data); 1029*a9fa9459Szrj static const int vernaux_size = sizeof(internal::Vernaux_data); 1030*a9fa9459Szrj }; 1031*a9fa9459Szrj 1032*a9fa9459Szrj // Accessor class for the ELF file header. 1033*a9fa9459Szrj 1034*a9fa9459Szrj template<int size, bool big_endian> 1035*a9fa9459Szrj class Ehdr 1036*a9fa9459Szrj { 1037*a9fa9459Szrj public: 1038*a9fa9459Szrj Ehdr(const unsigned char* p) 1039*a9fa9459Szrj : p_(reinterpret_cast<const internal::Ehdr_data<size>*>(p)) 1040*a9fa9459Szrj { } 1041*a9fa9459Szrj 1042*a9fa9459Szrj template<typename File> 1043*a9fa9459Szrj Ehdr(File* file, typename File::Location loc) 1044*a9fa9459Szrj : p_(reinterpret_cast<const internal::Ehdr_data<size>*>( 1045*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1046*a9fa9459Szrj { } 1047*a9fa9459Szrj 1048*a9fa9459Szrj const unsigned char* 1049*a9fa9459Szrj get_e_ident() const 1050*a9fa9459Szrj { return this->p_->e_ident; } 1051*a9fa9459Szrj 1052*a9fa9459Szrj Elf_Half 1053*a9fa9459Szrj get_e_type() const 1054*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_type); } 1055*a9fa9459Szrj 1056*a9fa9459Szrj Elf_Half 1057*a9fa9459Szrj get_e_machine() const 1058*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_machine); } 1059*a9fa9459Szrj 1060*a9fa9459Szrj Elf_Word 1061*a9fa9459Szrj get_e_version() const 1062*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->e_version); } 1063*a9fa9459Szrj 1064*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1065*a9fa9459Szrj get_e_entry() const 1066*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->e_entry); } 1067*a9fa9459Szrj 1068*a9fa9459Szrj typename Elf_types<size>::Elf_Off 1069*a9fa9459Szrj get_e_phoff() const 1070*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->e_phoff); } 1071*a9fa9459Szrj 1072*a9fa9459Szrj typename Elf_types<size>::Elf_Off 1073*a9fa9459Szrj get_e_shoff() const 1074*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->e_shoff); } 1075*a9fa9459Szrj 1076*a9fa9459Szrj Elf_Word 1077*a9fa9459Szrj get_e_flags() const 1078*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->e_flags); } 1079*a9fa9459Szrj 1080*a9fa9459Szrj Elf_Half 1081*a9fa9459Szrj get_e_ehsize() const 1082*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_ehsize); } 1083*a9fa9459Szrj 1084*a9fa9459Szrj Elf_Half 1085*a9fa9459Szrj get_e_phentsize() const 1086*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_phentsize); } 1087*a9fa9459Szrj 1088*a9fa9459Szrj Elf_Half 1089*a9fa9459Szrj get_e_phnum() const 1090*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_phnum); } 1091*a9fa9459Szrj 1092*a9fa9459Szrj Elf_Half 1093*a9fa9459Szrj get_e_shentsize() const 1094*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_shentsize); } 1095*a9fa9459Szrj 1096*a9fa9459Szrj Elf_Half 1097*a9fa9459Szrj get_e_shnum() const 1098*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_shnum); } 1099*a9fa9459Szrj 1100*a9fa9459Szrj Elf_Half 1101*a9fa9459Szrj get_e_shstrndx() const 1102*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->e_shstrndx); } 1103*a9fa9459Szrj 1104*a9fa9459Szrj private: 1105*a9fa9459Szrj const internal::Ehdr_data<size>* p_; 1106*a9fa9459Szrj }; 1107*a9fa9459Szrj 1108*a9fa9459Szrj // Write class for the ELF file header. 1109*a9fa9459Szrj 1110*a9fa9459Szrj template<int size, bool big_endian> 1111*a9fa9459Szrj class Ehdr_write 1112*a9fa9459Szrj { 1113*a9fa9459Szrj public: 1114*a9fa9459Szrj Ehdr_write(unsigned char* p) 1115*a9fa9459Szrj : p_(reinterpret_cast<internal::Ehdr_data<size>*>(p)) 1116*a9fa9459Szrj { } 1117*a9fa9459Szrj 1118*a9fa9459Szrj void 1119*a9fa9459Szrj put_e_ident(const unsigned char v[EI_NIDENT]) const 1120*a9fa9459Szrj { memcpy(this->p_->e_ident, v, EI_NIDENT); } 1121*a9fa9459Szrj 1122*a9fa9459Szrj void 1123*a9fa9459Szrj put_e_type(Elf_Half v) 1124*a9fa9459Szrj { this->p_->e_type = Convert<16, big_endian>::convert_host(v); } 1125*a9fa9459Szrj 1126*a9fa9459Szrj void 1127*a9fa9459Szrj put_e_machine(Elf_Half v) 1128*a9fa9459Szrj { this->p_->e_machine = Convert<16, big_endian>::convert_host(v); } 1129*a9fa9459Szrj 1130*a9fa9459Szrj void 1131*a9fa9459Szrj put_e_version(Elf_Word v) 1132*a9fa9459Szrj { this->p_->e_version = Convert<32, big_endian>::convert_host(v); } 1133*a9fa9459Szrj 1134*a9fa9459Szrj void 1135*a9fa9459Szrj put_e_entry(typename Elf_types<size>::Elf_Addr v) 1136*a9fa9459Szrj { this->p_->e_entry = Convert<size, big_endian>::convert_host(v); } 1137*a9fa9459Szrj 1138*a9fa9459Szrj void 1139*a9fa9459Szrj put_e_phoff(typename Elf_types<size>::Elf_Off v) 1140*a9fa9459Szrj { this->p_->e_phoff = Convert<size, big_endian>::convert_host(v); } 1141*a9fa9459Szrj 1142*a9fa9459Szrj void 1143*a9fa9459Szrj put_e_shoff(typename Elf_types<size>::Elf_Off v) 1144*a9fa9459Szrj { this->p_->e_shoff = Convert<size, big_endian>::convert_host(v); } 1145*a9fa9459Szrj 1146*a9fa9459Szrj void 1147*a9fa9459Szrj put_e_flags(Elf_Word v) 1148*a9fa9459Szrj { this->p_->e_flags = Convert<32, big_endian>::convert_host(v); } 1149*a9fa9459Szrj 1150*a9fa9459Szrj void 1151*a9fa9459Szrj put_e_ehsize(Elf_Half v) 1152*a9fa9459Szrj { this->p_->e_ehsize = Convert<16, big_endian>::convert_host(v); } 1153*a9fa9459Szrj 1154*a9fa9459Szrj void 1155*a9fa9459Szrj put_e_phentsize(Elf_Half v) 1156*a9fa9459Szrj { this->p_->e_phentsize = Convert<16, big_endian>::convert_host(v); } 1157*a9fa9459Szrj 1158*a9fa9459Szrj void 1159*a9fa9459Szrj put_e_phnum(Elf_Half v) 1160*a9fa9459Szrj { this->p_->e_phnum = Convert<16, big_endian>::convert_host(v); } 1161*a9fa9459Szrj 1162*a9fa9459Szrj void 1163*a9fa9459Szrj put_e_shentsize(Elf_Half v) 1164*a9fa9459Szrj { this->p_->e_shentsize = Convert<16, big_endian>::convert_host(v); } 1165*a9fa9459Szrj 1166*a9fa9459Szrj void 1167*a9fa9459Szrj put_e_shnum(Elf_Half v) 1168*a9fa9459Szrj { this->p_->e_shnum = Convert<16, big_endian>::convert_host(v); } 1169*a9fa9459Szrj 1170*a9fa9459Szrj void 1171*a9fa9459Szrj put_e_shstrndx(Elf_Half v) 1172*a9fa9459Szrj { this->p_->e_shstrndx = Convert<16, big_endian>::convert_host(v); } 1173*a9fa9459Szrj 1174*a9fa9459Szrj private: 1175*a9fa9459Szrj internal::Ehdr_data<size>* p_; 1176*a9fa9459Szrj }; 1177*a9fa9459Szrj 1178*a9fa9459Szrj // Accessor class for an ELF section header. 1179*a9fa9459Szrj 1180*a9fa9459Szrj template<int size, bool big_endian> 1181*a9fa9459Szrj class Shdr 1182*a9fa9459Szrj { 1183*a9fa9459Szrj public: 1184*a9fa9459Szrj Shdr(const unsigned char* p) 1185*a9fa9459Szrj : p_(reinterpret_cast<const internal::Shdr_data<size>*>(p)) 1186*a9fa9459Szrj { } 1187*a9fa9459Szrj 1188*a9fa9459Szrj template<typename File> 1189*a9fa9459Szrj Shdr(File* file, typename File::Location loc) 1190*a9fa9459Szrj : p_(reinterpret_cast<const internal::Shdr_data<size>*>( 1191*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1192*a9fa9459Szrj { } 1193*a9fa9459Szrj 1194*a9fa9459Szrj Elf_Word 1195*a9fa9459Szrj get_sh_name() const 1196*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->sh_name); } 1197*a9fa9459Szrj 1198*a9fa9459Szrj Elf_Word 1199*a9fa9459Szrj get_sh_type() const 1200*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->sh_type); } 1201*a9fa9459Szrj 1202*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1203*a9fa9459Szrj get_sh_flags() const 1204*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->sh_flags); } 1205*a9fa9459Szrj 1206*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1207*a9fa9459Szrj get_sh_addr() const 1208*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->sh_addr); } 1209*a9fa9459Szrj 1210*a9fa9459Szrj typename Elf_types<size>::Elf_Off 1211*a9fa9459Szrj get_sh_offset() const 1212*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->sh_offset); } 1213*a9fa9459Szrj 1214*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1215*a9fa9459Szrj get_sh_size() const 1216*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->sh_size); } 1217*a9fa9459Szrj 1218*a9fa9459Szrj Elf_Word 1219*a9fa9459Szrj get_sh_link() const 1220*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->sh_link); } 1221*a9fa9459Szrj 1222*a9fa9459Szrj Elf_Word 1223*a9fa9459Szrj get_sh_info() const 1224*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->sh_info); } 1225*a9fa9459Szrj 1226*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1227*a9fa9459Szrj get_sh_addralign() const 1228*a9fa9459Szrj { return 1229*a9fa9459Szrj Convert<size, big_endian>::convert_host(this->p_->sh_addralign); } 1230*a9fa9459Szrj 1231*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1232*a9fa9459Szrj get_sh_entsize() const 1233*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->sh_entsize); } 1234*a9fa9459Szrj 1235*a9fa9459Szrj private: 1236*a9fa9459Szrj const internal::Shdr_data<size>* p_; 1237*a9fa9459Szrj }; 1238*a9fa9459Szrj 1239*a9fa9459Szrj // Write class for an ELF section header. 1240*a9fa9459Szrj 1241*a9fa9459Szrj template<int size, bool big_endian> 1242*a9fa9459Szrj class Shdr_write 1243*a9fa9459Szrj { 1244*a9fa9459Szrj public: 1245*a9fa9459Szrj Shdr_write(unsigned char* p) 1246*a9fa9459Szrj : p_(reinterpret_cast<internal::Shdr_data<size>*>(p)) 1247*a9fa9459Szrj { } 1248*a9fa9459Szrj 1249*a9fa9459Szrj void 1250*a9fa9459Szrj put_sh_name(Elf_Word v) 1251*a9fa9459Szrj { this->p_->sh_name = Convert<32, big_endian>::convert_host(v); } 1252*a9fa9459Szrj 1253*a9fa9459Szrj void 1254*a9fa9459Szrj put_sh_type(Elf_Word v) 1255*a9fa9459Szrj { this->p_->sh_type = Convert<32, big_endian>::convert_host(v); } 1256*a9fa9459Szrj 1257*a9fa9459Szrj void 1258*a9fa9459Szrj put_sh_flags(typename Elf_types<size>::Elf_WXword v) 1259*a9fa9459Szrj { this->p_->sh_flags = Convert<size, big_endian>::convert_host(v); } 1260*a9fa9459Szrj 1261*a9fa9459Szrj void 1262*a9fa9459Szrj put_sh_addr(typename Elf_types<size>::Elf_Addr v) 1263*a9fa9459Szrj { this->p_->sh_addr = Convert<size, big_endian>::convert_host(v); } 1264*a9fa9459Szrj 1265*a9fa9459Szrj void 1266*a9fa9459Szrj put_sh_offset(typename Elf_types<size>::Elf_Off v) 1267*a9fa9459Szrj { this->p_->sh_offset = Convert<size, big_endian>::convert_host(v); } 1268*a9fa9459Szrj 1269*a9fa9459Szrj void 1270*a9fa9459Szrj put_sh_size(typename Elf_types<size>::Elf_WXword v) 1271*a9fa9459Szrj { this->p_->sh_size = Convert<size, big_endian>::convert_host(v); } 1272*a9fa9459Szrj 1273*a9fa9459Szrj void 1274*a9fa9459Szrj put_sh_link(Elf_Word v) 1275*a9fa9459Szrj { this->p_->sh_link = Convert<32, big_endian>::convert_host(v); } 1276*a9fa9459Szrj 1277*a9fa9459Szrj void 1278*a9fa9459Szrj put_sh_info(Elf_Word v) 1279*a9fa9459Szrj { this->p_->sh_info = Convert<32, big_endian>::convert_host(v); } 1280*a9fa9459Szrj 1281*a9fa9459Szrj void 1282*a9fa9459Szrj put_sh_addralign(typename Elf_types<size>::Elf_WXword v) 1283*a9fa9459Szrj { this->p_->sh_addralign = Convert<size, big_endian>::convert_host(v); } 1284*a9fa9459Szrj 1285*a9fa9459Szrj void 1286*a9fa9459Szrj put_sh_entsize(typename Elf_types<size>::Elf_WXword v) 1287*a9fa9459Szrj { this->p_->sh_entsize = Convert<size, big_endian>::convert_host(v); } 1288*a9fa9459Szrj 1289*a9fa9459Szrj private: 1290*a9fa9459Szrj internal::Shdr_data<size>* p_; 1291*a9fa9459Szrj }; 1292*a9fa9459Szrj 1293*a9fa9459Szrj // Accessor class for an ELF compression header. 1294*a9fa9459Szrj 1295*a9fa9459Szrj template<int size, bool big_endian> 1296*a9fa9459Szrj class Chdr 1297*a9fa9459Szrj { 1298*a9fa9459Szrj public: 1299*a9fa9459Szrj Chdr(const unsigned char* p) 1300*a9fa9459Szrj : p_(reinterpret_cast<const internal::Chdr_data<size>*>(p)) 1301*a9fa9459Szrj { } 1302*a9fa9459Szrj 1303*a9fa9459Szrj template<typename File> 1304*a9fa9459Szrj Chdr(File* file, typename File::Location loc) 1305*a9fa9459Szrj : p_(reinterpret_cast<const internal::Chdr_data<size>*>( 1306*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1307*a9fa9459Szrj { } 1308*a9fa9459Szrj 1309*a9fa9459Szrj Elf_Word 1310*a9fa9459Szrj get_ch_type() const 1311*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->ch_type); } 1312*a9fa9459Szrj 1313*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1314*a9fa9459Szrj get_ch_size() const 1315*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->ch_size); } 1316*a9fa9459Szrj 1317*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1318*a9fa9459Szrj get_ch_addralign() const 1319*a9fa9459Szrj { return 1320*a9fa9459Szrj Convert<size, big_endian>::convert_host(this->p_->ch_addralign); } 1321*a9fa9459Szrj 1322*a9fa9459Szrj private: 1323*a9fa9459Szrj const internal::Chdr_data<size>* p_; 1324*a9fa9459Szrj }; 1325*a9fa9459Szrj 1326*a9fa9459Szrj // Write class for an ELF compression header. 1327*a9fa9459Szrj 1328*a9fa9459Szrj template<int size, bool big_endian> 1329*a9fa9459Szrj class Chdr_write 1330*a9fa9459Szrj { 1331*a9fa9459Szrj public: 1332*a9fa9459Szrj Chdr_write(unsigned char* p) 1333*a9fa9459Szrj : p_(reinterpret_cast<internal::Chdr_data<size>*>(p)) 1334*a9fa9459Szrj { } 1335*a9fa9459Szrj 1336*a9fa9459Szrj void 1337*a9fa9459Szrj put_ch_type(typename Elf_types<size>::Elf_WXword v) 1338*a9fa9459Szrj { this->p_->ch_type = Convert<size, big_endian>::convert_host(v); } 1339*a9fa9459Szrj 1340*a9fa9459Szrj void 1341*a9fa9459Szrj put_ch_size(typename Elf_types<size>::Elf_WXword v) 1342*a9fa9459Szrj { this->p_->ch_size = Convert<size, big_endian>::convert_host(v); } 1343*a9fa9459Szrj 1344*a9fa9459Szrj void 1345*a9fa9459Szrj put_ch_addralign(typename Elf_types<size>::Elf_WXword v) 1346*a9fa9459Szrj { this->p_->ch_addralign = Convert<size, big_endian>::convert_host(v); } 1347*a9fa9459Szrj 1348*a9fa9459Szrj private: 1349*a9fa9459Szrj internal::Chdr_data<size>* p_; 1350*a9fa9459Szrj }; 1351*a9fa9459Szrj 1352*a9fa9459Szrj // Accessor class for an ELF segment header. 1353*a9fa9459Szrj 1354*a9fa9459Szrj template<int size, bool big_endian> 1355*a9fa9459Szrj class Phdr 1356*a9fa9459Szrj { 1357*a9fa9459Szrj public: 1358*a9fa9459Szrj Phdr(const unsigned char* p) 1359*a9fa9459Szrj : p_(reinterpret_cast<const internal::Phdr_data<size>*>(p)) 1360*a9fa9459Szrj { } 1361*a9fa9459Szrj 1362*a9fa9459Szrj template<typename File> 1363*a9fa9459Szrj Phdr(File* file, typename File::Location loc) 1364*a9fa9459Szrj : p_(reinterpret_cast<internal::Phdr_data<size>*>( 1365*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1366*a9fa9459Szrj { } 1367*a9fa9459Szrj 1368*a9fa9459Szrj Elf_Word 1369*a9fa9459Szrj get_p_type() const 1370*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->p_type); } 1371*a9fa9459Szrj 1372*a9fa9459Szrj typename Elf_types<size>::Elf_Off 1373*a9fa9459Szrj get_p_offset() const 1374*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->p_offset); } 1375*a9fa9459Szrj 1376*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1377*a9fa9459Szrj get_p_vaddr() const 1378*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->p_vaddr); } 1379*a9fa9459Szrj 1380*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1381*a9fa9459Szrj get_p_paddr() const 1382*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->p_paddr); } 1383*a9fa9459Szrj 1384*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1385*a9fa9459Szrj get_p_filesz() const 1386*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->p_filesz); } 1387*a9fa9459Szrj 1388*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1389*a9fa9459Szrj get_p_memsz() const 1390*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->p_memsz); } 1391*a9fa9459Szrj 1392*a9fa9459Szrj Elf_Word 1393*a9fa9459Szrj get_p_flags() const 1394*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->p_flags); } 1395*a9fa9459Szrj 1396*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1397*a9fa9459Szrj get_p_align() const 1398*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->p_align); } 1399*a9fa9459Szrj 1400*a9fa9459Szrj private: 1401*a9fa9459Szrj const internal::Phdr_data<size>* p_; 1402*a9fa9459Szrj }; 1403*a9fa9459Szrj 1404*a9fa9459Szrj // Write class for an ELF segment header. 1405*a9fa9459Szrj 1406*a9fa9459Szrj template<int size, bool big_endian> 1407*a9fa9459Szrj class Phdr_write 1408*a9fa9459Szrj { 1409*a9fa9459Szrj public: 1410*a9fa9459Szrj Phdr_write(unsigned char* p) 1411*a9fa9459Szrj : p_(reinterpret_cast<internal::Phdr_data<size>*>(p)) 1412*a9fa9459Szrj { } 1413*a9fa9459Szrj 1414*a9fa9459Szrj void 1415*a9fa9459Szrj put_p_type(Elf_Word v) 1416*a9fa9459Szrj { this->p_->p_type = Convert<32, big_endian>::convert_host(v); } 1417*a9fa9459Szrj 1418*a9fa9459Szrj void 1419*a9fa9459Szrj put_p_offset(typename Elf_types<size>::Elf_Off v) 1420*a9fa9459Szrj { this->p_->p_offset = Convert<size, big_endian>::convert_host(v); } 1421*a9fa9459Szrj 1422*a9fa9459Szrj void 1423*a9fa9459Szrj put_p_vaddr(typename Elf_types<size>::Elf_Addr v) 1424*a9fa9459Szrj { this->p_->p_vaddr = Convert<size, big_endian>::convert_host(v); } 1425*a9fa9459Szrj 1426*a9fa9459Szrj void 1427*a9fa9459Szrj put_p_paddr(typename Elf_types<size>::Elf_Addr v) 1428*a9fa9459Szrj { this->p_->p_paddr = Convert<size, big_endian>::convert_host(v); } 1429*a9fa9459Szrj 1430*a9fa9459Szrj void 1431*a9fa9459Szrj put_p_filesz(typename Elf_types<size>::Elf_WXword v) 1432*a9fa9459Szrj { this->p_->p_filesz = Convert<size, big_endian>::convert_host(v); } 1433*a9fa9459Szrj 1434*a9fa9459Szrj void 1435*a9fa9459Szrj put_p_memsz(typename Elf_types<size>::Elf_WXword v) 1436*a9fa9459Szrj { this->p_->p_memsz = Convert<size, big_endian>::convert_host(v); } 1437*a9fa9459Szrj 1438*a9fa9459Szrj void 1439*a9fa9459Szrj put_p_flags(Elf_Word v) 1440*a9fa9459Szrj { this->p_->p_flags = Convert<32, big_endian>::convert_host(v); } 1441*a9fa9459Szrj 1442*a9fa9459Szrj void 1443*a9fa9459Szrj put_p_align(typename Elf_types<size>::Elf_WXword v) 1444*a9fa9459Szrj { this->p_->p_align = Convert<size, big_endian>::convert_host(v); } 1445*a9fa9459Szrj 1446*a9fa9459Szrj private: 1447*a9fa9459Szrj internal::Phdr_data<size>* p_; 1448*a9fa9459Szrj }; 1449*a9fa9459Szrj 1450*a9fa9459Szrj // Accessor class for an ELF symbol table entry. 1451*a9fa9459Szrj 1452*a9fa9459Szrj template<int size, bool big_endian> 1453*a9fa9459Szrj class Sym 1454*a9fa9459Szrj { 1455*a9fa9459Szrj public: 1456*a9fa9459Szrj Sym(const unsigned char* p) 1457*a9fa9459Szrj : p_(reinterpret_cast<const internal::Sym_data<size>*>(p)) 1458*a9fa9459Szrj { } 1459*a9fa9459Szrj 1460*a9fa9459Szrj template<typename File> 1461*a9fa9459Szrj Sym(File* file, typename File::Location loc) 1462*a9fa9459Szrj : p_(reinterpret_cast<const internal::Sym_data<size>*>( 1463*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1464*a9fa9459Szrj { } 1465*a9fa9459Szrj 1466*a9fa9459Szrj Elf_Word 1467*a9fa9459Szrj get_st_name() const 1468*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->st_name); } 1469*a9fa9459Szrj 1470*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1471*a9fa9459Szrj get_st_value() const 1472*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->st_value); } 1473*a9fa9459Szrj 1474*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1475*a9fa9459Szrj get_st_size() const 1476*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->st_size); } 1477*a9fa9459Szrj 1478*a9fa9459Szrj unsigned char 1479*a9fa9459Szrj get_st_info() const 1480*a9fa9459Szrj { return this->p_->st_info; } 1481*a9fa9459Szrj 1482*a9fa9459Szrj STB 1483*a9fa9459Szrj get_st_bind() const 1484*a9fa9459Szrj { return elf_st_bind(this->get_st_info()); } 1485*a9fa9459Szrj 1486*a9fa9459Szrj STT 1487*a9fa9459Szrj get_st_type() const 1488*a9fa9459Szrj { return elf_st_type(this->get_st_info()); } 1489*a9fa9459Szrj 1490*a9fa9459Szrj unsigned char 1491*a9fa9459Szrj get_st_other() const 1492*a9fa9459Szrj { return this->p_->st_other; } 1493*a9fa9459Szrj 1494*a9fa9459Szrj STV 1495*a9fa9459Szrj get_st_visibility() const 1496*a9fa9459Szrj { return elf_st_visibility(this->get_st_other()); } 1497*a9fa9459Szrj 1498*a9fa9459Szrj unsigned char 1499*a9fa9459Szrj get_st_nonvis() const 1500*a9fa9459Szrj { return elf_st_nonvis(this->get_st_other()); } 1501*a9fa9459Szrj 1502*a9fa9459Szrj Elf_Half 1503*a9fa9459Szrj get_st_shndx() const 1504*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->st_shndx); } 1505*a9fa9459Szrj 1506*a9fa9459Szrj private: 1507*a9fa9459Szrj const internal::Sym_data<size>* p_; 1508*a9fa9459Szrj }; 1509*a9fa9459Szrj 1510*a9fa9459Szrj // Writer class for an ELF symbol table entry. 1511*a9fa9459Szrj 1512*a9fa9459Szrj template<int size, bool big_endian> 1513*a9fa9459Szrj class Sym_write 1514*a9fa9459Szrj { 1515*a9fa9459Szrj public: 1516*a9fa9459Szrj Sym_write(unsigned char* p) 1517*a9fa9459Szrj : p_(reinterpret_cast<internal::Sym_data<size>*>(p)) 1518*a9fa9459Szrj { } 1519*a9fa9459Szrj 1520*a9fa9459Szrj void 1521*a9fa9459Szrj put_st_name(Elf_Word v) 1522*a9fa9459Szrj { this->p_->st_name = Convert<32, big_endian>::convert_host(v); } 1523*a9fa9459Szrj 1524*a9fa9459Szrj void 1525*a9fa9459Szrj put_st_value(typename Elf_types<size>::Elf_Addr v) 1526*a9fa9459Szrj { this->p_->st_value = Convert<size, big_endian>::convert_host(v); } 1527*a9fa9459Szrj 1528*a9fa9459Szrj void 1529*a9fa9459Szrj put_st_size(typename Elf_types<size>::Elf_WXword v) 1530*a9fa9459Szrj { this->p_->st_size = Convert<size, big_endian>::convert_host(v); } 1531*a9fa9459Szrj 1532*a9fa9459Szrj void 1533*a9fa9459Szrj put_st_info(unsigned char v) 1534*a9fa9459Szrj { this->p_->st_info = v; } 1535*a9fa9459Szrj 1536*a9fa9459Szrj void 1537*a9fa9459Szrj put_st_info(STB bind, STT type) 1538*a9fa9459Szrj { this->p_->st_info = elf_st_info(bind, type); } 1539*a9fa9459Szrj 1540*a9fa9459Szrj void 1541*a9fa9459Szrj put_st_other(unsigned char v) 1542*a9fa9459Szrj { this->p_->st_other = v; } 1543*a9fa9459Szrj 1544*a9fa9459Szrj void 1545*a9fa9459Szrj put_st_other(STV vis, unsigned char nonvis) 1546*a9fa9459Szrj { this->p_->st_other = elf_st_other(vis, nonvis); } 1547*a9fa9459Szrj 1548*a9fa9459Szrj void 1549*a9fa9459Szrj put_st_shndx(Elf_Half v) 1550*a9fa9459Szrj { this->p_->st_shndx = Convert<16, big_endian>::convert_host(v); } 1551*a9fa9459Szrj 1552*a9fa9459Szrj Sym<size, big_endian> 1553*a9fa9459Szrj sym() 1554*a9fa9459Szrj { return Sym<size, big_endian>(reinterpret_cast<unsigned char*>(this->p_)); } 1555*a9fa9459Szrj 1556*a9fa9459Szrj private: 1557*a9fa9459Szrj internal::Sym_data<size>* p_; 1558*a9fa9459Szrj }; 1559*a9fa9459Szrj 1560*a9fa9459Szrj // Accessor classes for an ELF REL relocation entry. 1561*a9fa9459Szrj 1562*a9fa9459Szrj template<int size, bool big_endian> 1563*a9fa9459Szrj class Rel 1564*a9fa9459Szrj { 1565*a9fa9459Szrj public: 1566*a9fa9459Szrj Rel(const unsigned char* p) 1567*a9fa9459Szrj : p_(reinterpret_cast<const internal::Rel_data<size>*>(p)) 1568*a9fa9459Szrj { } 1569*a9fa9459Szrj 1570*a9fa9459Szrj template<typename File> 1571*a9fa9459Szrj Rel(File* file, typename File::Location loc) 1572*a9fa9459Szrj : p_(reinterpret_cast<const internal::Rel_data<size>*>( 1573*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1574*a9fa9459Szrj { } 1575*a9fa9459Szrj 1576*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1577*a9fa9459Szrj get_r_offset() const 1578*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->r_offset); } 1579*a9fa9459Szrj 1580*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1581*a9fa9459Szrj get_r_info() const 1582*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->r_info); } 1583*a9fa9459Szrj 1584*a9fa9459Szrj private: 1585*a9fa9459Szrj const internal::Rel_data<size>* p_; 1586*a9fa9459Szrj }; 1587*a9fa9459Szrj 1588*a9fa9459Szrj // Writer class for an ELF Rel relocation. 1589*a9fa9459Szrj 1590*a9fa9459Szrj template<int size, bool big_endian> 1591*a9fa9459Szrj class Rel_write 1592*a9fa9459Szrj { 1593*a9fa9459Szrj public: 1594*a9fa9459Szrj Rel_write(unsigned char* p) 1595*a9fa9459Szrj : p_(reinterpret_cast<internal::Rel_data<size>*>(p)) 1596*a9fa9459Szrj { } 1597*a9fa9459Szrj 1598*a9fa9459Szrj void 1599*a9fa9459Szrj put_r_offset(typename Elf_types<size>::Elf_Addr v) 1600*a9fa9459Szrj { this->p_->r_offset = Convert<size, big_endian>::convert_host(v); } 1601*a9fa9459Szrj 1602*a9fa9459Szrj void 1603*a9fa9459Szrj put_r_info(typename Elf_types<size>::Elf_WXword v) 1604*a9fa9459Szrj { this->p_->r_info = Convert<size, big_endian>::convert_host(v); } 1605*a9fa9459Szrj 1606*a9fa9459Szrj private: 1607*a9fa9459Szrj internal::Rel_data<size>* p_; 1608*a9fa9459Szrj }; 1609*a9fa9459Szrj 1610*a9fa9459Szrj // Accessor class for an ELF Rela relocation. 1611*a9fa9459Szrj 1612*a9fa9459Szrj template<int size, bool big_endian> 1613*a9fa9459Szrj class Rela 1614*a9fa9459Szrj { 1615*a9fa9459Szrj public: 1616*a9fa9459Szrj Rela(const unsigned char* p) 1617*a9fa9459Szrj : p_(reinterpret_cast<const internal::Rela_data<size>*>(p)) 1618*a9fa9459Szrj { } 1619*a9fa9459Szrj 1620*a9fa9459Szrj template<typename File> 1621*a9fa9459Szrj Rela(File* file, typename File::Location loc) 1622*a9fa9459Szrj : p_(reinterpret_cast<const internal::Rela_data<size>*>( 1623*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1624*a9fa9459Szrj { } 1625*a9fa9459Szrj 1626*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1627*a9fa9459Szrj get_r_offset() const 1628*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->r_offset); } 1629*a9fa9459Szrj 1630*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1631*a9fa9459Szrj get_r_info() const 1632*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->r_info); } 1633*a9fa9459Szrj 1634*a9fa9459Szrj typename Elf_types<size>::Elf_Swxword 1635*a9fa9459Szrj get_r_addend() const 1636*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->r_addend); } 1637*a9fa9459Szrj 1638*a9fa9459Szrj private: 1639*a9fa9459Szrj const internal::Rela_data<size>* p_; 1640*a9fa9459Szrj }; 1641*a9fa9459Szrj 1642*a9fa9459Szrj // Writer class for an ELF Rela relocation. 1643*a9fa9459Szrj 1644*a9fa9459Szrj template<int size, bool big_endian> 1645*a9fa9459Szrj class Rela_write 1646*a9fa9459Szrj { 1647*a9fa9459Szrj public: 1648*a9fa9459Szrj Rela_write(unsigned char* p) 1649*a9fa9459Szrj : p_(reinterpret_cast<internal::Rela_data<size>*>(p)) 1650*a9fa9459Szrj { } 1651*a9fa9459Szrj 1652*a9fa9459Szrj void 1653*a9fa9459Szrj put_r_offset(typename Elf_types<size>::Elf_Addr v) 1654*a9fa9459Szrj { this->p_->r_offset = Convert<size, big_endian>::convert_host(v); } 1655*a9fa9459Szrj 1656*a9fa9459Szrj void 1657*a9fa9459Szrj put_r_info(typename Elf_types<size>::Elf_WXword v) 1658*a9fa9459Szrj { this->p_->r_info = Convert<size, big_endian>::convert_host(v); } 1659*a9fa9459Szrj 1660*a9fa9459Szrj void 1661*a9fa9459Szrj put_r_addend(typename Elf_types<size>::Elf_Swxword v) 1662*a9fa9459Szrj { this->p_->r_addend = Convert<size, big_endian>::convert_host(v); } 1663*a9fa9459Szrj 1664*a9fa9459Szrj private: 1665*a9fa9459Szrj internal::Rela_data<size>* p_; 1666*a9fa9459Szrj }; 1667*a9fa9459Szrj 1668*a9fa9459Szrj // MIPS-64 has a non-standard relocation layout. 1669*a9fa9459Szrj 1670*a9fa9459Szrj template<bool big_endian> 1671*a9fa9459Szrj class Mips64_rel 1672*a9fa9459Szrj { 1673*a9fa9459Szrj public: 1674*a9fa9459Szrj Mips64_rel(const unsigned char* p) 1675*a9fa9459Szrj : p_(reinterpret_cast<const internal::Mips64_rel_data*>(p)) 1676*a9fa9459Szrj { } 1677*a9fa9459Szrj 1678*a9fa9459Szrj template<typename File> 1679*a9fa9459Szrj Mips64_rel(File* file, typename File::Location loc) 1680*a9fa9459Szrj : p_(reinterpret_cast<const internal::Mips64_rel_data*>( 1681*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1682*a9fa9459Szrj { } 1683*a9fa9459Szrj 1684*a9fa9459Szrj typename Elf_types<64>::Elf_Addr 1685*a9fa9459Szrj get_r_offset() const 1686*a9fa9459Szrj { return Convert<64, big_endian>::convert_host(this->p_->r_offset); } 1687*a9fa9459Szrj 1688*a9fa9459Szrj Elf_Word 1689*a9fa9459Szrj get_r_sym() const 1690*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->r_sym); } 1691*a9fa9459Szrj 1692*a9fa9459Szrj unsigned char 1693*a9fa9459Szrj get_r_ssym() const 1694*a9fa9459Szrj { return this->p_->r_ssym; } 1695*a9fa9459Szrj 1696*a9fa9459Szrj unsigned char 1697*a9fa9459Szrj get_r_type() const 1698*a9fa9459Szrj { return this->p_->r_type; } 1699*a9fa9459Szrj 1700*a9fa9459Szrj unsigned char 1701*a9fa9459Szrj get_r_type2() const 1702*a9fa9459Szrj { return this->p_->r_type2; } 1703*a9fa9459Szrj 1704*a9fa9459Szrj unsigned char 1705*a9fa9459Szrj get_r_type3() const 1706*a9fa9459Szrj { return this->p_->r_type3; } 1707*a9fa9459Szrj 1708*a9fa9459Szrj private: 1709*a9fa9459Szrj const internal::Mips64_rel_data* p_; 1710*a9fa9459Szrj }; 1711*a9fa9459Szrj 1712*a9fa9459Szrj template<bool big_endian> 1713*a9fa9459Szrj class Mips64_rel_write 1714*a9fa9459Szrj { 1715*a9fa9459Szrj public: 1716*a9fa9459Szrj Mips64_rel_write(unsigned char* p) 1717*a9fa9459Szrj : p_(reinterpret_cast<internal::Mips64_rel_data*>(p)) 1718*a9fa9459Szrj { } 1719*a9fa9459Szrj 1720*a9fa9459Szrj void 1721*a9fa9459Szrj put_r_offset(typename Elf_types<64>::Elf_Addr v) 1722*a9fa9459Szrj { this->p_->r_offset = Convert<64, big_endian>::convert_host(v); } 1723*a9fa9459Szrj 1724*a9fa9459Szrj void 1725*a9fa9459Szrj put_r_sym(Elf_Word v) 1726*a9fa9459Szrj { this->p_->r_sym = Convert<32, big_endian>::convert_host(v); } 1727*a9fa9459Szrj 1728*a9fa9459Szrj void 1729*a9fa9459Szrj put_r_ssym(unsigned char v) 1730*a9fa9459Szrj { this->p_->r_ssym = v; } 1731*a9fa9459Szrj 1732*a9fa9459Szrj void 1733*a9fa9459Szrj put_r_type(unsigned char v) 1734*a9fa9459Szrj { this->p_->r_type = v; } 1735*a9fa9459Szrj 1736*a9fa9459Szrj void 1737*a9fa9459Szrj put_r_type2(unsigned char v) 1738*a9fa9459Szrj { this->p_->r_type2 = v; } 1739*a9fa9459Szrj 1740*a9fa9459Szrj void 1741*a9fa9459Szrj put_r_type3(unsigned char v) 1742*a9fa9459Szrj { this->p_->r_type3 = v; } 1743*a9fa9459Szrj 1744*a9fa9459Szrj private: 1745*a9fa9459Szrj internal::Mips64_rel_data* p_; 1746*a9fa9459Szrj }; 1747*a9fa9459Szrj 1748*a9fa9459Szrj template<bool big_endian> 1749*a9fa9459Szrj class Mips64_rela 1750*a9fa9459Szrj { 1751*a9fa9459Szrj public: 1752*a9fa9459Szrj Mips64_rela(const unsigned char* p) 1753*a9fa9459Szrj : p_(reinterpret_cast<const internal::Mips64_rela_data*>(p)) 1754*a9fa9459Szrj { } 1755*a9fa9459Szrj 1756*a9fa9459Szrj template<typename File> 1757*a9fa9459Szrj Mips64_rela(File* file, typename File::Location loc) 1758*a9fa9459Szrj : p_(reinterpret_cast<const internal::Mips64_rela_data*>( 1759*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1760*a9fa9459Szrj { } 1761*a9fa9459Szrj 1762*a9fa9459Szrj typename Elf_types<64>::Elf_Addr 1763*a9fa9459Szrj get_r_offset() const 1764*a9fa9459Szrj { return Convert<64, big_endian>::convert_host(this->p_->r_offset); } 1765*a9fa9459Szrj 1766*a9fa9459Szrj Elf_Word 1767*a9fa9459Szrj get_r_sym() const 1768*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->r_sym); } 1769*a9fa9459Szrj 1770*a9fa9459Szrj unsigned char 1771*a9fa9459Szrj get_r_ssym() const 1772*a9fa9459Szrj { return this->p_->r_ssym; } 1773*a9fa9459Szrj 1774*a9fa9459Szrj unsigned char 1775*a9fa9459Szrj get_r_type() const 1776*a9fa9459Szrj { return this->p_->r_type; } 1777*a9fa9459Szrj 1778*a9fa9459Szrj unsigned char 1779*a9fa9459Szrj get_r_type2() const 1780*a9fa9459Szrj { return this->p_->r_type2; } 1781*a9fa9459Szrj 1782*a9fa9459Szrj unsigned char 1783*a9fa9459Szrj get_r_type3() const 1784*a9fa9459Szrj { return this->p_->r_type3; } 1785*a9fa9459Szrj 1786*a9fa9459Szrj typename Elf_types<64>::Elf_Swxword 1787*a9fa9459Szrj get_r_addend() const 1788*a9fa9459Szrj { return Convert<64, big_endian>::convert_host(this->p_->r_addend); } 1789*a9fa9459Szrj 1790*a9fa9459Szrj private: 1791*a9fa9459Szrj const internal::Mips64_rela_data* p_; 1792*a9fa9459Szrj }; 1793*a9fa9459Szrj 1794*a9fa9459Szrj template<bool big_endian> 1795*a9fa9459Szrj class Mips64_rela_write 1796*a9fa9459Szrj { 1797*a9fa9459Szrj public: 1798*a9fa9459Szrj Mips64_rela_write(unsigned char* p) 1799*a9fa9459Szrj : p_(reinterpret_cast<internal::Mips64_rela_data*>(p)) 1800*a9fa9459Szrj { } 1801*a9fa9459Szrj 1802*a9fa9459Szrj void 1803*a9fa9459Szrj put_r_offset(typename Elf_types<64>::Elf_Addr v) 1804*a9fa9459Szrj { this->p_->r_offset = Convert<64, big_endian>::convert_host(v); } 1805*a9fa9459Szrj 1806*a9fa9459Szrj void 1807*a9fa9459Szrj put_r_sym(Elf_Word v) 1808*a9fa9459Szrj { this->p_->r_sym = Convert<32, big_endian>::convert_host(v); } 1809*a9fa9459Szrj 1810*a9fa9459Szrj void 1811*a9fa9459Szrj put_r_ssym(unsigned char v) 1812*a9fa9459Szrj { this->p_->r_ssym = v; } 1813*a9fa9459Szrj 1814*a9fa9459Szrj void 1815*a9fa9459Szrj put_r_type(unsigned char v) 1816*a9fa9459Szrj { this->p_->r_type = v; } 1817*a9fa9459Szrj 1818*a9fa9459Szrj void 1819*a9fa9459Szrj put_r_type2(unsigned char v) 1820*a9fa9459Szrj { this->p_->r_type2 = v; } 1821*a9fa9459Szrj 1822*a9fa9459Szrj void 1823*a9fa9459Szrj put_r_type3(unsigned char v) 1824*a9fa9459Szrj { this->p_->r_type3 = v; } 1825*a9fa9459Szrj 1826*a9fa9459Szrj void 1827*a9fa9459Szrj put_r_addend(typename Elf_types<64>::Elf_Swxword v) 1828*a9fa9459Szrj { this->p_->r_addend = Convert<64, big_endian>::convert_host(v); } 1829*a9fa9459Szrj 1830*a9fa9459Szrj private: 1831*a9fa9459Szrj internal::Mips64_rela_data* p_; 1832*a9fa9459Szrj }; 1833*a9fa9459Szrj 1834*a9fa9459Szrj // Accessor classes for entries in the ELF SHT_DYNAMIC section aka 1835*a9fa9459Szrj // PT_DYNAMIC segment. 1836*a9fa9459Szrj 1837*a9fa9459Szrj template<int size, bool big_endian> 1838*a9fa9459Szrj class Dyn 1839*a9fa9459Szrj { 1840*a9fa9459Szrj public: 1841*a9fa9459Szrj Dyn(const unsigned char* p) 1842*a9fa9459Szrj : p_(reinterpret_cast<const internal::Dyn_data<size>*>(p)) 1843*a9fa9459Szrj { } 1844*a9fa9459Szrj 1845*a9fa9459Szrj template<typename File> 1846*a9fa9459Szrj Dyn(File* file, typename File::Location loc) 1847*a9fa9459Szrj : p_(reinterpret_cast<const internal::Dyn_data<size>*>( 1848*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1849*a9fa9459Szrj { } 1850*a9fa9459Szrj 1851*a9fa9459Szrj typename Elf_types<size>::Elf_Swxword 1852*a9fa9459Szrj get_d_tag() const 1853*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->d_tag); } 1854*a9fa9459Szrj 1855*a9fa9459Szrj typename Elf_types<size>::Elf_WXword 1856*a9fa9459Szrj get_d_val() const 1857*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->d_val); } 1858*a9fa9459Szrj 1859*a9fa9459Szrj typename Elf_types<size>::Elf_Addr 1860*a9fa9459Szrj get_d_ptr() const 1861*a9fa9459Szrj { return Convert<size, big_endian>::convert_host(this->p_->d_val); } 1862*a9fa9459Szrj 1863*a9fa9459Szrj private: 1864*a9fa9459Szrj const internal::Dyn_data<size>* p_; 1865*a9fa9459Szrj }; 1866*a9fa9459Szrj 1867*a9fa9459Szrj // Write class for an entry in the SHT_DYNAMIC section. 1868*a9fa9459Szrj 1869*a9fa9459Szrj template<int size, bool big_endian> 1870*a9fa9459Szrj class Dyn_write 1871*a9fa9459Szrj { 1872*a9fa9459Szrj public: 1873*a9fa9459Szrj Dyn_write(unsigned char* p) 1874*a9fa9459Szrj : p_(reinterpret_cast<internal::Dyn_data<size>*>(p)) 1875*a9fa9459Szrj { } 1876*a9fa9459Szrj 1877*a9fa9459Szrj void 1878*a9fa9459Szrj put_d_tag(typename Elf_types<size>::Elf_Swxword v) 1879*a9fa9459Szrj { this->p_->d_tag = Convert<size, big_endian>::convert_host(v); } 1880*a9fa9459Szrj 1881*a9fa9459Szrj void 1882*a9fa9459Szrj put_d_val(typename Elf_types<size>::Elf_WXword v) 1883*a9fa9459Szrj { this->p_->d_val = Convert<size, big_endian>::convert_host(v); } 1884*a9fa9459Szrj 1885*a9fa9459Szrj void 1886*a9fa9459Szrj put_d_ptr(typename Elf_types<size>::Elf_Addr v) 1887*a9fa9459Szrj { this->p_->d_val = Convert<size, big_endian>::convert_host(v); } 1888*a9fa9459Szrj 1889*a9fa9459Szrj private: 1890*a9fa9459Szrj internal::Dyn_data<size>* p_; 1891*a9fa9459Szrj }; 1892*a9fa9459Szrj 1893*a9fa9459Szrj // Accessor classes for entries in the ELF SHT_GNU_verdef section. 1894*a9fa9459Szrj 1895*a9fa9459Szrj template<int size, bool big_endian> 1896*a9fa9459Szrj class Verdef 1897*a9fa9459Szrj { 1898*a9fa9459Szrj public: 1899*a9fa9459Szrj Verdef(const unsigned char* p) 1900*a9fa9459Szrj : p_(reinterpret_cast<const internal::Verdef_data*>(p)) 1901*a9fa9459Szrj { } 1902*a9fa9459Szrj 1903*a9fa9459Szrj template<typename File> 1904*a9fa9459Szrj Verdef(File* file, typename File::Location loc) 1905*a9fa9459Szrj : p_(reinterpret_cast<const internal::Verdef_data*>( 1906*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1907*a9fa9459Szrj { } 1908*a9fa9459Szrj 1909*a9fa9459Szrj Elf_Half 1910*a9fa9459Szrj get_vd_version() const 1911*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vd_version); } 1912*a9fa9459Szrj 1913*a9fa9459Szrj Elf_Half 1914*a9fa9459Szrj get_vd_flags() const 1915*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vd_flags); } 1916*a9fa9459Szrj 1917*a9fa9459Szrj Elf_Half 1918*a9fa9459Szrj get_vd_ndx() const 1919*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vd_ndx); } 1920*a9fa9459Szrj 1921*a9fa9459Szrj Elf_Half 1922*a9fa9459Szrj get_vd_cnt() const 1923*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vd_cnt); } 1924*a9fa9459Szrj 1925*a9fa9459Szrj Elf_Word 1926*a9fa9459Szrj get_vd_hash() const 1927*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vd_hash); } 1928*a9fa9459Szrj 1929*a9fa9459Szrj Elf_Word 1930*a9fa9459Szrj get_vd_aux() const 1931*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vd_aux); } 1932*a9fa9459Szrj 1933*a9fa9459Szrj Elf_Word 1934*a9fa9459Szrj get_vd_next() const 1935*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vd_next); } 1936*a9fa9459Szrj 1937*a9fa9459Szrj private: 1938*a9fa9459Szrj const internal::Verdef_data* p_; 1939*a9fa9459Szrj }; 1940*a9fa9459Szrj 1941*a9fa9459Szrj template<int size, bool big_endian> 1942*a9fa9459Szrj class Verdef_write 1943*a9fa9459Szrj { 1944*a9fa9459Szrj public: 1945*a9fa9459Szrj Verdef_write(unsigned char* p) 1946*a9fa9459Szrj : p_(reinterpret_cast<internal::Verdef_data*>(p)) 1947*a9fa9459Szrj { } 1948*a9fa9459Szrj 1949*a9fa9459Szrj void 1950*a9fa9459Szrj set_vd_version(Elf_Half v) 1951*a9fa9459Szrj { this->p_->vd_version = Convert<16, big_endian>::convert_host(v); } 1952*a9fa9459Szrj 1953*a9fa9459Szrj void 1954*a9fa9459Szrj set_vd_flags(Elf_Half v) 1955*a9fa9459Szrj { this->p_->vd_flags = Convert<16, big_endian>::convert_host(v); } 1956*a9fa9459Szrj 1957*a9fa9459Szrj void 1958*a9fa9459Szrj set_vd_ndx(Elf_Half v) 1959*a9fa9459Szrj { this->p_->vd_ndx = Convert<16, big_endian>::convert_host(v); } 1960*a9fa9459Szrj 1961*a9fa9459Szrj void 1962*a9fa9459Szrj set_vd_cnt(Elf_Half v) 1963*a9fa9459Szrj { this->p_->vd_cnt = Convert<16, big_endian>::convert_host(v); } 1964*a9fa9459Szrj 1965*a9fa9459Szrj void 1966*a9fa9459Szrj set_vd_hash(Elf_Word v) 1967*a9fa9459Szrj { this->p_->vd_hash = Convert<32, big_endian>::convert_host(v); } 1968*a9fa9459Szrj 1969*a9fa9459Szrj void 1970*a9fa9459Szrj set_vd_aux(Elf_Word v) 1971*a9fa9459Szrj { this->p_->vd_aux = Convert<32, big_endian>::convert_host(v); } 1972*a9fa9459Szrj 1973*a9fa9459Szrj void 1974*a9fa9459Szrj set_vd_next(Elf_Word v) 1975*a9fa9459Szrj { this->p_->vd_next = Convert<32, big_endian>::convert_host(v); } 1976*a9fa9459Szrj 1977*a9fa9459Szrj private: 1978*a9fa9459Szrj internal::Verdef_data* p_; 1979*a9fa9459Szrj }; 1980*a9fa9459Szrj 1981*a9fa9459Szrj // Accessor classes for auxiliary entries in the ELF SHT_GNU_verdef 1982*a9fa9459Szrj // section. 1983*a9fa9459Szrj 1984*a9fa9459Szrj template<int size, bool big_endian> 1985*a9fa9459Szrj class Verdaux 1986*a9fa9459Szrj { 1987*a9fa9459Szrj public: 1988*a9fa9459Szrj Verdaux(const unsigned char* p) 1989*a9fa9459Szrj : p_(reinterpret_cast<const internal::Verdaux_data*>(p)) 1990*a9fa9459Szrj { } 1991*a9fa9459Szrj 1992*a9fa9459Szrj template<typename File> 1993*a9fa9459Szrj Verdaux(File* file, typename File::Location loc) 1994*a9fa9459Szrj : p_(reinterpret_cast<const internal::Verdaux_data*>( 1995*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 1996*a9fa9459Szrj { } 1997*a9fa9459Szrj 1998*a9fa9459Szrj Elf_Word 1999*a9fa9459Szrj get_vda_name() const 2000*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vda_name); } 2001*a9fa9459Szrj 2002*a9fa9459Szrj Elf_Word 2003*a9fa9459Szrj get_vda_next() const 2004*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vda_next); } 2005*a9fa9459Szrj 2006*a9fa9459Szrj private: 2007*a9fa9459Szrj const internal::Verdaux_data* p_; 2008*a9fa9459Szrj }; 2009*a9fa9459Szrj 2010*a9fa9459Szrj template<int size, bool big_endian> 2011*a9fa9459Szrj class Verdaux_write 2012*a9fa9459Szrj { 2013*a9fa9459Szrj public: 2014*a9fa9459Szrj Verdaux_write(unsigned char* p) 2015*a9fa9459Szrj : p_(reinterpret_cast<internal::Verdaux_data*>(p)) 2016*a9fa9459Szrj { } 2017*a9fa9459Szrj 2018*a9fa9459Szrj void 2019*a9fa9459Szrj set_vda_name(Elf_Word v) 2020*a9fa9459Szrj { this->p_->vda_name = Convert<32, big_endian>::convert_host(v); } 2021*a9fa9459Szrj 2022*a9fa9459Szrj void 2023*a9fa9459Szrj set_vda_next(Elf_Word v) 2024*a9fa9459Szrj { this->p_->vda_next = Convert<32, big_endian>::convert_host(v); } 2025*a9fa9459Szrj 2026*a9fa9459Szrj private: 2027*a9fa9459Szrj internal::Verdaux_data* p_; 2028*a9fa9459Szrj }; 2029*a9fa9459Szrj 2030*a9fa9459Szrj // Accessor classes for entries in the ELF SHT_GNU_verneed section. 2031*a9fa9459Szrj 2032*a9fa9459Szrj template<int size, bool big_endian> 2033*a9fa9459Szrj class Verneed 2034*a9fa9459Szrj { 2035*a9fa9459Szrj public: 2036*a9fa9459Szrj Verneed(const unsigned char* p) 2037*a9fa9459Szrj : p_(reinterpret_cast<const internal::Verneed_data*>(p)) 2038*a9fa9459Szrj { } 2039*a9fa9459Szrj 2040*a9fa9459Szrj template<typename File> 2041*a9fa9459Szrj Verneed(File* file, typename File::Location loc) 2042*a9fa9459Szrj : p_(reinterpret_cast<const internal::Verneed_data*>( 2043*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 2044*a9fa9459Szrj { } 2045*a9fa9459Szrj 2046*a9fa9459Szrj Elf_Half 2047*a9fa9459Szrj get_vn_version() const 2048*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vn_version); } 2049*a9fa9459Szrj 2050*a9fa9459Szrj Elf_Half 2051*a9fa9459Szrj get_vn_cnt() const 2052*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vn_cnt); } 2053*a9fa9459Szrj 2054*a9fa9459Szrj Elf_Word 2055*a9fa9459Szrj get_vn_file() const 2056*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vn_file); } 2057*a9fa9459Szrj 2058*a9fa9459Szrj Elf_Word 2059*a9fa9459Szrj get_vn_aux() const 2060*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vn_aux); } 2061*a9fa9459Szrj 2062*a9fa9459Szrj Elf_Word 2063*a9fa9459Szrj get_vn_next() const 2064*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vn_next); } 2065*a9fa9459Szrj 2066*a9fa9459Szrj private: 2067*a9fa9459Szrj const internal::Verneed_data* p_; 2068*a9fa9459Szrj }; 2069*a9fa9459Szrj 2070*a9fa9459Szrj template<int size, bool big_endian> 2071*a9fa9459Szrj class Verneed_write 2072*a9fa9459Szrj { 2073*a9fa9459Szrj public: 2074*a9fa9459Szrj Verneed_write(unsigned char* p) 2075*a9fa9459Szrj : p_(reinterpret_cast<internal::Verneed_data*>(p)) 2076*a9fa9459Szrj { } 2077*a9fa9459Szrj 2078*a9fa9459Szrj void 2079*a9fa9459Szrj set_vn_version(Elf_Half v) 2080*a9fa9459Szrj { this->p_->vn_version = Convert<16, big_endian>::convert_host(v); } 2081*a9fa9459Szrj 2082*a9fa9459Szrj void 2083*a9fa9459Szrj set_vn_cnt(Elf_Half v) 2084*a9fa9459Szrj { this->p_->vn_cnt = Convert<16, big_endian>::convert_host(v); } 2085*a9fa9459Szrj 2086*a9fa9459Szrj void 2087*a9fa9459Szrj set_vn_file(Elf_Word v) 2088*a9fa9459Szrj { this->p_->vn_file = Convert<32, big_endian>::convert_host(v); } 2089*a9fa9459Szrj 2090*a9fa9459Szrj void 2091*a9fa9459Szrj set_vn_aux(Elf_Word v) 2092*a9fa9459Szrj { this->p_->vn_aux = Convert<32, big_endian>::convert_host(v); } 2093*a9fa9459Szrj 2094*a9fa9459Szrj void 2095*a9fa9459Szrj set_vn_next(Elf_Word v) 2096*a9fa9459Szrj { this->p_->vn_next = Convert<32, big_endian>::convert_host(v); } 2097*a9fa9459Szrj 2098*a9fa9459Szrj private: 2099*a9fa9459Szrj internal::Verneed_data* p_; 2100*a9fa9459Szrj }; 2101*a9fa9459Szrj 2102*a9fa9459Szrj // Accessor classes for auxiliary entries in the ELF SHT_GNU_verneed 2103*a9fa9459Szrj // section. 2104*a9fa9459Szrj 2105*a9fa9459Szrj template<int size, bool big_endian> 2106*a9fa9459Szrj class Vernaux 2107*a9fa9459Szrj { 2108*a9fa9459Szrj public: 2109*a9fa9459Szrj Vernaux(const unsigned char* p) 2110*a9fa9459Szrj : p_(reinterpret_cast<const internal::Vernaux_data*>(p)) 2111*a9fa9459Szrj { } 2112*a9fa9459Szrj 2113*a9fa9459Szrj template<typename File> 2114*a9fa9459Szrj Vernaux(File* file, typename File::Location loc) 2115*a9fa9459Szrj : p_(reinterpret_cast<const internal::Vernaux_data*>( 2116*a9fa9459Szrj file->view(loc.file_offset, loc.data_size).data())) 2117*a9fa9459Szrj { } 2118*a9fa9459Szrj 2119*a9fa9459Szrj Elf_Word 2120*a9fa9459Szrj get_vna_hash() const 2121*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vna_hash); } 2122*a9fa9459Szrj 2123*a9fa9459Szrj Elf_Half 2124*a9fa9459Szrj get_vna_flags() const 2125*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vna_flags); } 2126*a9fa9459Szrj 2127*a9fa9459Szrj Elf_Half 2128*a9fa9459Szrj get_vna_other() const 2129*a9fa9459Szrj { return Convert<16, big_endian>::convert_host(this->p_->vna_other); } 2130*a9fa9459Szrj 2131*a9fa9459Szrj Elf_Word 2132*a9fa9459Szrj get_vna_name() const 2133*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vna_name); } 2134*a9fa9459Szrj 2135*a9fa9459Szrj Elf_Word 2136*a9fa9459Szrj get_vna_next() const 2137*a9fa9459Szrj { return Convert<32, big_endian>::convert_host(this->p_->vna_next); } 2138*a9fa9459Szrj 2139*a9fa9459Szrj private: 2140*a9fa9459Szrj const internal::Vernaux_data* p_; 2141*a9fa9459Szrj }; 2142*a9fa9459Szrj 2143*a9fa9459Szrj template<int size, bool big_endian> 2144*a9fa9459Szrj class Vernaux_write 2145*a9fa9459Szrj { 2146*a9fa9459Szrj public: 2147*a9fa9459Szrj Vernaux_write(unsigned char* p) 2148*a9fa9459Szrj : p_(reinterpret_cast<internal::Vernaux_data*>(p)) 2149*a9fa9459Szrj { } 2150*a9fa9459Szrj 2151*a9fa9459Szrj void 2152*a9fa9459Szrj set_vna_hash(Elf_Word v) 2153*a9fa9459Szrj { this->p_->vna_hash = Convert<32, big_endian>::convert_host(v); } 2154*a9fa9459Szrj 2155*a9fa9459Szrj void 2156*a9fa9459Szrj set_vna_flags(Elf_Half v) 2157*a9fa9459Szrj { this->p_->vna_flags = Convert<16, big_endian>::convert_host(v); } 2158*a9fa9459Szrj 2159*a9fa9459Szrj void 2160*a9fa9459Szrj set_vna_other(Elf_Half v) 2161*a9fa9459Szrj { this->p_->vna_other = Convert<16, big_endian>::convert_host(v); } 2162*a9fa9459Szrj 2163*a9fa9459Szrj void 2164*a9fa9459Szrj set_vna_name(Elf_Word v) 2165*a9fa9459Szrj { this->p_->vna_name = Convert<32, big_endian>::convert_host(v); } 2166*a9fa9459Szrj 2167*a9fa9459Szrj void 2168*a9fa9459Szrj set_vna_next(Elf_Word v) 2169*a9fa9459Szrj { this->p_->vna_next = Convert<32, big_endian>::convert_host(v); } 2170*a9fa9459Szrj 2171*a9fa9459Szrj private: 2172*a9fa9459Szrj internal::Vernaux_data* p_; 2173*a9fa9459Szrj }; 2174*a9fa9459Szrj 2175*a9fa9459Szrj } // End namespace elfcpp. 2176*a9fa9459Szrj 2177*a9fa9459Szrj #endif // !defined(ELFPCP_H) 2178