Avoid double-including config.h
[platform/upstream/elfutils.git] / libelf / gelf.h
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 /* XXX This should probably be a larger type in preparation of times when
69    regular section indices can be larger.  */
70 typedef Elf64_Section GElf_Section;
71
72 /* Symbol table entry.  */
73 typedef Elf64_Sym GElf_Sym;
74
75 /* The syminfo section if available contains additional information about
76    every dynamic symbol.  */
77 typedef Elf64_Syminfo GElf_Syminfo;
78
79 /* Relocation table entry without addend (in section of type SHT_REL).  */
80 typedef Elf64_Rel GElf_Rel;
81
82 /* Relocation table entry with addend (in section of type SHT_RELA).  */
83 typedef Elf64_Rela GElf_Rela;
84
85 /* Program segment header.  */
86 typedef Elf64_Phdr GElf_Phdr;
87
88 /* Header of a compressed section.  */
89 typedef Elf64_Chdr GElf_Chdr;
90
91 /* Dynamic section entry.  */
92 typedef Elf64_Dyn GElf_Dyn;
93
94
95 /* Version definition sections.  */
96 typedef Elf64_Verdef GElf_Verdef;
97
98 /* Auxialiary version information.  */
99 typedef Elf64_Verdaux GElf_Verdaux;
100
101 /* Version dependency section.  */
102 typedef Elf64_Verneed GElf_Verneed;
103
104 /* Auxiliary needed version information.  */
105 typedef Elf64_Vernaux GElf_Vernaux;
106
107
108 /* Type for version symbol information.  */
109 typedef Elf64_Versym GElf_Versym;
110
111
112 /* Auxiliary vector.  */
113 typedef Elf64_auxv_t GElf_auxv_t;
114
115
116 /* Note section contents.  */
117 typedef Elf64_Nhdr GElf_Nhdr;
118
119
120 /* Move structure.  */
121 typedef Elf64_Move GElf_Move;
122
123
124 /* Library list structure.  */
125 typedef 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.  */
153 extern 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.  */
159 extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
160                           unsigned int __version);
161
162 /* Retrieve object file header.  */
163 extern GElf_Ehdr *gelf_getehdr (Elf *__elf, GElf_Ehdr *__dest);
164
165 /* Update the ELF header.  */
166 extern 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.  */
171 extern void *gelf_newehdr (Elf *__elf, int __class);
172
173 /* Get section at OFFSET.  */
174 extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset);
175
176 /* Retrieve section header.  */
177 extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst);
178
179 /* Update section header.  */
180 extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src);
181
182 /* Retrieve program header table entry.  */
183 extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst);
184
185 /* Update the program header.  */
186 extern 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.  */
191 extern 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.  */
195 extern 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.  */
199 extern 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.  */
204 extern 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.  */
209 extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst);
210
211 /* Retrieve RELA relocation info at the given index.  */
212 extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst);
213
214 /* Update REL relocation information at given index.  */
215 extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src);
216
217 /* Update RELA relocation information at given index.  */
218 extern 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.  */
222 extern 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.  */
225 extern 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.  */
230 extern 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.  */
236 extern 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.  */
243 extern 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.  */
248 extern 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.  */
253 extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst);
254
255 /* Update information in dynamic table at the given index.  */
256 extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src);
257
258
259 /* Get move structure at the given index.  */
260 extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst);
261
262 /* Update move structure at the given index.  */
263 extern int gelf_update_move (Elf_Data *__data, int __ndx,
264                              GElf_Move *__src);
265
266
267 /* Get library from table at the given index.  */
268 extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst);
269
270 /* Update library in table at the given index.  */
271 extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src);
272
273
274
275 /* Retrieve symbol version information at given index.  */
276 extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx,
277                                     GElf_Versym *__dst);
278
279 /* Update symbol version information.  */
280 extern int gelf_update_versym (Elf_Data *__data, int __ndx,
281                                GElf_Versym *__src);
282
283
284 /* Retrieve required symbol version information at given offset.  */
285 extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset,
286                                       GElf_Verneed *__dst);
287
288 /* Update required symbol version information.  */
289 extern int gelf_update_verneed (Elf_Data *__data, int __offset,
290                                 GElf_Verneed *__src);
291
292 /* Retrieve additional required symbol version information at given offset.  */
293 extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset,
294                                       GElf_Vernaux *__dst);
295
296 /* Update additional required symbol version information.  */
297 extern int gelf_update_vernaux (Elf_Data *__data, int __offset,
298                                 GElf_Vernaux *__src);
299
300
301 /* Retrieve symbol version definition information at given offset.  */
302 extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset,
303                                     GElf_Verdef *__dst);
304
305 /* Update symbol version definition information.  */
306 extern 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.  */
311 extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset,
312                                       GElf_Verdaux *__dst);
313
314 /* Update additional symbol version definition information.  */
315 extern int gelf_update_verdaux (Elf_Data *__data, int __offset,
316                                 GElf_Verdaux *__src);
317
318
319 /* Get auxv entry at the given index.  */
320 extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx,
321                                   GElf_auxv_t *__dst);
322
323 /* Update auxv entry at the given index.  */
324 extern 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.  */
330 extern 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.  */
336 extern long int gelf_checksum (Elf *__elf);
337
338 #ifdef __cplusplus
339 }
340 #endif
341
342 #endif  /* gelf.h */