elf_types.m4 revision 164190
1/*-
2 * Copyright (c) 2006 Joseph Koshy
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/lib/libelf/elf_types.m4 164190 2006-11-11 17:16:35Z jkoshy $
27 */
28
29/*
30 * ELF types, defined in the "enum Elf_Type" API.
31 */
32
33define(`ELF_TYPE_LIST',
34	``ADDR,		Addr',
35	`BYTE,		Byte',
36	`CAP,		Cap',
37	`DYN,		Dyn',
38	`EHDR,		Ehdr',
39	`HALF,		Half',
40	`LWORD,		Lword',
41	`MOVE,		Move',
42	`MOVEP,		MoveP',
43	`NOTE,		Note',
44	`OFF,		Off',
45	`PHDR,		Phdr',
46	`REL,		Rel',
47	`RELA,		Rela',
48	`SHDR,		Shdr',
49	`SWORD,		Sword',
50	`SXWORD,	Sxword',
51	`SYMINFO,	Syminfo',
52	`SYM,		Sym',
53	`VDEF,		Verdef',
54	`VNEED,		Verneed',
55	`WORD,		Word',
56	`XWORD,		Xword',
57	`NUM,		_'')
58
59/*
60 * DEFINE_STRUCT(NAME,MEMBERLIST...)
61 *
62 * Map a type name to its members.
63 *
64 * Each member-list element comprises of pairs of (field name, type),
65 * in the sequence used in the file representation of `NAME'.
66 *
67 * Each member list element comprises a pair containing a field name
68 * and a basic type.  Basic types include IDENT, HALF, WORD, LWORD,
69 * ADDR{32,64}, OFF{32,64}, SWORD, XWORD, SXWORD.
70 *
71 * The last element of a member list is the null element: `_,_'.
72 */
73
74define(`DEFINE_STRUCT',`define(`$1_DEF',shift($@))dnl')
75
76DEFINE_STRUCT(`Elf32_Cap',
77	``c_tag,	WORD',
78	`c_un.c_val,	WORD',
79	`_,_'')
80
81DEFINE_STRUCT(`Elf64_Cap',
82	``c_tag,	XWORD',
83	`c_un.c_val,	XWORD',
84	`_,_'')
85
86DEFINE_STRUCT(`Elf32_Dyn',
87	``d_tag,	SWORD',
88	`d_un.d_ptr,	WORD',
89	`_,_'')
90
91DEFINE_STRUCT(`Elf64_Dyn',
92	``d_tag,	SXWORD',
93	`d_un.d_ptr,	XWORD',
94	`_,_'')
95
96DEFINE_STRUCT(`Elf32_Ehdr',
97	``e_ident,	IDENT',
98	`e_type, 	HALF',
99	`e_machine,	HALF',
100	`e_version,	WORD',
101	`e_entry,	ADDR',
102	`e_phoff,	OFF',
103	`e_shoff,	OFF',
104	`e_flags,	WORD',
105	`e_ehsize,	HALF',
106	`e_phentsize,	HALF',
107	`e_phnum,	HALF',
108	`e_shentsize,	HALF',
109	`e_shnum,	HALF',
110	`e_shstrndx,	HALF',
111	`_,_'')
112
113DEFINE_STRUCT(`Elf64_Ehdr',
114	``e_ident,	IDENT',
115	`e_type, 	HALF',
116	`e_machine,	HALF',
117	`e_version,	WORD',
118	`e_entry,	ADDR',
119	`e_phoff,	OFF',
120	`e_shoff,	OFF',
121	`e_flags,	WORD',
122	`e_ehsize,	HALF',
123	`e_phentsize,	HALF',
124	`e_phnum,	HALF',
125	`e_shentsize,	HALF',
126	`e_shnum,	HALF',
127	`e_shstrndx,	HALF',
128	`_,_'')
129
130DEFINE_STRUCT(`Elf32_Move',
131	``m_value,	LWORD',
132	`m_info,	WORD',
133	`m_poffset,	WORD',
134	`m_repeat,	HALF',
135	`m_stride,	HALF',
136	`_,_'')
137
138DEFINE_STRUCT(`Elf64_Move',
139	``m_value,	LWORD',
140	`m_info,	XWORD',
141	`m_poffset,	XWORD',
142	`m_repeat,	HALF',
143	`m_stride,	HALF',
144	`_,_'')
145
146DEFINE_STRUCT(`Elf32_Phdr',
147	``p_type,	WORD',
148	`p_offset,	OFF',
149	`p_vaddr,	ADDR',
150	`p_paddr,	ADDR',
151	`p_filesz,	WORD',
152	`p_memsz,	WORD',
153	`p_flags,	WORD',
154	`p_align,	WORD',
155	`_,_'')
156
157DEFINE_STRUCT(`Elf64_Phdr',
158	``p_type,	WORD',
159	`p_flags,	WORD',
160	`p_offset,	OFF',
161	`p_vaddr,	ADDR',
162	`p_paddr,	ADDR',
163	`p_filesz,	XWORD',
164	`p_memsz,	XWORD',
165	`p_align,	XWORD',
166	`_,_'')
167
168DEFINE_STRUCT(`Elf32_Rel',
169	``r_offset,	ADDR',
170	`r_info,	WORD',
171	`_,_'')
172
173DEFINE_STRUCT(`Elf64_Rel',
174	``r_offset,	ADDR',
175	`r_info,	XWORD',
176	`_,_'')
177
178DEFINE_STRUCT(`Elf32_Rela',
179	``r_offset,	ADDR',
180	`r_info,	WORD',
181	`r_addend,	SWORD',
182	`_,_'')
183
184DEFINE_STRUCT(`Elf64_Rela',
185	``r_offset,	ADDR',
186	`r_info,	XWORD',
187	`r_addend,	SXWORD',
188	`_,_'')
189
190DEFINE_STRUCT(`Elf32_Shdr',
191	``sh_name,	WORD',
192	`sh_type,	WORD',
193	`sh_flags,	WORD',
194	`sh_addr,	ADDR',
195	`sh_offset,	OFF',
196	`sh_size,	WORD',
197	`sh_link,	WORD',
198	`sh_info,	WORD',
199	`sh_addralign,	WORD',
200	`sh_entsize,	WORD',
201	`_,_'')
202
203DEFINE_STRUCT(`Elf64_Shdr',
204	``sh_name,	WORD',
205	`sh_type,	WORD',
206	`sh_flags,	XWORD',
207	`sh_addr,	ADDR',
208	`sh_offset,	OFF',
209	`sh_size,	XWORD',
210	`sh_link,	WORD',
211	`sh_info,	WORD',
212	`sh_addralign,	XWORD',
213	`sh_entsize,	XWORD',
214	`_,_'')
215
216DEFINE_STRUCT(`Elf32_Sym',
217	``st_name,	WORD',
218	`st_value,	ADDR',
219	`st_size,	WORD',
220	`st_info,	BYTE',
221	`st_other,	BYTE',
222	`st_shndx,	HALF',
223	`_,_'')
224
225DEFINE_STRUCT(`Elf64_Sym',
226	``st_name,	WORD',
227	`st_info,	BYTE',
228	`st_other,	BYTE',
229	`st_shndx,	HALF',
230	`st_value,	ADDR',
231	`st_size,	XWORD',
232	`_,_'')
233
234DEFINE_STRUCT(`Elf32_Syminfo',
235	``si_boundto,	HALF',
236	`si_flags,	HALF',
237	`_,_'')
238
239DEFINE_STRUCT(`Elf64_Syminfo',
240	``si_boundto,	HALF',
241	`si_flags,	HALF',
242	`_,_'')
243
244DEFINE_STRUCT(`Elf32_Verdaux',
245	``vda_name,	WORD',
246	`vda_next,	WORD',
247	`_,_'')
248
249DEFINE_STRUCT(`Elf64_Verdaux',
250	``vda_name,	WORD',
251	`vda_next,	WORD',
252	`_,_'')
253
254DEFINE_STRUCT(`Elf32_Verdef',
255	``vd_version,	HALF',
256	`vd_flags,	HALF',
257	`vd_ndx,	HALF',
258	`vd_cnt,	HALF',
259	`vd_hash,	WORD',
260	`vd_aux,	WORD',
261	`vd_next,	WORD',
262	`_,_'')
263
264DEFINE_STRUCT(`Elf64_Verdef',
265	``vd_version,	HALF',
266	`vd_flags,	HALF',
267	`vd_ndx,	HALF',
268	`vd_cnt,	HALF',
269	`vd_hash,	WORD',
270	`vd_aux,	WORD',
271	`vd_next,	WORD',
272	`_,_'')
273
274DEFINE_STRUCT(`Elf32_Verneed',
275	``vn_version,	HALF',
276	`vn_cnt,	HALF',
277	`vn_file,	WORD',
278	`vn_aux,	WORD',
279	`vn_next,	WORD',
280	`_,_'')
281
282DEFINE_STRUCT(`Elf64_Verneed',
283	``vn_version,	HALF',
284	`vn_cnt,	HALF',
285	`vn_file,	WORD',
286	`vn_aux,	WORD',
287	`vn_next,	WORD',
288	`_,_'')
289
290DEFINE_STRUCT(`Elf32_Vernaux',
291	``vna_hash,	WORD',
292	`vna_flags,	HALF',
293	`vna_other,	HALF',
294	`vna_name,	WORD',
295	`vna_next,	WORD',
296	`_,_'')
297
298DEFINE_STRUCT(`Elf64_Vernaux',
299	``vna_hash,	WORD',
300	`vna_flags,	HALF',
301	`vna_other,	HALF',
302	`vna_name,	WORD',
303	`vna_next,	WORD',
304	`_,_'')
305