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