blob: 53713eec78e06fc3c227894fd14228d58f6f2948 [file] [log] [blame]
Ben Cheng25b3c042013-11-20 14:45:36 -08001/* Abstract description of component ELF types.
2 Copyright (C) 1998, 1999, 2000, 2002, 2004, 2007 Red Hat, Inc.
Elliott Hughes03333822015-02-18 22:19:45 -08003 This file is part of elfutils.
Ben Cheng25b3c042013-11-20 14:45:36 -08004 Written by Ulrich Drepper <drepper@redhat.com>, 1998.
5
Elliott Hughes03333822015-02-18 22:19:45 -08006 This file is free software; you can redistribute it and/or modify
7 it under the terms of either
Ben Cheng25b3c042013-11-20 14:45:36 -08008
Elliott Hughes03333822015-02-18 22:19:45 -08009 * the GNU Lesser General Public License as published by the Free
10 Software Foundation; either version 3 of the License, or (at
11 your option) any later version
12
13 or
14
15 * the GNU General Public License as published by the Free
16 Software Foundation; either version 2 of the License, or (at
17 your option) any later version
18
19 or both in parallel, as here.
20
21 elfutils is distributed in the hope that it will be useful, but
Ben Cheng25b3c042013-11-20 14:45:36 -080022 WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 General Public License for more details.
25
Elliott Hughes03333822015-02-18 22:19:45 -080026 You should have received copies of the GNU General Public License and
27 the GNU Lesser General Public License along with this program. If
28 not, see <http://www.gnu.org/licenses/>. */
Ben Cheng25b3c042013-11-20 14:45:36 -080029
30/* ELF header. */
31#define Ehdr(Bits, Ext) \
32START (Bits, Ehdr, Ext##Ehdr) \
33 TYPE_EXTRA (unsigned char e_ident[EI_NIDENT];) \
34 TYPE_XLATE (memmove (tdest->e_ident, tsrc->e_ident, EI_NIDENT);) \
35 TYPE_NAME (ElfW2(Bits, Ext##Half), e_type) \
36 TYPE_NAME (ElfW2(Bits, Ext##Half), e_machine) \
37 TYPE_NAME (ElfW2(Bits, Ext##Word), e_version) \
38 TYPE_NAME (ElfW2(Bits, Ext##Addr), e_entry) \
39 TYPE_NAME (ElfW2(Bits, Ext##Off), e_phoff) \
40 TYPE_NAME (ElfW2(Bits, Ext##Off), e_shoff) \
41 TYPE_NAME (ElfW2(Bits, Ext##Word), e_flags) \
42 TYPE_NAME (ElfW2(Bits, Ext##Half), e_ehsize) \
43 TYPE_NAME (ElfW2(Bits, Ext##Half), e_phentsize) \
44 TYPE_NAME (ElfW2(Bits, Ext##Half), e_phnum) \
45 TYPE_NAME (ElfW2(Bits, Ext##Half), e_shentsize) \
46 TYPE_NAME (ElfW2(Bits, Ext##Half), e_shnum) \
47 TYPE_NAME (ElfW2(Bits, Ext##Half), e_shstrndx) \
48END (Bits, Ext##Ehdr)
49
50#define Ehdr32(Ext) \
51 Ehdr(32, Ext)
52#define Ehdr64(Ext) \
53 Ehdr(64, Ext)
54
55
56/* Program header. */
57#define Phdr32(Ext) \
58START (32, Phdr, Ext##Phdr) \
59 TYPE_NAME (ElfW2(32, Ext##Word), p_type) \
60 TYPE_NAME (ElfW2(32, Ext##Off), p_offset) \
61 TYPE_NAME (ElfW2(32, Ext##Addr), p_vaddr) \
62 TYPE_NAME (ElfW2(32, Ext##Addr), p_paddr) \
63 TYPE_NAME (ElfW2(32, Ext##Word), p_filesz) \
64 TYPE_NAME (ElfW2(32, Ext##Word), p_memsz) \
65 TYPE_NAME (ElfW2(32, Ext##Word), p_flags) \
66 TYPE_NAME (ElfW2(32, Ext##Word), p_align) \
67END (32, Ext##Phdr)
68#define Phdr64(Ext) \
69START (64, Phdr, Ext##Phdr) \
70 TYPE_NAME (ElfW2(64, Ext##Word), p_type) \
71 TYPE_NAME (ElfW2(64, Ext##Word), p_flags) \
72 TYPE_NAME (ElfW2(64, Ext##Off), p_offset) \
73 TYPE_NAME (ElfW2(64, Ext##Addr), p_vaddr) \
74 TYPE_NAME (ElfW2(64, Ext##Addr), p_paddr) \
75 TYPE_NAME (ElfW2(64, Ext##Xword), p_filesz) \
76 TYPE_NAME (ElfW2(64, Ext##Xword), p_memsz) \
77 TYPE_NAME (ElfW2(64, Ext##Xword), p_align) \
78END (64, Ext##Phdr)
79
80
81/* Section header. */
82#define Shdr32(Ext) \
83START (32, Shdr, Ext##Shdr) \
84 TYPE_NAME (ElfW2(32, Ext##Word), sh_name) \
85 TYPE_NAME (ElfW2(32, Ext##Word), sh_type) \
86 TYPE_NAME (ElfW2(32, Ext##Word), sh_flags) \
87 TYPE_NAME (ElfW2(32, Ext##Addr), sh_addr) \
88 TYPE_NAME (ElfW2(32, Ext##Off), sh_offset) \
89 TYPE_NAME (ElfW2(32, Ext##Word), sh_size) \
90 TYPE_NAME (ElfW2(32, Ext##Word), sh_link) \
91 TYPE_NAME (ElfW2(32, Ext##Word), sh_info) \
92 TYPE_NAME (ElfW2(32, Ext##Word), sh_addralign) \
93 TYPE_NAME (ElfW2(32, Ext##Word), sh_entsize) \
94END (32, Ext##Shdr)
95#define Shdr64(Ext) \
96START (64, Shdr, Ext##Shdr) \
97 TYPE_NAME (ElfW2(64, Ext##Word), sh_name) \
98 TYPE_NAME (ElfW2(64, Ext##Word), sh_type) \
99 TYPE_NAME (ElfW2(64, Ext##Xword), sh_flags) \
100 TYPE_NAME (ElfW2(64, Ext##Addr), sh_addr) \
101 TYPE_NAME (ElfW2(64, Ext##Off), sh_offset) \
102 TYPE_NAME (ElfW2(64, Ext##Xword), sh_size) \
103 TYPE_NAME (ElfW2(64, Ext##Word), sh_link) \
104 TYPE_NAME (ElfW2(64, Ext##Word), sh_info) \
105 TYPE_NAME (ElfW2(64, Ext##Xword), sh_addralign) \
106 TYPE_NAME (ElfW2(64, Ext##Xword), sh_entsize) \
107END (64, Ext##Shdr)
108
109
110/* Symbol table. */
111#define Sym32(Ext) \
112START (32, Sym, Ext##Sym) \
113 TYPE_NAME (ElfW2(32, Ext##Word), st_name) \
114 TYPE_NAME (ElfW2(32, Ext##Addr), st_value) \
115 TYPE_NAME (ElfW2(32, Ext##Word), st_size) \
116 TYPE_EXTRA (unsigned char st_info;) \
117 TYPE_XLATE (tdest->st_info = tsrc->st_info;) \
118 TYPE_EXTRA (unsigned char st_other;) \
119 TYPE_XLATE (tdest->st_other = tsrc->st_other;) \
120 TYPE_NAME (ElfW2(32, Ext##Half), st_shndx) \
121END (32, Ext##Sym)
122#define Sym64(Ext) \
123START (64, Sym, Ext##Sym) \
124 TYPE_NAME (ElfW2(64, Ext##Word), st_name) \
125 TYPE_EXTRA (unsigned char st_info;) \
126 TYPE_XLATE (tdest->st_info = tsrc->st_info;) \
127 TYPE_EXTRA (unsigned char st_other;) \
128 TYPE_XLATE (tdest->st_other = tsrc->st_other;) \
129 TYPE_NAME (ElfW2(64, Ext##Half), st_shndx) \
130 TYPE_NAME (ElfW2(64, Ext##Addr), st_value) \
131 TYPE_NAME (ElfW2(64, Ext##Xword), st_size) \
132END (64, Ext##Sym)
133
134
135/* Relocation. */
136#define Rel32(Ext) \
137START (32, Rel, Ext##Rel) \
138 TYPE_NAME (ElfW2(32, Ext##Addr), r_offset) \
139 TYPE_NAME (ElfW2(32, Ext##Word), r_info) \
140END (32, Ext##Rel)
141#define Rel64(Ext) \
142START (64, Rel, Ext##Rel) \
143 TYPE_NAME (ElfW2(64, Ext##Addr), r_offset) \
144 TYPE_NAME (ElfW2(64, Ext##Xword), r_info) \
145END (64, Ext##Rel)
146
147#define Rela32(Ext) \
148START (32, Rela, Ext##Rela) \
149 TYPE_NAME (ElfW2(32, Ext##Addr), r_offset) \
150 TYPE_NAME (ElfW2(32, Ext##Word), r_info) \
151 TYPE_NAME (ElfW2(32, Ext##Sword), r_addend) \
152END (32, Ext##Rela)
153#define Rela64(Ext) \
154START (64, Rela, Ext##Rela) \
155 TYPE_NAME (ElfW2(64, Ext##Addr), r_offset) \
156 TYPE_NAME (ElfW2(64, Ext##Xword), r_info) \
157 TYPE_NAME (ElfW2(64, Ext##Sxword), r_addend) \
158END (64, Ext##Rela)
159
160
161/* Note entry header. */
162#define Note(Bits, Ext) \
163START (Bits, Nhdr, Ext##Nhdr) \
164 TYPE_NAME (ElfW2(Bits, Ext##Word), n_namesz) \
165 TYPE_NAME (ElfW2(Bits, Ext##Word), n_descsz) \
166 TYPE_NAME (ElfW2(Bits, Ext##Word), n_type) \
167END (Bits, Ext##Nhdr)
168
169#define Note32(Ext) \
170 Note (32, Ext)
171#define Note64(Ext) \
172 Note (64, Ext)
173
174
175/* Dynamic section data. */
176#define Dyn32(Ext) \
177START (32, Dyn, Ext##Dyn) \
178 TYPE_NAME (ElfW2(32, Ext##Sword), d_tag) \
179 TYPE_EXTRA (union {) \
180 TYPE_EXTRA (ElfW2(32, Ext##Word) d_val;) \
181 TYPE_EXTRA (ElfW2(32, Ext##Addr) d_ptr;) \
182 TYPE_XLATE (Elf32_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);) \
183 TYPE_EXTRA (ElfW2(32, Ext##Off) d_off;) \
184 TYPE_EXTRA (} d_un;) \
185END (32, Ext##Dyn)
186#define Dyn64(Ext) \
187START (64, Dyn, Ext##Dyn) \
188 TYPE_NAME (ElfW2(64, Ext##Xword), d_tag) \
189 TYPE_EXTRA (union {) \
190 TYPE_EXTRA (ElfW2(64, Ext##Xword) d_val;) \
191 TYPE_EXTRA (ElfW2(64, Ext##Addr) d_ptr;) \
192 TYPE_XLATE (Elf64_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);) \
193 TYPE_EXTRA (} d_un;) \
194END (64, Ext##Dyn)
195
196
197#ifndef GENERATE_CONVERSION
198/* Version definitions. */
199# define Verdef(Bits, Ext) \
200START (Bits, Verdef, Ext##Verdef) \
201 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_version) \
202 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_flags) \
203 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_ndx) \
204 TYPE_NAME (ElfW2(Bits, Ext##Half), vd_cnt) \
205 TYPE_NAME (ElfW2(Bits, Ext##Word), vd_hash) \
206 TYPE_NAME (ElfW2(Bits, Ext##Word), vd_aux) \
207 TYPE_NAME (ElfW2(Bits, Ext##Word), vd_next) \
208END (Bits, Ext##Verdef)
209
210# define Verdef32(Ext) \
211 Verdef (32, Ext)
212# define Verdef64(Ext) \
213 Verdef (64, Ext)
214
215# define Verdaux(Bits, Ext) \
216START (Bits, Verdaux, Ext##Verdaux) \
217 TYPE_NAME (ElfW2(Bits, Ext##Word), vda_name) \
218 TYPE_NAME (ElfW2(Bits, Ext##Word), vda_next) \
219END (Bits, Ext##Verdaux)
220
221# define Verdaux32(Ext) \
222 Verdaux (32, Ext)
223# define Verdaux64(Ext) \
224 Verdaux (64, Ext)
225
226/* Required versions. */
227# define Verneed(Bits, Ext) \
228START (Bits, Verneed, Ext##Verneed) \
229 TYPE_NAME (ElfW2(Bits, Ext##Half), vn_version) \
230 TYPE_NAME (ElfW2(Bits, Ext##Half), vn_cnt) \
231 TYPE_NAME (ElfW2(Bits, Ext##Word), vn_file) \
232 TYPE_NAME (ElfW2(Bits, Ext##Word), vn_aux) \
233 TYPE_NAME (ElfW2(Bits, Ext##Word), vn_next) \
234END (Bits, Ext##Verneed)
235
236# define Verneed32(Ext) \
237 Verneed (32, Ext)
238# define Verneed64(Ext) \
239 Verneed (64, Ext)
240
241# define Vernaux(Bits, Ext) \
242START (Bits, Vernaux, Ext##Vernaux) \
243 TYPE_NAME (ElfW2(Bits, Ext##Word), vna_hash) \
244 TYPE_NAME (ElfW2(Bits, Ext##Half), vna_flags) \
245 TYPE_NAME (ElfW2(Bits, Ext##Half), vna_other) \
246 TYPE_NAME (ElfW2(Bits, Ext##Word), vna_name) \
247 TYPE_NAME (ElfW2(Bits, Ext##Word), vna_next) \
248END (Bits, Ext##Vernaux)
249
250# define Vernaux32(Ext) \
251 Vernaux (32, Ext)
252# define Vernaux64(Ext) \
253 Vernaux (64, Ext)
254#endif
255
256/* Symbol information. */
257#define Syminfo(Bits, Ext) \
258START (Bits, Syminfo, Ext##Syminfo) \
259 TYPE_NAME (ElfW2(Bits, Ext##Half), si_boundto) \
260 TYPE_NAME (ElfW2(Bits, Ext##Half), si_flags) \
261END (Bits, Ext##Syminfo)
262
263#define Syminfo32(Ext) \
264 Syminfo (32, Ext)
265#define Syminfo64(Ext) \
266 Syminfo (64, Ext)
267
268/* Move information. */
269#define Move(Bits, Ext) \
270START (Bits, Move, Ext##Move) \
271 TYPE_NAME (ElfW2(Bits, Ext##Xword), m_value) \
272 TYPE_NAME (ElfW2(Bits, Ext##Xword), m_info) \
273 TYPE_NAME (ElfW2(Bits, Ext##Xword), m_poffset) \
274 TYPE_NAME (ElfW2(Bits, Ext##Half), m_repeat) \
275 TYPE_NAME (ElfW2(Bits, Ext##Half), m_stride) \
276END (Bits, Ext##Move)
277
278#define Move32(Ext) \
279 Move (32, Ext)
280#define Move64(Ext) \
281 Move (64, Ext)
282
283#define Lib(Bits, Ext) \
284START (Bits, Lib, Ext##Lib) \
285 TYPE_NAME (ElfW2(Bits, Ext##Word), l_name) \
286 TYPE_NAME (ElfW2(Bits, Ext##Word), l_time_stamp) \
287 TYPE_NAME (ElfW2(Bits, Ext##Word), l_checksum) \
288 TYPE_NAME (ElfW2(Bits, Ext##Word), l_version) \
289 TYPE_NAME (ElfW2(Bits, Ext##Word), l_flags) \
290END (Bits, Ext##Lib)
291
292#define Lib32(Ext) \
293 Lib (32, Ext)
294#define Lib64(Ext) \
295 Lib (64, Ext)
296
297#define auxv_t32(Ext) \
298START (32, auxv_t, Ext##auxv_t) \
299 TYPE_NAME (ElfW2(32, Ext##Word), a_type) \
300 TYPE_EXTRA (union {) \
301 TYPE_EXTRA (ElfW2(32, Ext##Word) a_val;) \
302 TYPE_XLATE (Elf32_cvt_Addr1 (&tdest->a_un.a_val, &tsrc->a_un.a_val);) \
303 TYPE_EXTRA (} a_un;) \
304END (32, Ext##auxv_t)
305#define auxv_t64(Ext) \
306START (64, auxv_t, Ext##auxv_t) \
307 TYPE_NAME (ElfW2(64, Ext##Xword), a_type) \
308 TYPE_EXTRA (union {) \
309 TYPE_EXTRA (ElfW2(64, Ext##Xword) a_val;) \
310 TYPE_XLATE (Elf64_cvt_Addr1 (&tdest->a_un.a_val, &tsrc->a_un.a_val);) \
311 TYPE_EXTRA (} a_un;) \
312END (64, Ext##auxv_t)