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