1 /* This file defines generic ELF types, structures, and macros.
2    Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2015 Red Hat, Inc.
3    This file is part of elfutils.
4 
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of either
7 
8      * the GNU Lesser General Public License as published by the Free
9        Software Foundation; either version 3 of the License, or (at
10        your option) any later version
11 
12    or
13 
14      * the GNU General Public License as published by the Free
15        Software Foundation; either version 2 of the License, or (at
16        your option) any later version
17 
18    or both in parallel, as here.
19 
20    elfutils is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23    General Public License for more details.
24 
25    You should have received copies of the GNU General Public License and
26    the GNU Lesser General Public License along with this program.  If
27    not, see <http://www.gnu.org/licenses/>.  */
28 
29 #ifndef _GELF_H
30 #define	_GELF_H 1
31 
32 #include <libelf.h>
33 
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 /* Class independent type definitions.  Correctly speaking this is not
40    true.  We assume that 64-bit binaries are the largest class and
41    therefore all other classes can be represented without loss.  */
42 
43 /* Type for a 16-bit quantity.  */
44 typedef Elf64_Half GElf_Half;
45 
46 /* Types for signed and unsigned 32-bit quantities.  */
47 typedef Elf64_Word GElf_Word;
48 typedef	Elf64_Sword GElf_Sword;
49 
50 /* Types for signed and unsigned 64-bit quantities.  */
51 typedef Elf64_Xword GElf_Xword;
52 typedef	Elf64_Sxword GElf_Sxword;
53 
54 /* Type of addresses.  */
55 typedef Elf64_Addr GElf_Addr;
56 
57 /* Type of file offsets.  */
58 typedef Elf64_Off GElf_Off;
59 
60 
61 /* The ELF file header.  This appears at the start of every ELF file.  */
62 typedef Elf64_Ehdr GElf_Ehdr;
63 
64 /* Section header.  */
65 typedef Elf64_Shdr GElf_Shdr;
66 
67 /* Section index.  */
68 #ifndef LIBELF_ELF_SECTION_DEFINED
69 /* Type for section indices, which are 16-bit quantities.  */
70 typedef uint16_t Elf64_Section;
71 #endif
72 /* XXX This should probably be a larger type in preparation of times when
73    regular section indices can be larger.  */
74 typedef Elf64_Section GElf_Section;
75 
76 /* Symbol table entry.  */
77 typedef Elf64_Sym GElf_Sym;
78 
79 /* The syminfo section if available contains additional information about
80    every dynamic symbol.  */
81 typedef Elf64_Syminfo GElf_Syminfo;
82 
83 /* Relocation table entry without addend (in section of type SHT_REL).  */
84 typedef Elf64_Rel GElf_Rel;
85 
86 /* Relocation table entry with addend (in section of type SHT_RELA).  */
87 typedef Elf64_Rela GElf_Rela;
88 
89 /* Program segment header.  */
90 typedef Elf64_Phdr GElf_Phdr;
91 
92 /* Header of a compressed section.  */
93 typedef Elf64_Chdr GElf_Chdr;
94 
95 /* Dynamic section entry.  */
96 typedef Elf64_Dyn GElf_Dyn;
97 
98 
99 /* Version definition sections.  */
100 typedef Elf64_Verdef GElf_Verdef;
101 
102 /* Auxialiary version information.  */
103 typedef Elf64_Verdaux GElf_Verdaux;
104 
105 /* Version dependency section.  */
106 typedef Elf64_Verneed GElf_Verneed;
107 
108 /* Auxiliary needed version information.  */
109 typedef Elf64_Vernaux GElf_Vernaux;
110 
111 
112 /* Type for version symbol information.  */
113 typedef Elf64_Versym GElf_Versym;
114 
115 
116 /* Auxiliary vector.  */
117 #ifndef LIBELF_ELF_AUXV_T_DEFINED
118 typedef struct
119 {
120   uint64_t a_type;		/* Entry type */
121   union
122     {
123       uint64_t a_val;		/* Integer value */
124       /* We use to have pointer elements added here.  We cannot do that,
125 	 though, since it does not work when using 32-bit definitions
126 	 on 64-bit platforms and vice versa.  */
127     } a_un;
128 } Elf64_auxv_t;
129 #endif
130 typedef Elf64_auxv_t GElf_auxv_t;
131 
132 
133 /* Note section contents.  */
134 typedef Elf64_Nhdr GElf_Nhdr;
135 
136 
137 /* Move structure.  */
138 typedef Elf64_Move GElf_Move;
139 
140 
141 /* Library list structure.  */
142 typedef Elf64_Lib GElf_Lib;
143 
144 
145 /* How to extract and insert information held in the st_info field.  */
146 
147 #define GELF_ST_BIND(val)		ELF64_ST_BIND (val)
148 #define GELF_ST_TYPE(val)		ELF64_ST_TYPE (val)
149 #define GELF_ST_INFO(bind, type)	ELF64_ST_INFO (bind, type)
150 
151 /* How to extract information held in the st_other field.  */
152 
153 #define GELF_ST_VISIBILITY(val)		ELF64_ST_VISIBILITY (val)
154 
155 
156 /* How to extract and insert information held in the r_info field.  */
157 
158 #define GELF_R_SYM(info)		ELF64_R_SYM (info)
159 #define GELF_R_TYPE(info)		ELF64_R_TYPE (info)
160 #define GELF_R_INFO(sym, type)		ELF64_R_INFO (sym, type)
161 
162 
163 /* How to extract and insert information held in the m_info field.  */
164 #define GELF_M_SYM(info)		ELF64_M_SYM (info)
165 #define GELF_M_SIZE(info)		ELF64_M_SIZE (info)
166 #define GELF_M_INFO(sym, size)		ELF64_M_INFO (sym, size)
167 
168 
169 /* Get class of the file associated with ELF.  */
170 extern int gelf_getclass (Elf *__elf);
171 
172 
173 /* Return size of array of COUNT elements of the type denoted by TYPE
174    in the external representation.  The binary class is taken from ELF.
175    The result is based on version VERSION of the ELF standard.  */
176 extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
177 			  unsigned int __version);
178 
179 /* Retrieve object file header.  */
180 extern GElf_Ehdr *gelf_getehdr (Elf *__elf, GElf_Ehdr *__dest);
181 
182 /* Update the ELF header.  */
183 extern int gelf_update_ehdr (Elf *__elf, GElf_Ehdr *__src);
184 
185 /* Create new ELF header if none exists.  Creates an Elf32_Ehdr if CLASS
186    is ELFCLASS32 or an Elf64_Ehdr if CLASS is ELFCLASS64.  Returns NULL
187    on error.  */
188 extern void *gelf_newehdr (Elf *__elf, int __class);
189 
190 /* Get section at OFFSET.  */
191 extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset);
192 
193 /* Retrieve section header.  */
194 extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst);
195 
196 /* Update section header.  */
197 extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src);
198 
199 /* Retrieve program header table entry.  */
200 extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst);
201 
202 /* Update the program header.  */
203 extern int gelf_update_phdr (Elf *__elf, int __ndx, GElf_Phdr *__src);
204 
205 /* Create new program header with PHNUM entries.  Creates either an
206    Elf32_Phdr or an Elf64_Phdr depending on whether the given ELF is
207    ELFCLASS32 or ELFCLASS64.  Returns NULL on error.  */
208 extern void *gelf_newphdr (Elf *__elf, size_t __phnum);
209 
210 /* Get compression header of section if any.  Returns NULL and sets
211    elf_errno if the section isn't compressed or an error occurred.  */
212 extern GElf_Chdr *gelf_getchdr (Elf_Scn *__scn, GElf_Chdr *__dst);
213 
214 /* Convert data structure from the representation in the file represented
215    by ELF to their memory representation.  */
216 extern Elf_Data *gelf_xlatetom (Elf *__elf, Elf_Data *__dest,
217 				const Elf_Data *__src, unsigned int __encode);
218 
219 /* Convert data structure from to the representation in memory
220    represented by ELF file representation.  */
221 extern Elf_Data *gelf_xlatetof (Elf *__elf, Elf_Data *__dest,
222 				const Elf_Data *__src, unsigned int __encode);
223 
224 
225 /* Retrieve REL relocation info at the given index.  */
226 extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst);
227 
228 /* Retrieve RELA relocation info at the given index.  */
229 extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst);
230 
231 /* Update REL relocation information at given index.  */
232 extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src);
233 
234 /* Update RELA relocation information at given index.  */
235 extern int gelf_update_rela (Elf_Data *__dst, int __ndx, GElf_Rela *__src);
236 
237 
238 /* Retrieve symbol information from the symbol table at the given index.  */
239 extern GElf_Sym *gelf_getsym (Elf_Data *__data, int __ndx, GElf_Sym *__dst);
240 
241 /* Update symbol information in the symbol table at the given index.  */
242 extern int gelf_update_sym (Elf_Data *__data, int __ndx, GElf_Sym *__src);
243 
244 
245 /* Retrieve symbol information and separate section index from the
246    symbol table at the given index.  */
247 extern GElf_Sym *gelf_getsymshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
248 				   int __ndx, GElf_Sym *__sym,
249 				   Elf32_Word *__xshndx);
250 
251 /* Update symbol information and separate section index in the symbol
252    table at the given index.  */
253 extern int gelf_update_symshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
254 				 int __ndx, GElf_Sym *__sym,
255 				 Elf32_Word __xshndx);
256 
257 
258 /* Retrieve additional symbol information from the symbol table at the
259    given index.  */
260 extern GElf_Syminfo *gelf_getsyminfo (Elf_Data *__data, int __ndx,
261 				      GElf_Syminfo *__dst);
262 
263 /* Update additional symbol information in the symbol table at the
264    given index.  */
265 extern int gelf_update_syminfo (Elf_Data *__data, int __ndx,
266 				GElf_Syminfo *__src);
267 
268 
269 /* Get information from dynamic table at the given index.  */
270 extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst);
271 
272 /* Update information in dynamic table at the given index.  */
273 extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src);
274 
275 
276 /* Get move structure at the given index.  */
277 extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst);
278 
279 /* Update move structure at the given index.  */
280 extern int gelf_update_move (Elf_Data *__data, int __ndx,
281 			     GElf_Move *__src);
282 
283 
284 /* Get library from table at the given index.  */
285 extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst);
286 
287 /* Update library in table at the given index.  */
288 extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src);
289 
290 
291 
292 /* Retrieve symbol version information at given index.  */
293 extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx,
294 				    GElf_Versym *__dst);
295 
296 /* Update symbol version information.  */
297 extern int gelf_update_versym (Elf_Data *__data, int __ndx,
298 			       GElf_Versym *__src);
299 
300 
301 /* Retrieve required symbol version information at given offset.  */
302 extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset,
303 				      GElf_Verneed *__dst);
304 
305 /* Update required symbol version information.  */
306 extern int gelf_update_verneed (Elf_Data *__data, int __offset,
307 				GElf_Verneed *__src);
308 
309 /* Retrieve additional required symbol version information at given offset.  */
310 extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset,
311 				      GElf_Vernaux *__dst);
312 
313 /* Update additional required symbol version information.  */
314 extern int gelf_update_vernaux (Elf_Data *__data, int __offset,
315 				GElf_Vernaux *__src);
316 
317 
318 /* Retrieve symbol version definition information at given offset.  */
319 extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset,
320 				    GElf_Verdef *__dst);
321 
322 /* Update symbol version definition information.  */
323 extern int gelf_update_verdef (Elf_Data *__data, int __offset,
324 			       GElf_Verdef *__src);
325 
326 /* Retrieve additional symbol version definition information at given
327    offset.  */
328 extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset,
329 				      GElf_Verdaux *__dst);
330 
331 /* Update additional symbol version definition information.  */
332 extern int gelf_update_verdaux (Elf_Data *__data, int __offset,
333 				GElf_Verdaux *__src);
334 
335 
336 /* Get auxv entry at the given index.  */
337 extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx,
338 				  GElf_auxv_t *__dst);
339 
340 /* Update auxv entry at the given index.  */
341 extern int gelf_update_auxv (Elf_Data *__data, int __ndx, GElf_auxv_t *__src);
342 
343 
344 /* Get note header at the given offset into the data, and the offsets of
345    the note's name and descriptor data.  Returns the offset of the next
346    note header, or 0 for an invalid offset or corrupt note header.  */
347 extern size_t gelf_getnote (Elf_Data *__data, size_t __offset,
348 			    GElf_Nhdr *__result,
349 			    size_t *__name_offset, size_t *__desc_offset);
350 
351 
352 /* Compute simple checksum from permanent parts of the ELF file.  */
353 extern long int gelf_checksum (Elf *__elf);
354 
355 #ifdef __cplusplus
356 }
357 #endif
358 
359 #endif	/* gelf.h */
360