xref: /dflybsd-src/contrib/binutils-2.34/elfcpp/elfcpp_internal.h (revision b52ef7118d1621abed722c5bbbd542210290ecef)
1*fae548d3Szrj // elfcpp_internal.h -- internals for elfcpp   -*- C++ -*-
2*fae548d3Szrj 
3*fae548d3Szrj // Copyright (C) 2006-2020 Free Software Foundation, Inc.
4*fae548d3Szrj // Written by Ian Lance Taylor <iant@google.com>.
5*fae548d3Szrj 
6*fae548d3Szrj // This file is part of elfcpp.
7*fae548d3Szrj 
8*fae548d3Szrj // This program is free software; you can redistribute it and/or
9*fae548d3Szrj // modify it under the terms of the GNU Library General Public License
10*fae548d3Szrj // as published by the Free Software Foundation; either version 2, or
11*fae548d3Szrj // (at your option) any later version.
12*fae548d3Szrj 
13*fae548d3Szrj // In addition to the permissions in the GNU Library General Public
14*fae548d3Szrj // License, the Free Software Foundation gives you unlimited
15*fae548d3Szrj // permission to link the compiled version of this file into
16*fae548d3Szrj // combinations with other programs, and to distribute those
17*fae548d3Szrj // combinations without any restriction coming from the use of this
18*fae548d3Szrj // file.  (The Library Public License restrictions do apply in other
19*fae548d3Szrj // respects; for example, they cover modification of the file, and
20*fae548d3Szrj /// distribution when not linked into a combined executable.)
21*fae548d3Szrj 
22*fae548d3Szrj // This program is distributed in the hope that it will be useful, but
23*fae548d3Szrj // WITHOUT ANY WARRANTY; without even the implied warranty of
24*fae548d3Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25*fae548d3Szrj // Library General Public License for more details.
26*fae548d3Szrj 
27*fae548d3Szrj // You should have received a copy of the GNU Library General Public
28*fae548d3Szrj // License along with this program; if not, write to the Free Software
29*fae548d3Szrj // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
30*fae548d3Szrj // 02110-1301, USA.
31*fae548d3Szrj 
32*fae548d3Szrj // This is included by elfcpp.h, the external interface, but holds
33*fae548d3Szrj // information which we want to keep private.
34*fae548d3Szrj 
35*fae548d3Szrj #ifndef ELFCPP_INTERNAL_H
36*fae548d3Szrj #define ELFCPP_INTERNAL_H
37*fae548d3Szrj 
38*fae548d3Szrj namespace elfcpp
39*fae548d3Szrj {
40*fae548d3Szrj 
41*fae548d3Szrj namespace internal
42*fae548d3Szrj {
43*fae548d3Szrj 
44*fae548d3Szrj // The ELF file header.
45*fae548d3Szrj 
46*fae548d3Szrj template<int size>
47*fae548d3Szrj struct Ehdr_data
48*fae548d3Szrj {
49*fae548d3Szrj   unsigned char e_ident[EI_NIDENT];
50*fae548d3Szrj   Elf_Half e_type;
51*fae548d3Szrj   Elf_Half e_machine;
52*fae548d3Szrj   Elf_Word e_version;
53*fae548d3Szrj   typename Elf_types<size>::Elf_Addr e_entry;
54*fae548d3Szrj   typename Elf_types<size>::Elf_Off e_phoff;
55*fae548d3Szrj   typename Elf_types<size>::Elf_Off e_shoff;
56*fae548d3Szrj   Elf_Word e_flags;
57*fae548d3Szrj   Elf_Half e_ehsize;
58*fae548d3Szrj   Elf_Half e_phentsize;
59*fae548d3Szrj   Elf_Half e_phnum;
60*fae548d3Szrj   Elf_Half e_shentsize;
61*fae548d3Szrj   Elf_Half e_shnum;
62*fae548d3Szrj   Elf_Half e_shstrndx;
63*fae548d3Szrj };
64*fae548d3Szrj 
65*fae548d3Szrj // An ELF section header.
66*fae548d3Szrj 
67*fae548d3Szrj template<int size>
68*fae548d3Szrj struct Shdr_data
69*fae548d3Szrj {
70*fae548d3Szrj   Elf_Word sh_name;
71*fae548d3Szrj   Elf_Word sh_type;
72*fae548d3Szrj   typename Elf_types<size>::Elf_WXword sh_flags;
73*fae548d3Szrj   typename Elf_types<size>::Elf_Addr sh_addr;
74*fae548d3Szrj   typename Elf_types<size>::Elf_Off sh_offset;
75*fae548d3Szrj   typename Elf_types<size>::Elf_WXword sh_size;
76*fae548d3Szrj   Elf_Word sh_link;
77*fae548d3Szrj   Elf_Word sh_info;
78*fae548d3Szrj   typename Elf_types<size>::Elf_WXword sh_addralign;
79*fae548d3Szrj   typename Elf_types<size>::Elf_WXword sh_entsize;
80*fae548d3Szrj };
81*fae548d3Szrj 
82*fae548d3Szrj // An ELF compression header.
83*fae548d3Szrj 
84*fae548d3Szrj template<int size>
85*fae548d3Szrj struct Chdr_data;
86*fae548d3Szrj 
87*fae548d3Szrj template<>
88*fae548d3Szrj struct Chdr_data<32>
89*fae548d3Szrj {
90*fae548d3Szrj   Elf_Word ch_type;
91*fae548d3Szrj   Elf_Word ch_size;
92*fae548d3Szrj   Elf_Word ch_addralign;
93*fae548d3Szrj };
94*fae548d3Szrj 
95*fae548d3Szrj template<>
96*fae548d3Szrj struct Chdr_data<64>
97*fae548d3Szrj {
98*fae548d3Szrj   Elf_Word ch_type;
99*fae548d3Szrj   Elf_Word ch_reserved;
100*fae548d3Szrj   Elf_Xword ch_size;
101*fae548d3Szrj   Elf_Xword ch_addralign;
102*fae548d3Szrj };
103*fae548d3Szrj 
104*fae548d3Szrj // An ELF segment header.  We use template specialization for the
105*fae548d3Szrj // 32-bit and 64-bit versions because the fields are in a different
106*fae548d3Szrj // order.
107*fae548d3Szrj 
108*fae548d3Szrj template<int size>
109*fae548d3Szrj struct Phdr_data;
110*fae548d3Szrj 
111*fae548d3Szrj template<>
112*fae548d3Szrj struct Phdr_data<32>
113*fae548d3Szrj {
114*fae548d3Szrj   Elf_Word p_type;
115*fae548d3Szrj   Elf_types<32>::Elf_Off p_offset;
116*fae548d3Szrj   Elf_types<32>::Elf_Addr p_vaddr;
117*fae548d3Szrj   Elf_types<32>::Elf_Addr p_paddr;
118*fae548d3Szrj   Elf_Word p_filesz;
119*fae548d3Szrj   Elf_Word p_memsz;
120*fae548d3Szrj   Elf_Word p_flags;
121*fae548d3Szrj   Elf_Word p_align;
122*fae548d3Szrj };
123*fae548d3Szrj 
124*fae548d3Szrj template<>
125*fae548d3Szrj struct Phdr_data<64>
126*fae548d3Szrj {
127*fae548d3Szrj   Elf_Word p_type;
128*fae548d3Szrj   Elf_Word p_flags;
129*fae548d3Szrj   Elf_types<64>::Elf_Off p_offset;
130*fae548d3Szrj   Elf_types<64>::Elf_Addr p_vaddr;
131*fae548d3Szrj   Elf_types<64>::Elf_Addr p_paddr;
132*fae548d3Szrj   Elf_Xword p_filesz;
133*fae548d3Szrj   Elf_Xword p_memsz;
134*fae548d3Szrj   Elf_Xword p_align;
135*fae548d3Szrj };
136*fae548d3Szrj 
137*fae548d3Szrj // An ELF symbol table entry.  We use template specialization for the
138*fae548d3Szrj // 32-bit and 64-bit versions because the fields are in a different
139*fae548d3Szrj // order.
140*fae548d3Szrj 
141*fae548d3Szrj template<int size>
142*fae548d3Szrj struct Sym_data;
143*fae548d3Szrj 
144*fae548d3Szrj template<>
145*fae548d3Szrj struct Sym_data<32>
146*fae548d3Szrj {
147*fae548d3Szrj   Elf_Word st_name;
148*fae548d3Szrj   Elf_types<32>::Elf_Addr st_value;
149*fae548d3Szrj   Elf_Word st_size;
150*fae548d3Szrj   unsigned char st_info;
151*fae548d3Szrj   unsigned char st_other;
152*fae548d3Szrj   Elf_Half st_shndx;
153*fae548d3Szrj };
154*fae548d3Szrj 
155*fae548d3Szrj template<>
156*fae548d3Szrj struct Sym_data<64>
157*fae548d3Szrj {
158*fae548d3Szrj   Elf_Word st_name;
159*fae548d3Szrj   unsigned char st_info;
160*fae548d3Szrj   unsigned char st_other;
161*fae548d3Szrj   Elf_Half st_shndx;
162*fae548d3Szrj   Elf_types<64>::Elf_Addr st_value;
163*fae548d3Szrj   Elf_Xword st_size;
164*fae548d3Szrj };
165*fae548d3Szrj 
166*fae548d3Szrj // ELF relocation table entries.
167*fae548d3Szrj 
168*fae548d3Szrj template<int size>
169*fae548d3Szrj struct Rel_data
170*fae548d3Szrj {
171*fae548d3Szrj   typename Elf_types<size>::Elf_Addr r_offset;
172*fae548d3Szrj   typename Elf_types<size>::Elf_WXword r_info;
173*fae548d3Szrj };
174*fae548d3Szrj 
175*fae548d3Szrj template<int size>
176*fae548d3Szrj struct Rela_data
177*fae548d3Szrj {
178*fae548d3Szrj   typename Elf_types<size>::Elf_Addr r_offset;
179*fae548d3Szrj   typename Elf_types<size>::Elf_WXword r_info;
180*fae548d3Szrj   typename Elf_types<size>::Elf_Swxword r_addend;
181*fae548d3Szrj };
182*fae548d3Szrj 
183*fae548d3Szrj // MIPS-64 has a non-standard layout for relocations.
184*fae548d3Szrj 
185*fae548d3Szrj struct Mips64_rel_data
186*fae548d3Szrj {
187*fae548d3Szrj   Elf_types<64>::Elf_Addr r_offset;
188*fae548d3Szrj   Elf_Word r_sym;
189*fae548d3Szrj   unsigned char r_ssym;
190*fae548d3Szrj   unsigned char r_type3;
191*fae548d3Szrj   unsigned char r_type2;
192*fae548d3Szrj   unsigned char r_type;
193*fae548d3Szrj };
194*fae548d3Szrj 
195*fae548d3Szrj struct Mips64_rela_data
196*fae548d3Szrj {
197*fae548d3Szrj   Elf_types<64>::Elf_Addr r_offset;
198*fae548d3Szrj   Elf_Word r_sym;
199*fae548d3Szrj   unsigned char r_ssym;
200*fae548d3Szrj   unsigned char r_type3;
201*fae548d3Szrj   unsigned char r_type2;
202*fae548d3Szrj   unsigned char r_type;
203*fae548d3Szrj   Elf_types<64>::Elf_Swxword r_addend;
204*fae548d3Szrj };
205*fae548d3Szrj 
206*fae548d3Szrj // An entry in the ELF SHT_DYNAMIC section aka PT_DYNAMIC segment.
207*fae548d3Szrj 
208*fae548d3Szrj template<int size>
209*fae548d3Szrj struct Dyn_data
210*fae548d3Szrj {
211*fae548d3Szrj   typename Elf_types<size>::Elf_Swxword d_tag;
212*fae548d3Szrj   typename Elf_types<size>::Elf_WXword d_val;
213*fae548d3Szrj };
214*fae548d3Szrj 
215*fae548d3Szrj // An entry in a SHT_GNU_verdef section.  This structure is the same
216*fae548d3Szrj // in 32-bit and 64-bit ELF files.
217*fae548d3Szrj 
218*fae548d3Szrj struct Verdef_data
219*fae548d3Szrj {
220*fae548d3Szrj   // Version number of structure (VER_DEF_*).
221*fae548d3Szrj   Elf_Half vd_version;
222*fae548d3Szrj   // Bit flags (VER_FLG_*).
223*fae548d3Szrj   Elf_Half vd_flags;
224*fae548d3Szrj   // Version index.
225*fae548d3Szrj   Elf_Half vd_ndx;
226*fae548d3Szrj   // Number of auxiliary Verdaux entries.
227*fae548d3Szrj   Elf_Half vd_cnt;
228*fae548d3Szrj   // Hash of name.
229*fae548d3Szrj   Elf_Word vd_hash;
230*fae548d3Szrj   // Byte offset to first Verdaux entry.
231*fae548d3Szrj   Elf_Word vd_aux;
232*fae548d3Szrj   // Byte offset to next Verdef entry.
233*fae548d3Szrj   Elf_Word vd_next;
234*fae548d3Szrj };
235*fae548d3Szrj 
236*fae548d3Szrj // An auxiliary entry in a SHT_GNU_verdef section.  This structure is
237*fae548d3Szrj // the same in 32-bit and 64-bit ELF files.
238*fae548d3Szrj 
239*fae548d3Szrj struct Verdaux_data
240*fae548d3Szrj {
241*fae548d3Szrj   // Offset in string table of version name.
242*fae548d3Szrj   Elf_Word vda_name;
243*fae548d3Szrj   // Byte offset to next Verdaux entry.
244*fae548d3Szrj   Elf_Word vda_next;
245*fae548d3Szrj };
246*fae548d3Szrj 
247*fae548d3Szrj // An entry in a SHT_GNU_verneed section.  This structure is the same
248*fae548d3Szrj // in 32-bit and 64-bit ELF files.
249*fae548d3Szrj 
250*fae548d3Szrj struct Verneed_data
251*fae548d3Szrj {
252*fae548d3Szrj   // Version number of structure (VER_NEED_*).
253*fae548d3Szrj   Elf_Half vn_version;
254*fae548d3Szrj   // Number of auxiliary Vernaux entries.
255*fae548d3Szrj   Elf_Half vn_cnt;
256*fae548d3Szrj   // Offset in string table of library name.
257*fae548d3Szrj   Elf_Word vn_file;
258*fae548d3Szrj   // Byte offset to first Vernaux entry.
259*fae548d3Szrj   Elf_Word vn_aux;
260*fae548d3Szrj   // Byt eoffset to next Verneed entry.
261*fae548d3Szrj   Elf_Word vn_next;
262*fae548d3Szrj };
263*fae548d3Szrj 
264*fae548d3Szrj // An auxiliary entry in a SHT_GNU_verneed section.  This structure is
265*fae548d3Szrj // the same in 32-bit and 64-bit ELF files.
266*fae548d3Szrj 
267*fae548d3Szrj struct Vernaux_data
268*fae548d3Szrj {
269*fae548d3Szrj   // Hash of dependency name.
270*fae548d3Szrj   Elf_Word vna_hash;
271*fae548d3Szrj   // Bit flags (VER_FLG_*).
272*fae548d3Szrj   Elf_Half vna_flags;
273*fae548d3Szrj   // Version index used in SHT_GNU_versym entries.
274*fae548d3Szrj   Elf_Half vna_other;
275*fae548d3Szrj   // Offset in string table of version name.
276*fae548d3Szrj   Elf_Word vna_name;
277*fae548d3Szrj   // Byte offset to next Vernaux entry.
278*fae548d3Szrj   Elf_Word vna_next;
279*fae548d3Szrj };
280*fae548d3Szrj 
281*fae548d3Szrj } // End namespace internal.
282*fae548d3Szrj 
283*fae548d3Szrj } // End namespace elfcpp.
284*fae548d3Szrj 
285*fae548d3Szrj #endif // !defined(ELFCPP_INTERNAL_H)
286