clean tarball setup path to facilitate hudson automation submission
[external/prelink.git] / gelfx32 / gelfx.h
1 /* gelf API which supports ELFCLASS32 only.
2    Copyright (C) 2001 Red Hat, Inc.
3    Written by Jakub Jelinek <jakub@redhat.com>, 2001.
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; either version 2, or (at your option)
8    any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software Foundation,
17    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
18
19 #ifndef GELFX_H
20 #define GELFX_H
21
22 #include <error.h>
23 #include <libelf.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 typedef Elf32_Half      GElf_Half;
28 typedef Elf32_Word      GElf_Word;
29 typedef Elf32_Sword     GElf_Sword;
30 typedef Elf32_Xword     GElf_Xword;
31 typedef Elf32_Sxword    GElf_Sxword;
32 typedef Elf32_Addr      GElf_Addr;
33 typedef Elf32_Off       GElf_Off;
34 typedef Elf32_Ehdr      GElf_Ehdr;
35 typedef Elf32_Shdr      GElf_Shdr;
36 typedef Elf32_Section   GElf_Section;
37 typedef Elf32_Sym       GElf_Sym;
38 typedef Elf32_Rel       GElf_Rel;
39 typedef Elf32_Rela      GElf_Rela;
40 typedef Elf32_Phdr      GElf_Phdr;
41 typedef Elf32_Dyn       GElf_Dyn;
42 #define GELF_ST_BIND    ELF32_ST_BIND
43 #define GELF_ST_TYPE    ELF32_ST_TYPE
44 #define GELF_ST_INFO    ELF32_ST_INFO
45 #define GELF_R_SYM      ELF32_R_SYM
46 #define GELF_R_TYPE     ELF32_R_TYPE
47 #define GELF_R_INFO     ELF32_R_INFO
48
49 extern inline int
50 gelf_getclass (Elf *elf)
51 {
52   size_t size;
53   char *e_ident = elf_getident (elf, &size);
54   if (e_ident [EI_CLASS] == ELFCLASS64)
55     error (EXIT_FAILURE, 0, "64-bit ELF not supported");
56   return e_ident [EI_CLASS] == ELFCLASS32 ? ELFCLASS32 : ELFCLASSNONE;
57 }
58
59 #define gelf_fsize(e,t,c,v) elf32_fsize(t,c,v)
60
61 extern inline GElf_Ehdr *gelf_getehdr (Elf *elf, GElf_Ehdr *dst)
62 {
63   Elf32_Ehdr *ehdr = elf32_getehdr (elf);
64   if (ehdr == NULL)
65     return NULL;
66   return memcpy (dst, ehdr, sizeof (Elf32_Ehdr));
67 }
68
69 extern inline int
70 gelf_update_ehdr (Elf *elf, GElf_Ehdr *src)
71 {
72   Elf32_Ehdr *ehdr = elf32_getehdr (elf);
73   if (ehdr == NULL)
74     return 0;
75   memcpy (ehdr, src, sizeof (Elf32_Ehdr));
76   return 1;
77 }
78
79 extern inline unsigned long
80 gelf_newehdr (Elf *elf, int class)
81 {
82   if (class != ELFCLASS32)
83     return 0;
84   return (unsigned long) elf32_newehdr (elf);
85 }
86
87 extern inline GElf_Phdr *
88 gelf_getphdr (Elf *elf, int ndx, GElf_Phdr *dst)
89 {
90   Elf32_Ehdr *ehdr = elf32_getehdr (elf);
91   Elf32_Phdr *phdr = elf32_getphdr (elf);
92   if (ehdr == NULL || phdr == NULL || ndx >= ehdr->e_phnum)
93     return NULL;
94   return memcpy (dst, phdr + ndx, sizeof (Elf32_Phdr));
95 }
96
97 extern inline int
98 gelf_update_phdr (Elf *elf, int ndx, GElf_Phdr *src)
99 {
100   Elf32_Ehdr *ehdr = elf32_getehdr (elf);
101   Elf32_Phdr *phdr = elf32_getphdr (elf);
102   if (ehdr == NULL || phdr == NULL || ndx >= ehdr->e_phnum)
103     return 0;
104   memcpy (phdr + ndx, src, sizeof (Elf32_Phdr));
105   return 1;
106 }
107
108 extern inline unsigned long
109 gelf_newphdr (Elf *elf, size_t phnum)
110 {
111   return (unsigned long) elf32_newphdr (elf, phnum);
112 }
113
114 #define gelf_xlatetom(e,d,s,n) elf32_xlatetom(e,d,s,n)
115 #define gelf_xlatetof(e,d,s,n) elf32_xlatetof(e,d,s,n)
116
117 extern inline GElf_Shdr *
118 gelf_getshdr (Elf_Scn *scn, GElf_Shdr *dst)
119 {
120   Elf32_Shdr *shdr = elf32_getshdr (scn);
121   if (shdr == NULL)
122     return NULL;
123   return memcpy (dst, shdr, sizeof (Elf32_Shdr));
124 }
125
126 extern inline int
127 gelf_update_shdr (Elf_Scn *scn, GElf_Shdr *src)
128 {
129   Elf32_Shdr *shdr = elf32_getshdr (scn);
130   if (shdr == NULL)
131     return 0;
132   memcpy (shdr, src, sizeof (Elf32_Shdr));
133   return 1;
134 }
135
136 extern inline GElf_Sym *
137 gelf_getsym (Elf_Data *data, int ndx, GElf_Sym *dst)
138 {
139   if (data->d_type != ELF_T_SYM
140       || (ndx + 1) * sizeof (Elf32_Sym) > data->d_size)
141     return NULL;
142   *dst = ((GElf_Sym *) data->d_buf)[ndx];
143   return dst;
144 }
145
146 extern inline int
147 gelf_update_sym (Elf_Data *data, int ndx, GElf_Sym *src)
148 {
149   if (data->d_type != ELF_T_SYM
150       || (ndx + 1) * sizeof (Elf32_Sym) > data->d_size)
151     return 0;
152   ((GElf_Sym *) data->d_buf)[ndx] = *src;
153   return 1;
154 }
155
156 extern inline GElf_Dyn *
157 gelf_getdyn (Elf_Data *data, int ndx, GElf_Dyn *dst)
158 {
159   if (data->d_type != ELF_T_DYN
160       || (ndx + 1) * sizeof (Elf32_Dyn) > data->d_size)
161     return NULL;
162   *dst = ((GElf_Dyn *) data->d_buf)[ndx];
163   return dst;
164 }
165
166 extern inline int
167 gelf_update_dyn (Elf_Data *data, int ndx, GElf_Dyn *src)
168 {
169   if (data->d_type != ELF_T_DYN
170       || (ndx + 1) * sizeof (Elf32_Dyn) > data->d_size)
171     return 0;
172   ((GElf_Dyn *) data->d_buf)[ndx] = *src;
173   return 1;
174 }
175
176 extern inline GElf_Rel *
177 gelf_getrel (Elf_Data *data, int ndx, GElf_Rel *dst)
178 {
179   if (data->d_type != ELF_T_REL
180       || (ndx + 1) * sizeof (Elf32_Rel) > data->d_size)
181     return NULL;
182   *dst = ((GElf_Rel *) data->d_buf)[ndx];
183   return dst;
184 }
185
186 extern inline int
187 gelf_update_rel (Elf_Data *data, int ndx, GElf_Rel *src)
188 {
189   if (data->d_type != ELF_T_REL
190       || (ndx + 1) * sizeof (Elf32_Rel) > data->d_size)
191     return 0;
192   ((GElf_Rel *) data->d_buf)[ndx] = *src;
193   return 1;
194 }
195
196 extern inline GElf_Rela *
197 gelf_getrela (Elf_Data *data, int ndx, GElf_Rela *dst)
198 {
199   if (data->d_type != ELF_T_RELA
200       || (ndx + 1) * sizeof (Elf32_Rela) > data->d_size)
201     return NULL;
202   *dst = ((GElf_Rela *) data->d_buf)[ndx];
203   return dst;
204 }
205
206 extern inline int
207 gelf_update_rela (Elf_Data *data, int ndx, GElf_Rela *src)
208 {
209   if (data->d_type != ELF_T_RELA
210       || (ndx + 1) * sizeof (Elf32_Rela) > data->d_size)
211     return 0;
212   ((GElf_Rela *) data->d_buf)[ndx] = *src;
213   return 1;
214 }
215
216 #define gelfx_getshdr(elf,scn,shdr) gelf_getshdr(scn,shdr)
217 #define gelfx_update_shdr(elf,scn,shdr) gelf_update_shdr(scn,shdr)
218 #define gelfx_getsym(elf,data,ndx,x) gelf_getsym(data,ndx,x)
219 #define gelfx_update_sym(elf,data,ndx,x) gelf_update_sym(data,ndx,x)
220 #define gelfx_getdyn(elf,data,ndx,x) gelf_getdyn(data,ndx,x)
221 #define gelfx_update_dyn(elf,data,ndx,x) gelf_update_dyn(data,ndx,x)
222 #define gelfx_getrel(elf,data,ndx,x) gelf_getrel(data,ndx,x)
223 #define gelfx_update_rel(elf,data,ndx,x) gelf_update_rel(data,ndx,x)
224 #define gelfx_getrela(elf,data,ndx,x) gelf_getrela(data,ndx,x)
225 #define gelfx_update_rela(elf,data,ndx,x) gelf_update_rela(data,ndx,x)
226
227 #endif  /* GELFX_H */