1 /* Macros to enable writing native and generic ELF access code.
2 Copyright (C) 2003 Red Hat, Inc.
3 This file is part of Red Hat elfutils.
4 Written by Ulrich Drepper <drepper@redhat.com>, 2003.
6 Red Hat elfutils is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by the
8 Free Software Foundation; version 2 of the License.
10 Red Hat elfutils is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with Red Hat elfutils; if not, write to the Free Software Foundation,
17 Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
19 Red Hat elfutils is an included package of the Open Invention Network.
20 An included package of the Open Invention Network is a package for which
21 Open Invention Network licensees cross-license their patents. No patent
22 license is granted, either expressly or impliedly, by designation as an
23 included package. Should you wish to participate in the Open Invention
24 Network licensing program, please visit www.openinventionnetwork.com
25 <http://www.openinventionnetwork.com>. */
34 /* By default the linker is handling all architectures. But it can
35 be configured to be a native-only linker. */
38 # define XElf_Ehdr Elf32_Ehdr
39 # define XElf_Shdr Elf32_Shdr
40 # define XElf_Off Elf32_Off
41 # define XElf_Addr Elf32_Addr
42 # define XElf_Half Elf32_Half
43 # define XElf_Word Elf32_Word
44 # define XElf_Xword Elf32_Word
45 # define XElf_Sxword Elf32_Sword
46 # define XElf_Versym Elf32_Versym
47 # define XElf_Sym Elf32_Sym
48 # define XElf_Rel Elf32_Rel
49 # define XElf_Rela Elf32_Rela
51 # define XElf_Ehdr_vardef(name) Elf32_Ehdr *name
52 # define xelf_getehdr(elf, name) name = elf32_getehdr (elf)
53 # define xelf_getehdr_copy(elf, name, copy) \
54 (copy) = *(name = elf32_getehdr (elf))
55 # define xelf_newehdr(elf, klass) elf32_newehdr (elf)
56 # define xelf_update_ehdr(elf, ehdr) \
57 /* nothing */ ((void) (elf), (void) (ehdr), 1)
59 # define xelf_getclass(elf) ELFCLASS32
61 # define XElf_Phdr_vardef(name) Elf32_Phdr *name
62 # define xelf_newphdr(elf, n) elf32_newphdr (elf, n)
63 # define xelf_getphdr(elf, idx, name) name = elf32_getphdr (elf) + idx
64 # define xelf_getphdr_ptr(elf, idx, name) name = elf32_getphdr (elf) + idx
65 # define xelf_update_phdr(elf, idx, phdr) \
66 /* nothing */ ((void) (elf), (void) (idx), (void) (phdr), 1)
68 # define XElf_Shdr_vardef(name) Elf32_Shdr *name
69 # define xelf_getshdr(scn, name) name = elf32_getshdr (scn)
70 # define xelf_getshdr_copy(scn, name, copy) \
71 (copy) = *(name = elf32_getshdr (scn))
72 # define xelf_update_shdr(scn, shdr) \
73 /* nothing */ ((void) (scn), (void) (shdr), 1)
75 # define XElf_Sym_vardef(name) Elf32_Sym *name
76 # define xelf_getsym(data, idx, name) \
77 name = &((Elf32_Sym *) (data)->d_buf)[idx]
78 # define xelf_getsym_ptr(data, idx, name) \
79 name = &((Elf32_Sym *) (data)->d_buf)[idx]
80 # define xelf_getsymshndx(data, ndxdata, idx, name1, name2) \
81 (name1 = &((Elf32_Sym *) ((data)->d_buf))[idx]); \
82 name2 = (unlikely ((ndxdata) != NULL) \
83 ? ((Elf32_Word *) ((ndxdata)->d_buf))[idx] : 0)
84 # define xelf_update_sym(data, idx, sym) \
85 /* nothing */ ((void) (data), (void) (idx), (void) (sym), 1)
86 # define xelf_update_symshndx(data, ndxdata, idx, name1, name2, datachanged) \
88 ((Elf32_Sym *) ((data)->d_buf))[idx] = *name1; \
89 if (unlikely (ndxdata != NULL)) \
90 ((Elf32_Word *) ((ndxdata)->d_buf))[idx] = name2
92 # define XElf_Versym_vardef(name) Elf32_Versym name
93 # define xelf_getversym_copy(data, idx, name) \
94 (name = ((Elf32_Versym *) ((data)->d_buf))[idx], &name)
96 # define XElf_Dyn_vardef(name) Elf32_Dyn *name
97 # define xelf_getdyn(data, idx, name) \
98 name = &((Elf32_Dyn *) ((data)->d_buf))[idx]
99 # define xelf_getdyn_ptr(data, idx, name) \
100 name = &((Elf32_Dyn *) ((data)->d_buf))[idx]
101 # define xelf_update_dyn(data, idx, name) \
102 /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
104 # define XElf_Rel_vardef(name) Elf32_Rel *name
105 # define xelf_getrel(data, idx, name) \
106 name = &((Elf32_Rel *) ((data)->d_buf))[idx]
107 # define xelf_getrel_ptr(data, idx, name) \
108 name = &((Elf32_Rel *) ((data)->d_buf))[idx]
109 # define xelf_update_rel(data, idx, name) \
110 /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
112 # define XElf_Rela_vardef(name) Elf32_Rela *name
113 # define xelf_getrela(data, idx, name) \
114 name = &((Elf32_Rela *) ((data)->d_buf))[idx]
115 # define xelf_getrela_ptr(data, idx, name) \
116 name = &((Elf32_Rela *) ((data)->d_buf))[idx]
117 # define xelf_update_rela(data, idx, name) \
118 /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
120 # define XElf_Verdef_vardef(name) Elf32_Verdef *name
121 # define xelf_getverdef(data, offset, name) \
122 name = ((Elf32_Verdef *) ((char *) ((data)->d_buf) + (offset)))
124 # define XElf_Verdaux_vardef(name) Elf32_Verdaux *name
125 # define xelf_getverdaux(data, offset, name) \
126 name = ((Elf32_Verdaux *) ((char *) ((data)->d_buf) + (offset)))
128 # define XELF_ST_TYPE(info) ELF32_ST_TYPE (info)
129 # define XELF_ST_BIND(info) ELF32_ST_BIND (info)
130 # define XELF_ST_INFO(bind, type) ELF32_ST_INFO (bind, type)
131 # define XELF_ST_VISIBILITY(info) ELF32_ST_VISIBILITY (info)
133 # define XELF_R_SYM(info) ELF32_R_SYM (info)
134 # define XELF_R_TYPE(info) ELF32_R_TYPE (info)
135 # define XELF_R_INFO(sym, type) ELF32_R_INFO (sym, type)
137 # define xelf_fsize(elf, type, cnt) \
138 (__builtin_constant_p (type) \
142 case ELF_T_BYTE: fsize = 1; break; \
143 case ELF_T_ADDR: fsize = sizeof (Elf32_Addr); break; \
144 case ELF_T_DYN: fsize = sizeof (Elf32_Dyn); break; \
145 case ELF_T_EHDR: fsize = sizeof (Elf32_Ehdr); break; \
146 case ELF_T_HALF: fsize = sizeof (Elf32_Half); break; \
147 case ELF_T_OFF: fsize = sizeof (Elf32_Off); break; \
148 case ELF_T_PHDR: fsize = sizeof (Elf32_Phdr); break; \
149 case ELF_T_RELA: fsize = sizeof (Elf32_Rela); break; \
150 case ELF_T_REL: fsize = sizeof (Elf32_Rel); break; \
151 case ELF_T_SHDR: fsize = sizeof (Elf32_Shdr); break; \
152 case ELF_T_SWORD: fsize = sizeof (Elf32_Sword); break; \
153 case ELF_T_SYM: fsize = sizeof (Elf32_Sym); break; \
154 case ELF_T_WORD: fsize = sizeof (Elf32_Word); break; \
155 case ELF_T_XWORD: fsize = sizeof (Elf32_Xword); break; \
156 case ELF_T_SXWORD: fsize = sizeof (Elf32_Sxword); break; \
157 case ELF_T_VDEF: fsize = sizeof (Elf32_Verdef); break; \
158 case ELF_T_VDAUX: fsize = sizeof (Elf32_Verdaux); break; \
159 case ELF_T_VNEED: fsize = sizeof (Elf32_Verneed); break; \
160 case ELF_T_VNAUX: fsize = sizeof (Elf32_Vernaux); break; \
161 case ELF_T_NHDR: fsize = sizeof (Elf32_Nhdr); break; \
162 case ELF_T_SYMINFO: fsize = sizeof (Elf32_Syminfo); break; \
163 case ELF_T_MOVE: fsize = sizeof (Elf32_Move); break; \
164 default: fsize = 0; break; \
167 : gelf_fsize (elf, type, cnt, EV_CURRENT))
168 #elif NATIVE_ELF == 64
170 # define XElf_Ehdr Elf64_Ehdr
171 # define XElf_Shdr Elf64_Shdr
172 # define XElf_Addr Elf64_Addr
173 # define XElf_Half Elf64_Half
174 # define XElf_Off Elf64_Off
175 # define XElf_Word Elf64_Word
176 # define XElf_Xword Elf64_Xword
177 # define XElf_Sxword Elf64_Sxword
178 # define XElf_Versym Elf64_Versym
179 # define XElf_Sym Elf64_Sym
180 # define XElf_Rel Elf64_Rel
181 # define XElf_Rela Elf64_Rela
183 # define XElf_Ehdr_vardef(name) Elf64_Ehdr *name
184 # define xelf_getehdr(elf, name) name = elf64_getehdr (elf)
185 # define xelf_getehdr_copy(elf, name, copy) \
186 (copy) = *(name = elf64_getehdr (elf))
187 # define xelf_newehdr(elf, klass) elf64_newehdr (elf)
188 # define xelf_update_ehdr(elf, ehdr) \
189 /* nothing */ ((void) (elf), (void) (ehdr), 1)
191 # define xelf_getclass(elf) ELFCLASS32
193 # define XElf_Phdr_vardef(name) Elf64_Phdr *name
194 # define xelf_newphdr(elf, n) elf64_newphdr (elf, n)
195 # define xelf_getphdr(elf, idx, name) name = elf64_getphdr (elf) + idx
196 # define xelf_getphdr_ptr(elf, idx, name) name = elf64_getphdr (elf) + idx
197 # define xelf_update_phdr(elf, idx, phdr) \
198 /* nothing */ ((void) (elf), (void) (idx), (void) (phdr), 1)
200 # define XElf_Shdr_vardef(name) Elf64_Shdr *name
201 # define xelf_getshdr(scn, name) name = elf64_getshdr (scn)
202 # define xelf_getshdr_copy(scn, name, copy) \
203 (copy) = *(name = elf64_getshdr (scn))
204 # define xelf_update_shdr(scn, shdr) \
205 /* nothing */ ((void) (scn), (void) (shdr), 1)
207 # define XElf_Sym_vardef(name) Elf64_Sym *name
208 # define xelf_getsym(data, idx, name) \
209 name = &((Elf64_Sym *) (data)->d_buf)[idx]
210 # define xelf_getsym_ptr(data, idx, name) \
211 name = &((Elf64_Sym *) (data)->d_buf)[idx]
212 # define xelf_getsymshndx(data, ndxdata, idx, name1, name2) \
213 (name1 = &((Elf64_Sym *) ((data)->d_buf))[idx]); \
214 name2 = (unlikely ((ndxdata) != NULL) \
215 ? ((Elf32_Word *) ((ndxdata)->d_buf))[idx] : 0)
216 # define xelf_update_sym(data, idx, sym) \
217 /* nothing */ ((void) (data), (void) (idx), (void) (sym), 1)
218 # define xelf_update_symshndx(data, ndxdata, idx, name1, name2, datachanged) \
220 ((Elf64_Sym *) ((data)->d_buf))[idx] = *name1; \
221 if (ndxdata != NULL) \
222 (((Elf32_Word *) ((ndxdata)->d_buf))[idx] = name2)
224 # define XElf_Versym_vardef(name) Elf64_Versym name
225 # define xelf_getversym_copy(data, idx, name) \
226 (name = ((Elf64_Versym *) ((data)->d_buf))[idx], (&name))
228 # define XElf_Dyn_vardef(name) Elf64_Dyn *name
229 # define xelf_getdyn(data, idx, name) \
230 name = &((Elf64_Dyn *) ((data)->d_buf))[idx]
231 # define xelf_getdyn_ptr(data, idx, name) \
232 name = &((Elf64_Dyn *) ((data)->d_buf))[idx]
233 # define xelf_update_dyn(data, idx, name) \
234 /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
236 # define XElf_Rel_vardef(name) Elf64_Rel *name
237 # define xelf_getrel(data, idx, name) \
238 name = &((Elf64_Rel *) ((data)->d_buf))[idx]
239 # define xelf_getrel_ptr(data, idx, name) \
240 name = &((Elf64_Rel *) ((data)->d_buf))[idx]
241 # define xelf_update_rel(data, idx, name) \
242 /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
244 # define XElf_Rela_vardef(name) Elf64_Rela *name
245 # define xelf_getrela(data, idx, name) \
246 name = &((Elf64_Rela *) ((data)->d_buf))[idx]
247 # define xelf_getrela_ptr(data, idx, name) \
248 name = &((Elf64_Rela *) ((data)->d_buf))[idx]
249 # define xelf_update_rela(data, idx, name) \
250 /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
252 # define XElf_Verdef_vardef(name) Elf64_Verdef *name
253 # define xelf_getverdef(data, offset, name) \
254 name = ((Elf64_Verdef *) ((char *) ((data)->d_buf) + (offset)))
256 # define XElf_Verdaux_vardef(name) Elf64_Verdaux *name
257 # define xelf_getverdaux(data, offset, name) \
258 name = ((Elf64_Verdaux *) ((char *) ((data)->d_buf) + (offset)))
260 # define XELF_ST_TYPE(info) ELF64_ST_TYPE (info)
261 # define XELF_ST_BIND(info) ELF64_ST_BIND (info)
262 # define XELF_ST_INFO(bind, type) ELF64_ST_INFO (bind, type)
263 # define XELF_ST_VISIBILITY(info) ELF64_ST_VISIBILITY (info)
265 # define XELF_R_SYM(info) ELF64_R_SYM (info)
266 # define XELF_R_TYPE(info) ELF64_R_TYPE (info)
267 # define XELF_R_INFO(sym, type) ELF64_R_INFO (sym, type)
269 # define xelf_fsize(elf, type, cnt) \
270 (__builtin_constant_p (type) \
274 case ELF_T_BYTE: fsize = 1; break; \
275 case ELF_T_ADDR: fsize = sizeof (Elf64_Addr); break; \
276 case ELF_T_DYN: fsize = sizeof (Elf64_Dyn); break; \
277 case ELF_T_EHDR: fsize = sizeof (Elf64_Ehdr); break; \
278 case ELF_T_HALF: fsize = sizeof (Elf64_Half); break; \
279 case ELF_T_OFF: fsize = sizeof (Elf64_Off); break; \
280 case ELF_T_PHDR: fsize = sizeof (Elf64_Phdr); break; \
281 case ELF_T_RELA: fsize = sizeof (Elf64_Rela); break; \
282 case ELF_T_REL: fsize = sizeof (Elf64_Rel); break; \
283 case ELF_T_SHDR: fsize = sizeof (Elf64_Shdr); break; \
284 case ELF_T_SWORD: fsize = sizeof (Elf64_Sword); break; \
285 case ELF_T_SYM: fsize = sizeof (Elf64_Sym); break; \
286 case ELF_T_WORD: fsize = sizeof (Elf64_Word); break; \
287 case ELF_T_XWORD: fsize = sizeof (Elf64_Xword); break; \
288 case ELF_T_SXWORD: fsize = sizeof (Elf64_Sxword); break; \
289 case ELF_T_VDEF: fsize = sizeof (Elf64_Verdef); break; \
290 case ELF_T_VDAUX: fsize = sizeof (Elf64_Verdaux); break; \
291 case ELF_T_VNEED: fsize = sizeof (Elf64_Verneed); break; \
292 case ELF_T_VNAUX: fsize = sizeof (Elf64_Vernaux); break; \
293 case ELF_T_NHDR: fsize = sizeof (Elf64_Nhdr); break; \
294 case ELF_T_SYMINFO: fsize = sizeof (Elf64_Syminfo); break; \
295 case ELF_T_MOVE: fsize = sizeof (Elf64_Move); break; \
296 default: fsize = 0; break; \
299 : gelf_fsize (elf, type, cnt, EV_CURRENT))
303 /* Generic linker. */
304 # define XElf_Ehdr GElf_Ehdr
305 # define XElf_Shdr GElf_Shdr
306 # define XElf_Addr GElf_Addr
307 # define XElf_Half GElf_Half
308 # define XElf_Off GElf_Off
309 # define XElf_Word GElf_Word
310 # define XElf_Xword GElf_Xword
311 # define XElf_Sxword GElf_Sxword
312 # define XElf_Versym GElf_Versym
313 # define XElf_Sym GElf_Sym
314 # define XElf_Rel GElf_Rel
315 # define XElf_Rela GElf_Rela
317 # define XElf_Ehdr_vardef(name) GElf_Ehdr name##_mem; GElf_Ehdr *name
318 # define xelf_getehdr(elf, name) name = gelf_getehdr (elf, &name##_mem)
319 # define xelf_getehdr_copy(elf, name, copy) \
320 name = gelf_getehdr (elf, &(copy))
321 # define xelf_newehdr(elf, klass) gelf_newehdr (elf, klass)
322 # define xelf_update_ehdr(elf, ehdr) gelf_update_ehdr (elf, ehdr)
324 # define xelf_getclass(elf) gelf_getclass (elf)
326 # define XElf_Phdr_vardef(name) GElf_Phdr name##_mem; GElf_Phdr *name
327 # define xelf_newphdr(elf, n) gelf_newphdr (elf, n)
328 # define xelf_getphdr(elf, idx, name) \
329 name = gelf_getphdr (elf, idx, &name##_mem)
330 # define xelf_getphdr_ptr(elf, idx, name) \
332 # define xelf_update_phdr(elf, idx, phdr) \
333 gelf_update_phdr (elf, idx, phdr)
335 # define XElf_Shdr_vardef(name) GElf_Shdr name##_mem; GElf_Shdr *name
336 # define xelf_getshdr(scn, name) name = gelf_getshdr (scn, &name##_mem)
337 # define xelf_getshdr_copy(scn, name, copy) \
338 name = gelf_getshdr (scn, &(copy))
339 # define xelf_update_shdr(scn, shdr) gelf_update_shdr (scn, shdr)
341 # define XElf_Sym_vardef(name) GElf_Sym name##_mem; GElf_Sym *name
342 # define xelf_getsym(data, idx, name) \
343 name = gelf_getsym (data, idx, &name##_mem)
344 # define xelf_getsym_ptr(data, idx, name) \
346 # define xelf_getsymshndx(data, ndxdata, idx, name1, name2) \
347 name1 = gelf_getsymshndx (data, ndxdata, idx, &name1##_mem, &(name2))
348 # define xelf_update_sym(data, idx, sym) gelf_update_sym (data, idx, sym)
349 # define xelf_update_symshndx(data, ndxdata, idx, name1, name2, datachanged) \
350 gelf_update_symshndx (data, ndxdata, idx, name1, name2)
352 # define XElf_Versym_vardef(name) GElf_Versym name
353 # define xelf_getversym_copy(data, idx, name) \
354 gelf_getversym (data, idx, &name)
356 # define XElf_Dyn_vardef(name) GElf_Dyn name##_mem; GElf_Dyn *name
357 # define xelf_getdyn(data, idx, name) \
358 name = gelf_getdyn (data, idx, &name##_mem)
359 # define xelf_getdyn_ptr(data, idx, name) \
361 # define xelf_update_dyn(data, idx, name) \
362 gelf_update_dyn (data, idx, name)
364 # define XElf_Rel_vardef(name) GElf_Rel name##_mem; GElf_Rel *name
365 # define xelf_getrel(data, idx, name) \
366 name = gelf_getrel (data, idx, &name##_mem)
367 # define xelf_getrel_ptr(data, idx, name) \
369 # define xelf_update_rel(data, idx, name) \
370 gelf_update_rel (data, idx, name)
372 # define XElf_Rela_vardef(name) GElf_Rela name##_mem; GElf_Rela *name
373 # define xelf_getrela(data, idx, name) \
374 name = gelf_getrela (data, idx, &name##_mem)
375 # define xelf_getrela_ptr(data, idx, name) \
377 # define xelf_update_rela(data, idx, name) \
378 gelf_update_rela (data, idx, name)
380 # define XElf_Verdef_vardef(name) GElf_Verdef name##_mem; GElf_Verdef *name
381 # define xelf_getverdef(data, offset, name) \
382 name = gelf_getverdef (data, offset, &name##_mem)
384 # define XElf_Verdaux_vardef(name) GElf_Verdaux name##_mem; GElf_Verdaux *name
385 # define xelf_getverdaux(data, offset, name) \
386 name = gelf_getverdaux (data, offset, &name##_mem)
388 # define XELF_ST_TYPE(info) GELF_ST_TYPE (info)
389 # define XELF_ST_BIND(info) GELF_ST_BIND (info)
390 # define XELF_ST_INFO(bind, type) GELF_ST_INFO (bind, type)
391 # define XELF_ST_VISIBILITY(info) GELF_ST_VISIBILITY (info)
393 # define XELF_R_SYM(info) GELF_R_SYM (info)
394 # define XELF_R_TYPE(info) GELF_R_TYPE (info)
395 # define XELF_R_INFO(sym, type) GELF_R_INFO (sym, type)
397 # define xelf_fsize(elf, type, cnt) \
398 gelf_fsize (elf, type, cnt, EV_CURRENT)