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