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