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