blob: 061988037784d01265ff4a2eb67efb1f31a13f6e [file] [log] [blame]
Brian Silverman86497922018-02-10 19:28:39 -05001/* 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. Creates an Elf32_Ehdr if CLASS
169 is ELFCLASS32 or an Elf64_Ehdr if CLASS is ELFCLASS64. Returns NULL
170 on error. */
171extern void *gelf_newehdr (Elf *__elf, int __class);
172
173/* Get section at OFFSET. */
174extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset);
175
176/* Retrieve section header. */
177extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst);
178
179/* Update section header. */
180extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src);
181
182/* Retrieve program header table entry. */
183extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst);
184
185/* Update the program header. */
186extern int gelf_update_phdr (Elf *__elf, int __ndx, GElf_Phdr *__src);
187
188/* Create new program header with PHNUM entries. Creates either an
189 Elf32_Phdr or an Elf64_Phdr depending on whether the given ELF is
190 ELFCLASS32 or ELFCLASS64. Returns NULL on error. */
191extern void *gelf_newphdr (Elf *__elf, size_t __phnum);
192
193/* Get compression header of section if any. Returns NULL and sets
194 elf_errno if the section isn't compressed or an error occurred. */
195extern GElf_Chdr *gelf_getchdr (Elf_Scn *__scn, GElf_Chdr *__dst);
196
197/* Convert data structure from the representation in the file represented
198 by ELF to their memory representation. */
199extern Elf_Data *gelf_xlatetom (Elf *__elf, Elf_Data *__dest,
200 const Elf_Data *__src, unsigned int __encode);
201
202/* Convert data structure from to the representation in memory
203 represented by ELF file representation. */
204extern Elf_Data *gelf_xlatetof (Elf *__elf, Elf_Data *__dest,
205 const Elf_Data *__src, unsigned int __encode);
206
207
208/* Retrieve REL relocation info at the given index. */
209extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst);
210
211/* Retrieve RELA relocation info at the given index. */
212extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst);
213
214/* Update REL relocation information at given index. */
215extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src);
216
217/* Update RELA relocation information at given index. */
218extern int gelf_update_rela (Elf_Data *__dst, int __ndx, GElf_Rela *__src);
219
220
221/* Retrieve symbol information from the symbol table at the given index. */
222extern GElf_Sym *gelf_getsym (Elf_Data *__data, int __ndx, GElf_Sym *__dst);
223
224/* Update symbol information in the symbol table at the given index. */
225extern int gelf_update_sym (Elf_Data *__data, int __ndx, GElf_Sym *__src);
226
227
228/* Retrieve symbol information and separate section index from the
229 symbol table at the given index. */
230extern GElf_Sym *gelf_getsymshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
231 int __ndx, GElf_Sym *__sym,
232 Elf32_Word *__xshndx);
233
234/* Update symbol information and separate section index in the symbol
235 table at the given index. */
236extern int gelf_update_symshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
237 int __ndx, GElf_Sym *__sym,
238 Elf32_Word __xshndx);
239
240
241/* Retrieve additional symbol information from the symbol table at the
242 given index. */
243extern GElf_Syminfo *gelf_getsyminfo (Elf_Data *__data, int __ndx,
244 GElf_Syminfo *__dst);
245
246/* Update additional symbol information in the symbol table at the
247 given index. */
248extern int gelf_update_syminfo (Elf_Data *__data, int __ndx,
249 GElf_Syminfo *__src);
250
251
252/* Get information from dynamic table at the given index. */
253extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst);
254
255/* Update information in dynamic table at the given index. */
256extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src);
257
258
259/* Get move structure at the given index. */
260extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst);
261
262/* Update move structure at the given index. */
263extern int gelf_update_move (Elf_Data *__data, int __ndx,
264 GElf_Move *__src);
265
266
267/* Get library from table at the given index. */
268extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst);
269
270/* Update library in table at the given index. */
271extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src);
272
273
274
275/* Retrieve symbol version information at given index. */
276extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx,
277 GElf_Versym *__dst);
278
279/* Update symbol version information. */
280extern int gelf_update_versym (Elf_Data *__data, int __ndx,
281 GElf_Versym *__src);
282
283
284/* Retrieve required symbol version information at given offset. */
285extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset,
286 GElf_Verneed *__dst);
287
288/* Update required symbol version information. */
289extern int gelf_update_verneed (Elf_Data *__data, int __offset,
290 GElf_Verneed *__src);
291
292/* Retrieve additional required symbol version information at given offset. */
293extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset,
294 GElf_Vernaux *__dst);
295
296/* Update additional required symbol version information. */
297extern int gelf_update_vernaux (Elf_Data *__data, int __offset,
298 GElf_Vernaux *__src);
299
300
301/* Retrieve symbol version definition information at given offset. */
302extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset,
303 GElf_Verdef *__dst);
304
305/* Update symbol version definition information. */
306extern int gelf_update_verdef (Elf_Data *__data, int __offset,
307 GElf_Verdef *__src);
308
309/* Retrieve additional symbol version definition information at given
310 offset. */
311extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset,
312 GElf_Verdaux *__dst);
313
314/* Update additional symbol version definition information. */
315extern int gelf_update_verdaux (Elf_Data *__data, int __offset,
316 GElf_Verdaux *__src);
317
318
319/* Get auxv entry at the given index. */
320extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx,
321 GElf_auxv_t *__dst);
322
323/* Update auxv entry at the given index. */
324extern int gelf_update_auxv (Elf_Data *__data, int __ndx, GElf_auxv_t *__src);
325
326
327/* Get note header at the given offset into the data, and the offsets of
328 the note's name and descriptor data. Returns the offset of the next
329 note header, or 0 for an invalid offset or corrupt note header. */
330extern size_t gelf_getnote (Elf_Data *__data, size_t __offset,
331 GElf_Nhdr *__result,
332 size_t *__name_offset, size_t *__desc_offset);
333
334
335/* Compute simple checksum from permanent parts of the ELF file. */
336extern long int gelf_checksum (Elf *__elf);
337
338#ifdef __cplusplus
339}
340#endif
341
342#endif /* gelf.h */