1 /* Abstract description of component ELF types.
2 Copyright (C) 1998, 1999, 2000, 2002, 2004, 2007 Red Hat, Inc.
3 This file is part of elfutils.
4 Written by Ulrich Drepper <drepper@redhat.com>, 1998.
6 This file is free software; you can redistribute it and/or modify
7 it under the terms of either
9 * 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
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
19 or both in parallel, as here.
21 elfutils is distributed in the hope that it will be useful, but
22 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.
26 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/>. */
31 #define Ehdr(Bits, Ext) \
32 START (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) \
58 START (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) \
69 START (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) \
83 START (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) \
96 START (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) \
112 START (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) \
123 START (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) \
137 START (32, Rel, Ext##Rel) \
138 TYPE_NAME (ElfW2(32, Ext##Addr), r_offset) \
139 TYPE_NAME (ElfW2(32, Ext##Word), r_info) \
142 START (64, Rel, Ext##Rel) \
143 TYPE_NAME (ElfW2(64, Ext##Addr), r_offset) \
144 TYPE_NAME (ElfW2(64, Ext##Xword), r_info) \
147 #define Rela32(Ext) \
148 START (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) \
153 #define Rela64(Ext) \
154 START (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) \
161 /* Note entry header. */
162 #define Note(Bits, Ext) \
163 START (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) \
167 END (Bits, Ext##Nhdr)
169 #define Note32(Ext) \
171 #define Note64(Ext) \
175 /* Dynamic section data. */
177 START (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;) \
187 START (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;) \
197 #ifndef GENERATE_CONVERSION
198 /* Version definitions. */
199 # define Verdef(Bits, Ext) \
200 START (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) \
208 END (Bits, Ext##Verdef)
210 # define Verdef32(Ext) \
212 # define Verdef64(Ext) \
215 # define Verdaux(Bits, Ext) \
216 START (Bits, Verdaux, Ext##Verdaux) \
217 TYPE_NAME (ElfW2(Bits, Ext##Word), vda_name) \
218 TYPE_NAME (ElfW2(Bits, Ext##Word), vda_next) \
219 END (Bits, Ext##Verdaux)
221 # define Verdaux32(Ext) \
223 # define Verdaux64(Ext) \
226 /* Required versions. */
227 # define Verneed(Bits, Ext) \
228 START (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) \
234 END (Bits, Ext##Verneed)
236 # define Verneed32(Ext) \
238 # define Verneed64(Ext) \
241 # define Vernaux(Bits, Ext) \
242 START (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) \
248 END (Bits, Ext##Vernaux)
250 # define Vernaux32(Ext) \
252 # define Vernaux64(Ext) \
256 /* Symbol information. */
257 #define Syminfo(Bits, Ext) \
258 START (Bits, Syminfo, Ext##Syminfo) \
259 TYPE_NAME (ElfW2(Bits, Ext##Half), si_boundto) \
260 TYPE_NAME (ElfW2(Bits, Ext##Half), si_flags) \
261 END (Bits, Ext##Syminfo)
263 #define Syminfo32(Ext) \
265 #define Syminfo64(Ext) \
268 /* Move information. */
269 #define Move(Bits, Ext) \
270 START (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) \
276 END (Bits, Ext##Move)
278 #define Move32(Ext) \
280 #define Move64(Ext) \
283 #define Lib(Bits, Ext) \
284 START (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) \
297 #define auxv_t32(Ext) \
298 START (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;) \
304 END (32, Ext##auxv_t)
305 #define auxv_t64(Ext) \
306 START (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;) \
312 END (64, Ext##auxv_t)