15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Macros to enable writing native and generic ELF access code.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Copyright (C) 2003 Red Hat, Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   This file is part of Red Hat elfutils.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Written by Ulrich Drepper <drepper@redhat.com>, 2003.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Red Hat elfutils is free software; you can redistribute it and/or modify
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   it under the terms of the GNU General Public License as published by the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Free Software Foundation; version 2 of the License.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Red Hat elfutils is distributed in the hope that it will be useful, but
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   WITHOUT ANY WARRANTY; without even the implied warranty of
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   General Public License for more details.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   You should have received a copy of the GNU General Public License along
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   with Red Hat elfutils; if not, write to the Free Software Foundation,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Red Hat elfutils is an included package of the Open Invention Network.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   An included package of the Open Invention Network is a package for which
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   Open Invention Network licensees cross-license their patents.  No patent
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   license is granted, either expressly or impliedly, by designation as an
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   included package.  Should you wish to participate in the Open Invention
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Network licensing program, please visit www.openinventionnetwork.com
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   <http://www.openinventionnetwork.com>.  */
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef HAVE_CONFIG_H
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <config.h>
299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#endif
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <libebl.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* By default the linker is handling all architectures.  But it can
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   be configured to be a native-only linker.  */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if NATIVE_ELF == 32
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 32-bit only.  */
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Ehdr Elf32_Ehdr
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# define XElf_Shdr Elf32_Shdr
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Off Elf32_Off
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Addr Elf32_Addr
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Half Elf32_Half
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Word Elf32_Word
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Xword Elf32_Word
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sxword Elf32_Sword
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Versym Elf32_Versym
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sym Elf32_Sym
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rel Elf32_Rel
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rela Elf32_Rela
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Ehdr_vardef(name) Elf32_Ehdr *name
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getehdr(elf, name) name = elf32_getehdr (elf)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getehdr_copy(elf, name, copy) \
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (copy) = *(name = elf32_getehdr (elf))
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_newehdr(elf, klass) elf32_newehdr (elf)
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# define xelf_update_ehdr(elf, ehdr) \
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (elf), (void) (ehdr), 1)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getclass(elf) ELFCLASS32
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Phdr_vardef(name) Elf32_Phdr *name
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# define xelf_newphdr(elf, n) elf32_newphdr (elf, n)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getphdr(elf, idx, name) name = elf32_getphdr (elf) + idx
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getphdr_ptr(elf, idx, name) name = elf32_getphdr (elf) + idx
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_phdr(elf, idx, phdr) \
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (elf), (void) (idx), (void) (phdr), 1)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Shdr_vardef(name) Elf32_Shdr *name
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getshdr(scn, name) name = elf32_getshdr (scn)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getshdr_copy(scn, name, copy) \
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (copy) = *(name = elf32_getshdr (scn))
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_shdr(scn, shdr) \
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (scn), (void) (shdr), 1)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sym_vardef(name) Elf32_Sym *name
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# define xelf_getsym(data, idx, name) \
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  name = &((Elf32_Sym *) (data)->d_buf)[idx]
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# define xelf_getsym_ptr(data, idx, name) \
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Sym *) (data)->d_buf)[idx]
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getsymshndx(data, ndxdata, idx, name1, name2) \
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (name1 = &((Elf32_Sym *) ((data)->d_buf))[idx]);			      \
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name2 = (unlikely ((ndxdata) != NULL)					      \
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)	   ? ((Elf32_Word *) ((ndxdata)->d_buf))[idx] : 0)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_update_sym(data, idx, sym) \
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (sym), 1)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_update_symshndx(data, ndxdata, idx, name1, name2, datachanged) \
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (datachanged)							      \
888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ((Elf32_Sym *) ((data)->d_buf))[idx] = *name1;			      \
898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (unlikely (ndxdata != NULL))					      \
908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ((Elf32_Word *) ((ndxdata)->d_buf))[idx] = name2
918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)# define XElf_Versym_vardef(name) Elf32_Versym name
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getversym_copy(data, idx, name) \
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (name = ((Elf32_Versym *) ((data)->d_buf))[idx], &name)
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Dyn_vardef(name) Elf32_Dyn *name
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getdyn(data, idx, name) \
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Dyn *) ((data)->d_buf))[idx]
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getdyn_ptr(data, idx, name) \
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Dyn *) ((data)->d_buf))[idx]
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_update_dyn(data, idx, name) \
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Rel_vardef(name) Elf32_Rel *name
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getrel(data, idx, name) \
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Rel *) ((data)->d_buf))[idx]
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getrel_ptr(data, idx, name) \
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Rel *) ((data)->d_buf))[idx]
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_update_rel(data, idx, name) \
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Rela_vardef(name) Elf32_Rela *name
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getrela(data, idx, name) \
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Rela *) ((data)->d_buf))[idx]
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getrela_ptr(data, idx, name) \
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = &((Elf32_Rela *) ((data)->d_buf))[idx]
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_update_rela(data, idx, name) \
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Verdef_vardef(name) Elf32_Verdef *name
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define xelf_getverdef(data, offset, name) \
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  name = ((Elf32_Verdef *) ((char *) ((data)->d_buf) + (offset)))
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define XElf_Verdaux_vardef(name) Elf32_Verdaux *name
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getverdaux(data, offset, name) \
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = ((Elf32_Verdaux *) ((char *) ((data)->d_buf) + (offset)))
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_TYPE(info) ELF32_ST_TYPE (info)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_BIND(info) ELF32_ST_BIND (info)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_INFO(bind, type) ELF32_ST_INFO (bind, type)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_VISIBILITY(info) ELF32_ST_VISIBILITY (info)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_SYM(info) ELF32_R_SYM (info)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_TYPE(info) ELF32_R_TYPE (info)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_INFO(sym, type) ELF32_R_INFO (sym, type)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_fsize(elf, type, cnt) \
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (__builtin_constant_p (type)						      \
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ? ({ size_t fsize;							      \
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (type)							      \
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  {								      \
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_BYTE: fsize = 1; break;				      \
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_ADDR: fsize = sizeof (Elf32_Addr); break;		      \
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_DYN: fsize = sizeof (Elf32_Dyn); break;		      \
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_EHDR: fsize = sizeof (Elf32_Ehdr); break;		      \
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_HALF: fsize = sizeof (Elf32_Half); break;		      \
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_OFF: fsize = sizeof (Elf32_Off); break;		      \
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_PHDR: fsize = sizeof (Elf32_Phdr); break;		      \
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_RELA: fsize = sizeof (Elf32_Rela); break;		      \
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_REL: fsize = sizeof (Elf32_Rel); break;		      \
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SHDR: fsize = sizeof (Elf32_Shdr); break;		      \
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SWORD: fsize = sizeof (Elf32_Sword); break;	      \
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SYM: fsize = sizeof (Elf32_Sym); break;		      \
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch	  case ELF_T_WORD: fsize = sizeof (Elf32_Word); break;		      \
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_XWORD: fsize = sizeof (Elf32_Xword); break;	      \
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SXWORD: fsize = sizeof (Elf32_Sxword); break;	      \
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VDEF: fsize = sizeof (Elf32_Verdef); break;	      \
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch	  case ELF_T_VDAUX: fsize = sizeof (Elf32_Verdaux); break;	      \
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VNEED: fsize = sizeof (Elf32_Verneed); break;	      \
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VNAUX: fsize = sizeof (Elf32_Vernaux); break;	      \
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_NHDR: fsize = sizeof (Elf32_Nhdr); break;		      \
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SYMINFO: fsize = sizeof (Elf32_Syminfo); break;	      \
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_MOVE: fsize = sizeof (Elf32_Move); break;		      \
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          default: fsize = 0; break;					      \
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  }								      \
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fsize * (cnt); })						      \
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : gelf_fsize (elf, type, cnt, EV_CURRENT))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif NATIVE_ELF == 64
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 64-bit only.  */
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Ehdr Elf64_Ehdr
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Shdr Elf64_Shdr
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Addr Elf64_Addr
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Half Elf64_Half
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Off Elf64_Off
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Word Elf64_Word
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Xword Elf64_Xword
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sxword Elf64_Sxword
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Versym Elf64_Versym
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sym Elf64_Sym
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rel Elf64_Rel
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rela Elf64_Rela
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Ehdr_vardef(name) Elf64_Ehdr *name
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getehdr(elf, name) name = elf64_getehdr (elf)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getehdr_copy(elf, name, copy) \
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (copy) = *(name = elf64_getehdr (elf))
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_newehdr(elf, klass) elf64_newehdr (elf)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_ehdr(elf, ehdr) \
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (elf), (void) (ehdr), 1)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getclass(elf) ELFCLASS32
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Phdr_vardef(name) Elf64_Phdr *name
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_newphdr(elf, n) elf64_newphdr (elf, n)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getphdr(elf, idx, name) name = elf64_getphdr (elf) + idx
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getphdr_ptr(elf, idx, name) name = elf64_getphdr (elf) + idx
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_phdr(elf, idx, phdr) \
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (elf), (void) (idx), (void) (phdr), 1)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Shdr_vardef(name) Elf64_Shdr *name
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getshdr(scn, name) name = elf64_getshdr (scn)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define xelf_getshdr_copy(scn, name, copy) \
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (copy) = *(name = elf64_getshdr (scn))
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_shdr(scn, shdr) \
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (scn), (void) (shdr), 1)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sym_vardef(name) Elf64_Sym *name
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# define xelf_getsym(data, idx, name) \
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Sym *) (data)->d_buf)[idx]
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getsym_ptr(data, idx, name) \
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Sym *) (data)->d_buf)[idx]
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define xelf_getsymshndx(data, ndxdata, idx, name1, name2) \
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (name1 = &((Elf64_Sym *) ((data)->d_buf))[idx]);			      \
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name2 = (unlikely ((ndxdata) != NULL)					      \
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)	   ? ((Elf32_Word *) ((ndxdata)->d_buf))[idx] : 0)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define xelf_update_sym(data, idx, sym) \
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (sym), 1)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_symshndx(data, ndxdata, idx, name1, name2, datachanged) \
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (datachanged)							      \
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ((Elf64_Sym *) ((data)->d_buf))[idx] = *name1;			      \
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ndxdata != NULL)							      \
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((Elf32_Word *) ((ndxdata)->d_buf))[idx] = name2)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Versym_vardef(name) Elf64_Versym name
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getversym_copy(data, idx, name) \
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (name = ((Elf64_Versym *) ((data)->d_buf))[idx], (&name))
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Dyn_vardef(name) Elf64_Dyn *name
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getdyn(data, idx, name) \
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Dyn *) ((data)->d_buf))[idx]
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getdyn_ptr(data, idx, name) \
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Dyn *) ((data)->d_buf))[idx]
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_dyn(data, idx, name) \
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rel_vardef(name) Elf64_Rel *name
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrel(data, idx, name) \
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Rel *) ((data)->d_buf))[idx]
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrel_ptr(data, idx, name) \
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Rel *) ((data)->d_buf))[idx]
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_rel(data, idx, name) \
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rela_vardef(name) Elf64_Rela *name
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrela(data, idx, name) \
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Rela *) ((data)->d_buf))[idx]
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrela_ptr(data, idx, name) \
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &((Elf64_Rela *) ((data)->d_buf))[idx]
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)# define xelf_update_rela(data, idx, name) \
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* nothing */ ((void) (data), (void) (idx), (void) (name), 1)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Verdef_vardef(name) Elf64_Verdef *name
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getverdef(data, offset, name) \
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = ((Elf64_Verdef *) ((char *) ((data)->d_buf) + (offset)))
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)# define XElf_Verdaux_vardef(name) Elf64_Verdaux *name
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getverdaux(data, offset, name) \
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = ((Elf64_Verdaux *) ((char *) ((data)->d_buf) + (offset)))
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_TYPE(info) ELF64_ST_TYPE (info)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_BIND(info) ELF64_ST_BIND (info)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_INFO(bind, type) ELF64_ST_INFO (bind, type)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_VISIBILITY(info) ELF64_ST_VISIBILITY (info)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_SYM(info) ELF64_R_SYM (info)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_TYPE(info) ELF64_R_TYPE (info)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_INFO(sym, type) ELF64_R_INFO (sym, type)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_fsize(elf, type, cnt) \
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (__builtin_constant_p (type)						      \
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ? ({ size_t fsize;							      \
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (type)							      \
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  {								      \
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_BYTE: fsize = 1; break;				      \
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_ADDR: fsize = sizeof (Elf64_Addr); break;		      \
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_DYN: fsize = sizeof (Elf64_Dyn); break;		      \
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_EHDR: fsize = sizeof (Elf64_Ehdr); break;		      \
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_HALF: fsize = sizeof (Elf64_Half); break;		      \
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_OFF: fsize = sizeof (Elf64_Off); break;		      \
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_PHDR: fsize = sizeof (Elf64_Phdr); break;		      \
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_RELA: fsize = sizeof (Elf64_Rela); break;		      \
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_REL: fsize = sizeof (Elf64_Rel); break;		      \
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SHDR: fsize = sizeof (Elf64_Shdr); break;		      \
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SWORD: fsize = sizeof (Elf64_Sword); break;	      \
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SYM: fsize = sizeof (Elf64_Sym); break;		      \
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_WORD: fsize = sizeof (Elf64_Word); break;		      \
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_XWORD: fsize = sizeof (Elf64_Xword); break;	      \
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SXWORD: fsize = sizeof (Elf64_Sxword); break;	      \
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VDEF: fsize = sizeof (Elf64_Verdef); break;	      \
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VDAUX: fsize = sizeof (Elf64_Verdaux); break;	      \
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VNEED: fsize = sizeof (Elf64_Verneed); break;	      \
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_VNAUX: fsize = sizeof (Elf64_Vernaux); break;	      \
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_NHDR: fsize = sizeof (Elf64_Nhdr); break;		      \
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_SYMINFO: fsize = sizeof (Elf64_Syminfo); break;	      \
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  case ELF_T_MOVE: fsize = sizeof (Elf64_Move); break;		      \
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          default: fsize = 0; break;					      \
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  }								      \
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fsize * (cnt); })						      \
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   : gelf_fsize (elf, type, cnt, EV_CURRENT))
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <gelf.h>
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Generic linker.  */
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Ehdr GElf_Ehdr
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Shdr GElf_Shdr
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Addr GElf_Addr
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Half GElf_Half
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Off GElf_Off
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Word GElf_Word
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Xword GElf_Xword
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sxword GElf_Sxword
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Versym GElf_Versym
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sym GElf_Sym
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rel GElf_Rel
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rela GElf_Rela
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Ehdr_vardef(name) GElf_Ehdr name##_mem; GElf_Ehdr *name
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getehdr(elf, name) name = gelf_getehdr (elf, &name##_mem)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getehdr_copy(elf, name, copy) \
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getehdr (elf, &(copy))
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)# define xelf_newehdr(elf, klass) gelf_newehdr (elf, klass)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_ehdr(elf, ehdr) gelf_update_ehdr (elf, ehdr)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getclass(elf) gelf_getclass (elf)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Phdr_vardef(name) GElf_Phdr name##_mem; GElf_Phdr *name
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_newphdr(elf, n) gelf_newphdr (elf, n)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getphdr(elf, idx, name) \
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getphdr (elf, idx, &name##_mem)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getphdr_ptr(elf, idx, name) \
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &name##_mem
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_phdr(elf, idx, phdr) \
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gelf_update_phdr (elf, idx, phdr)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Shdr_vardef(name) GElf_Shdr name##_mem; GElf_Shdr *name
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getshdr(scn, name) name = gelf_getshdr (scn, &name##_mem)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getshdr_copy(scn, name, copy) \
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getshdr (scn, &(copy))
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_shdr(scn, shdr) gelf_update_shdr (scn, shdr)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Sym_vardef(name) GElf_Sym name##_mem; GElf_Sym *name
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getsym(data, idx, name) \
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getsym (data, idx, &name##_mem)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getsym_ptr(data, idx, name) \
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &name##_mem
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getsymshndx(data, ndxdata, idx, name1, name2) \
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name1 = gelf_getsymshndx (data, ndxdata, idx, &name1##_mem, &(name2))
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_sym(data, idx, sym) gelf_update_sym (data, idx, sym)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_symshndx(data, ndxdata, idx, name1, name2, datachanged) \
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gelf_update_symshndx (data, ndxdata, idx, name1, name2)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Versym_vardef(name) GElf_Versym name
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getversym_copy(data, idx, name) \
354b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gelf_getversym (data, idx, &name)
355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)# define XElf_Dyn_vardef(name) GElf_Dyn name##_mem; GElf_Dyn *name
357b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)# define xelf_getdyn(data, idx, name) \
358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  name = gelf_getdyn (data, idx, &name##_mem)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getdyn_ptr(data, idx, name) \
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &name##_mem
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_dyn(data, idx, name) \
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gelf_update_dyn (data, idx, name)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rel_vardef(name) GElf_Rel name##_mem; GElf_Rel *name
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrel(data, idx, name) \
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getrel (data, idx, &name##_mem)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrel_ptr(data, idx, name) \
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &name##_mem
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_rel(data, idx, name) \
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gelf_update_rel (data, idx, name)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Rela_vardef(name) GElf_Rela name##_mem; GElf_Rela *name
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrela(data, idx, name) \
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getrela (data, idx, &name##_mem)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getrela_ptr(data, idx, name) \
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = &name##_mem
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_update_rela(data, idx, name) \
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gelf_update_rela (data, idx, name)
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Verdef_vardef(name) GElf_Verdef name##_mem; GElf_Verdef *name
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getverdef(data, offset, name) \
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getverdef (data, offset, &name##_mem)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XElf_Verdaux_vardef(name) GElf_Verdaux name##_mem; GElf_Verdaux *name
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_getverdaux(data, offset, name) \
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name = gelf_getverdaux (data, offset, &name##_mem)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_TYPE(info) GELF_ST_TYPE (info)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_BIND(info) GELF_ST_BIND (info)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_INFO(bind, type) GELF_ST_INFO (bind, type)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_ST_VISIBILITY(info) GELF_ST_VISIBILITY (info)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_SYM(info) GELF_R_SYM (info)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_TYPE(info) GELF_R_TYPE (info)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define XELF_R_INFO(sym, type) GELF_R_INFO (sym, type)
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define xelf_fsize(elf, type, cnt) \
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gelf_fsize (elf, type, cnt, EV_CURRENT)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)