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