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
36extern "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.  */
44typedef Elf64_Half GElf_Half;
45
46/* Types for signed and unsigned 32-bit quantities.  */
47typedef Elf64_Word GElf_Word;
48typedef	Elf64_Sword GElf_Sword;
49
50/* Types for signed and unsigned 64-bit quantities.  */
51typedef Elf64_Xword GElf_Xword;
52typedef	Elf64_Sxword GElf_Sxword;
53
54/* Type of addresses.  */
55typedef Elf64_Addr GElf_Addr;
56
57/* Type of file offsets.  */
58typedef Elf64_Off GElf_Off;
59
60
61/* The ELF file header.  This appears at the start of every ELF file.  */
62typedef Elf64_Ehdr GElf_Ehdr;
63
64/* Section header.  */
65typedef Elf64_Shdr GElf_Shdr;
66
67/* Section index.  */
68/* XXX This should probably be a larger type in preparation of times when
69   regular section indices can be larger.  */
70typedef Elf64_Section GElf_Section;
71
72/* Symbol table entry.  */
73typedef Elf64_Sym GElf_Sym;
74
75/* The syminfo section if available contains additional information about
76   every dynamic symbol.  */
77typedef Elf64_Syminfo GElf_Syminfo;
78
79/* Relocation table entry without addend (in section of type SHT_REL).  */
80typedef Elf64_Rel GElf_Rel;
81
82/* Relocation table entry with addend (in section of type SHT_RELA).  */
83typedef Elf64_Rela GElf_Rela;
84
85/* Program segment header.  */
86typedef Elf64_Phdr GElf_Phdr;
87
88/* Header of a compressed section.  */
89typedef Elf64_Chdr GElf_Chdr;
90
91/* Dynamic section entry.  */
92typedef Elf64_Dyn GElf_Dyn;
93
94
95/* Version definition sections.  */
96typedef Elf64_Verdef GElf_Verdef;
97
98/* Auxialiary version information.  */
99typedef Elf64_Verdaux GElf_Verdaux;
100
101/* Version dependency section.  */
102typedef Elf64_Verneed GElf_Verneed;
103
104/* Auxiliary needed version information.  */
105typedef Elf64_Vernaux GElf_Vernaux;
106
107
108/* Type for version symbol information.  */
109typedef Elf64_Versym GElf_Versym;
110
111
112/* Auxiliary vector.  */
113typedef Elf64_auxv_t GElf_auxv_t;
114
115
116/* Note section contents.  */
117typedef Elf64_Nhdr GElf_Nhdr;
118
119
120/* Move structure.  */
121typedef Elf64_Move GElf_Move;
122
123
124/* Library list structure.  */
125typedef Elf64_Lib GElf_Lib;
126
127
128/* How to extract and insert information held in the st_info field.  */
129
130#define GELF_ST_BIND(val)		ELF64_ST_BIND (val)
131#define GELF_ST_TYPE(val)		ELF64_ST_TYPE (val)
132#define GELF_ST_INFO(bind, type)	ELF64_ST_INFO (bind, type)
133
134/* How to extract information held in the st_other field.  */
135
136#define GELF_ST_VISIBILITY(val)		ELF64_ST_VISIBILITY (val)
137
138
139/* How to extract and insert information held in the r_info field.  */
140
141#define GELF_R_SYM(info)		ELF64_R_SYM (info)
142#define GELF_R_TYPE(info)		ELF64_R_TYPE (info)
143#define GELF_R_INFO(sym, type)		ELF64_R_INFO (sym, type)
144
145
146/* How to extract and insert information held in the m_info field.  */
147#define GELF_M_SYM(info)		ELF64_M_SYM (info)
148#define GELF_M_SIZE(info)		ELF64_M_SIZE (info)
149#define GELF_M_INFO(sym, size)		ELF64_M_INFO (sym, size)
150
151
152/* Get class of the file associated with ELF.  */
153extern int gelf_getclass (Elf *__elf);
154
155
156/* Return size of array of COUNT elements of the type denoted by TYPE
157   in the external representation.  The binary class is taken from ELF.
158   The result is based on version VERSION of the ELF standard.  */
159extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
160			  unsigned int __version);
161
162/* Retrieve object file header.  */
163extern GElf_Ehdr *gelf_getehdr (Elf *__elf, GElf_Ehdr *__dest);
164
165/* Update the ELF header.  */
166extern int gelf_update_ehdr (Elf *__elf, GElf_Ehdr *__src);
167
168/* Create new ELF header if none exists.  */
169extern unsigned long int gelf_newehdr (Elf *__elf, int __class);
170
171/* Get section at OFFSET.  */
172extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset);
173
174/* Retrieve section header.  */
175extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst);
176
177/* Update section header.  */
178extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src);
179
180/* Retrieve program header table entry.  */
181extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst);
182
183/* Update the program header.  */
184extern int gelf_update_phdr (Elf *__elf, int __ndx, GElf_Phdr *__src);
185
186/* Create new program header with PHNUM entries.  */
187extern unsigned long int gelf_newphdr (Elf *__elf, size_t __phnum);
188
189/* Get compression header of section if any.  Returns NULL and sets
190   elf_errno if the section isn't compressed or an error occurred.  */
191extern GElf_Chdr *gelf_getchdr (Elf_Scn *__scn, GElf_Chdr *__dst);
192
193/* Convert data structure from the representation in the file represented
194   by ELF to their memory representation.  */
195extern Elf_Data *gelf_xlatetom (Elf *__elf, Elf_Data *__dest,
196				const Elf_Data *__src, unsigned int __encode);
197
198/* Convert data structure from to the representation in memory
199   represented by ELF file representation.  */
200extern Elf_Data *gelf_xlatetof (Elf *__elf, Elf_Data *__dest,
201				const Elf_Data *__src, unsigned int __encode);
202
203
204/* Retrieve REL relocation info at the given index.  */
205extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst);
206
207/* Retrieve RELA relocation info at the given index.  */
208extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst);
209
210/* Update REL relocation information at given index.  */
211extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src);
212
213/* Update RELA relocation information at given index.  */
214extern int gelf_update_rela (Elf_Data *__dst, int __ndx, GElf_Rela *__src);
215
216
217/* Retrieve symbol information from the symbol table at the given index.  */
218extern GElf_Sym *gelf_getsym (Elf_Data *__data, int __ndx, GElf_Sym *__dst);
219
220/* Update symbol information in the symbol table at the given index.  */
221extern int gelf_update_sym (Elf_Data *__data, int __ndx, GElf_Sym *__src);
222
223
224/* Retrieve symbol information and separate section index from the
225   symbol table at the given index.  */
226extern GElf_Sym *gelf_getsymshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
227				   int __ndx, GElf_Sym *__sym,
228				   Elf32_Word *__xshndx);
229
230/* Update symbol information and separate section index in the symbol
231   table at the given index.  */
232extern int gelf_update_symshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
233				 int __ndx, GElf_Sym *__sym,
234				 Elf32_Word __xshndx);
235
236
237/* Retrieve additional symbol information from the symbol table at the
238   given index.  */
239extern GElf_Syminfo *gelf_getsyminfo (Elf_Data *__data, int __ndx,
240				      GElf_Syminfo *__dst);
241
242/* Update additional symbol information in the symbol table at the
243   given index.  */
244extern int gelf_update_syminfo (Elf_Data *__data, int __ndx,
245				GElf_Syminfo *__src);
246
247
248/* Get information from dynamic table at the given index.  */
249extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst);
250
251/* Update information in dynamic table at the given index.  */
252extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src);
253
254
255/* Get move structure at the given index.  */
256extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst);
257
258/* Update move structure at the given index.  */
259extern int gelf_update_move (Elf_Data *__data, int __ndx,
260			     GElf_Move *__src);
261
262
263/* Get library from table at the given index.  */
264extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst);
265
266/* Update library in table at the given index.  */
267extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src);
268
269
270
271/* Retrieve symbol version information at given index.  */
272extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx,
273				    GElf_Versym *__dst);
274
275/* Update symbol version information.  */
276extern int gelf_update_versym (Elf_Data *__data, int __ndx,
277			       GElf_Versym *__src);
278
279
280/* Retrieve required symbol version information at given offset.  */
281extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset,
282				      GElf_Verneed *__dst);
283
284/* Update required symbol version information.  */
285extern int gelf_update_verneed (Elf_Data *__data, int __offset,
286				GElf_Verneed *__src);
287
288/* Retrieve additional required symbol version information at given offset.  */
289extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset,
290				      GElf_Vernaux *__dst);
291
292/* Update additional required symbol version information.  */
293extern int gelf_update_vernaux (Elf_Data *__data, int __offset,
294				GElf_Vernaux *__src);
295
296
297/* Retrieve symbol version definition information at given offset.  */
298extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset,
299				    GElf_Verdef *__dst);
300
301/* Update symbol version definition information.  */
302extern int gelf_update_verdef (Elf_Data *__data, int __offset,
303			       GElf_Verdef *__src);
304
305/* Retrieve additional symbol version definition information at given
306   offset.  */
307extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset,
308				      GElf_Verdaux *__dst);
309
310/* Update additional symbol version definition information.  */
311extern int gelf_update_verdaux (Elf_Data *__data, int __offset,
312				GElf_Verdaux *__src);
313
314
315/* Get auxv entry at the given index.  */
316extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx,
317				  GElf_auxv_t *__dst);
318
319/* Update auxv entry at the given index.  */
320extern int gelf_update_auxv (Elf_Data *__data, int __ndx, GElf_auxv_t *__src);
321
322
323/* Get note header at the given offset into the data, and the offsets of
324   the note's name and descriptor data.  Returns the offset of the next
325   note header, or 0 for an invalid offset or corrupt note header.  */
326extern size_t gelf_getnote (Elf_Data *__data, size_t __offset,
327			    GElf_Nhdr *__result,
328			    size_t *__name_offset, size_t *__desc_offset);
329
330
331/* Compute simple checksum from permanent parts of the ELF file.  */
332extern long int gelf_checksum (Elf *__elf);
333
334#ifdef __cplusplus
335}
336#endif
337
338#endif	/* gelf.h */
339