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