blob: 5b3dc00b4affabb5b2cf6a2b0c0dfc0f5df714f4 [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* Interface for libelf.
2 Copyright (C) 1998, 1999, 2000, 2002, 2004 Red Hat, Inc.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, version 2.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software Foundation,
15 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
16
17#ifndef _LIBELF_H
18#define _LIBELF_H 1
19
20#include <sys/types.h>
21
22/* Get the ELF types. */
23#include <elf.h>
24
25
26/* Known translation types. */
27typedef enum
28{
29 ELF_T_BYTE, /* unsigned char */
30 ELF_T_ADDR, /* Elf32_Addr, Elf64_Addr, ... */
31 ELF_T_DYN, /* Dynamic section record. */
32 ELF_T_EHDR, /* ELF header. */
33 ELF_T_HALF, /* Elf32_Half, Elf64_Half, ... */
34 ELF_T_OFF, /* Elf32_Off, Elf64_Off, ... */
35 ELF_T_PHDR, /* Program header. */
36 ELF_T_RELA, /* Relocation entry with addend. */
37 ELF_T_REL, /* Relocation entry. */
38 ELF_T_SHDR, /* Section header. */
39 ELF_T_SWORD, /* Elf32_Sword, Elf64_Sword, ... */
40 ELF_T_SYM, /* Symbol record. */
41 ELF_T_WORD, /* Elf32_Word, Elf64_Word, ... */
42 ELF_T_XWORD, /* Elf32_Xword, Elf64_Xword, ... */
43 ELF_T_SXWORD, /* Elf32_Sxword, Elf64_Sxword, ... */
44 ELF_T_VDEF, /* Elf32_Verdef, Elf64_Verdef, ... */
45 ELF_T_VDAUX, /* Elf32_Verdaux, Elf64_Verdaux, ... */
46 ELF_T_VNEED, /* Elf32_Verneed, Elf64_Verneed, ... */
47 ELF_T_VNAUX, /* Elf32_Vernaux, Elf64_Vernaux, ... */
48 ELF_T_NHDR, /* Elf32_Nhdr, Elf64_Nhdr, ... */
49 ELF_T_SYMINFO, /* Elf32_Syminfo, Elf64_Syminfo, ... */
50 ELF_T_MOVE, /* Elf32_Move, Elf64_Move, ... */
51 ELF_T_LIB, /* Elf32_Lib, Elf64_Lib, ... */
52 /* Keep this the last entry. */
53 ELF_T_NUM
54} Elf_Type;
55
56/* Descriptor for data to be converted to or from memory format. */
57typedef struct
58{
59 void *d_buf; /* Pointer to the actual data. */
60 Elf_Type d_type; /* Type of this piece of data. */
61 unsigned int d_version; /* ELF version. */
62 size_t d_size; /* Size in bytes. */
63 off_t d_off; /* Offset into section. */
64 size_t d_align; /* Alignment in section. */
65} Elf_Data;
66
67
68/* Commands for `...'. */
69typedef enum
70{
71 ELF_C_NULL, /* Nothing, terminate, or compute only. */
72 ELF_C_READ, /* Read .. */
73 ELF_C_RDWR, /* Read and write .. */
74 ELF_C_WRITE, /* Write .. */
75 ELF_C_CLR, /* Clear flag. */
76 ELF_C_SET, /* Set flag. */
77 ELF_C_FDDONE, /* Signal that file descriptor will not be
78 used anymore. */
79 ELF_C_FDREAD, /* Read rest of data so that file descriptor
80 is not used anymore. */
81 /* The following are extensions. */
82 ELF_C_READ_MMAP, /* Read, but mmap the file if possible. */
83 ELF_C_RDWR_MMAP, /* Read and write, with mmap. */
84 ELF_C_WRITE_MMAP, /* Write, with mmap. */
85 ELF_C_READ_MMAP_PRIVATE, /* Read, but memory is writable, results are
86 not written to the file. */
87 ELF_C_EMPTY, /* Copy basic file data but not the content. */
88 /* Keep this the last entry. */
89 ELF_C_NUM
90} Elf_Cmd;
91
92
93/* Flags for the ELF structures. */
94enum
95{
96 ELF_F_DIRTY = 0x1,
97#define ELF_F_DIRTY ELF_F_DIRTY
98 ELF_F_LAYOUT = 0x4,
99#define ELF_F_LAYOUT ELF_F_LAYOUT
100 ELF_F_PERMISSIVE = 0x8
101#define ELF_F_PERMISSIVE ELF_F_PERMISSIVE
102};
103
104
105/* Identification values for recognized object files. */
106typedef enum
107{
108 ELF_K_NONE, /* Unknown. */
109 ELF_K_AR, /* Archive. */
110 ELF_K_COFF, /* Stupid old COFF. */
111 ELF_K_ELF, /* ELF file. */
112 /* Keep this the last entry. */
113 ELF_K_NUM
114} Elf_Kind;
115
116
117/* Archive member header. */
118typedef struct
119{
120 char *ar_name; /* Name of archive member. */
121 time_t ar_date; /* File date. */
122 uid_t ar_uid; /* User ID. */
123 gid_t ar_gid; /* Group ID. */
124 mode_t ar_mode; /* File mode. */
125 off_t ar_size; /* File size. */
126 char *ar_rawname; /* Original name of archive member. */
127} Elf_Arhdr;
128
129
130/* Archive symbol table entry. */
131typedef struct
132{
133 char *as_name; /* Symbol name. */
134 size_t as_off; /* Offset for this file in the archive. */
135 unsigned long int as_hash; /* Hash value of the name. */
136} Elf_Arsym;
137
138
139/* Descriptor for the ELF file. */
140typedef struct Elf Elf;
141
142/* Descriptor for ELF file section. */
143typedef struct Elf_Scn Elf_Scn;
144
145
146#ifdef __cplusplus
147extern "C" {
148#endif
149
150/* Return descriptor for ELF file to work according to CMD. */
151extern Elf *elf_begin (int __fildes, Elf_Cmd __cmd, Elf *__ref);
152
153/* Create a clone of an existing ELF descriptor. */
154 extern Elf *elf_clone (Elf *__elf, Elf_Cmd __cmd);
155
156/* Create descriptor for memory region. */
157extern Elf *elf_memory (char *__image, size_t __size);
158
159/* Advance archive descriptor to next element. */
160extern Elf_Cmd elf_next (Elf *__elf);
161
162/* Free resources allocated for ELF. */
163extern int elf_end (Elf *__elf);
164
165/* Update ELF descriptor and write file to disk. */
166extern off_t elf_update (Elf *__elf, Elf_Cmd __cmd);
167
168/* Determine what kind of file is associated with ELF. */
169extern Elf_Kind elf_kind (Elf *__elf) __attribute__ ((__pure__));
170
171/* Get the base offset for an object file. */
172extern off_t elf_getbase (Elf *__elf);
173
174
175/* Retrieve file identification data. */
176extern char *elf_getident (Elf *__elf, size_t *__ptr);
177
178/* Retrieve class-dependent object file header. */
179extern Elf32_Ehdr *elf32_getehdr (Elf *__elf);
180/* Similar but this time the binary calls is ELFCLASS64. */
181extern Elf64_Ehdr *elf64_getehdr (Elf *__elf);
182
183/* Create ELF header if none exists. */
184extern Elf32_Ehdr *elf32_newehdr (Elf *__elf);
185/* Similar but this time the binary calls is ELFCLASS64. */
186extern Elf64_Ehdr *elf64_newehdr (Elf *__elf);
187
188/* Retrieve class-dependent program header table. */
189extern Elf32_Phdr *elf32_getphdr (Elf *__elf);
190/* Similar but this time the binary calls is ELFCLASS64. */
191extern Elf64_Phdr *elf64_getphdr (Elf *__elf);
192
193/* Create ELF program header. */
194extern Elf32_Phdr *elf32_newphdr (Elf *__elf, size_t __cnt);
195/* Similar but this time the binary calls is ELFCLASS64. */
196extern Elf64_Phdr *elf64_newphdr (Elf *__elf, size_t __cnt);
197
198
199/* Get section at INDEX. */
200extern Elf_Scn *elf_getscn (Elf *__elf, size_t __index);
201
202/* Get index of section. */
203extern size_t elf_ndxscn (Elf_Scn *__scn);
204
205/* Get section with next section index. */
206extern Elf_Scn *elf_nextscn (Elf *__elf, Elf_Scn *__scn);
207
208/* Create a new section and append it at the end of the table. */
209extern Elf_Scn *elf_newscn (Elf *__elf);
210
211/* Get the number of sections in the ELF file. If the file uses more
212 sections than can be represented in the e_shnum field of the ELF
213 header the information from the sh_size field in the zeroth section
214 header is used. */
215extern int elf_getshnum (Elf *__elf, size_t *__dst);
216
217
218/* Get the section index of the section header string table in the ELF
219 file. If the index cannot be represented in the e_shnum field of
220 the ELF header the information from the sh_link field in the zeroth
221 section header is used. */
222extern int elf_getshstrndx (Elf *__elf, size_t *__dst);
223
224
225/* Retrieve section header of ELFCLASS32 binary. */
226extern Elf32_Shdr *elf32_getshdr (Elf_Scn *__scn);
227/* Similar for ELFCLASS64. */
228extern Elf64_Shdr *elf64_getshdr (Elf_Scn *__scn);
229
230
231/* Set or clear flags for ELF file. */
232extern unsigned int elf_flagelf (Elf *__elf, Elf_Cmd __cmd,
233 unsigned int __flags);
234/* Similarly for the ELF header. */
235extern unsigned int elf_flagehdr (Elf *__elf, Elf_Cmd __cmd,
236 unsigned int __flags);
237/* Similarly for the ELF program header. */
238extern unsigned int elf_flagphdr (Elf *__elf, Elf_Cmd __cmd,
239 unsigned int __flags);
240/* Similarly for the given ELF section. */
241extern unsigned int elf_flagscn (Elf_Scn *__scn, Elf_Cmd __cmd,
242 unsigned int __flags);
243/* Similarly for the given ELF data. */
244extern unsigned int elf_flagdata (Elf_Data *__data, Elf_Cmd __cmd,
245 unsigned int __flags);
246/* Similarly for the given ELF section header. */
247extern unsigned int elf_flagshdr (Elf_Scn *__scn, Elf_Cmd __cmd,
248 unsigned int __flags);
249
250
251/* Get data from section while translating from file representation
252 to memory representation. */
253extern Elf_Data *elf_getdata (Elf_Scn *__scn, Elf_Data *__data);
254
255/* Get uninterpreted section content. */
256extern Elf_Data *elf_rawdata (Elf_Scn *__scn, Elf_Data *__data);
257
258/* Create new data descriptor for section SCN. */
259extern Elf_Data *elf_newdata (Elf_Scn *__scn);
260
261
262/* Return pointer to string at OFFSET in section INDEX. */
263extern char *elf_strptr (Elf *__elf, size_t __index, size_t __offset);
264
265
266/* Return header of archive. */
267extern Elf_Arhdr *elf_getarhdr (Elf *__elf);
268
269/* Select archive element at OFFSET. */
270extern size_t elf_rand (Elf *__elf, size_t __offset);
271
272/* Get symbol table of archhive. */
273extern Elf_Arsym *elf_getarsym (Elf *__elf, size_t *__ptr);
274
275
276/* Control ELF descriptor. */
277extern int elf_cntl (Elf *__elf, Elf_Cmd __cmd);
278
279/* Retrieve uninterpreted file contents. */
280extern char *elf_rawfile (Elf *__elf, size_t *__ptr);
281
282
283/* Return size of array of COUNT elements of the type denoted by TYPE
284 in the external representation. The binary class is taken from ELF.
285 The result is based on version VERSION of the ELF standard. */
286extern size_t elf32_fsize (Elf_Type __type, size_t __count,
287 unsigned int __version)
288 __attribute__ ((__const__));
289/* Similar but this time the binary calls is ELFCLASS64. */
290extern size_t elf64_fsize (Elf_Type __type, size_t __count,
291 unsigned int __version)
292 __attribute__ ((__const__));
293
294
295/* Convert data structure from the representation in the file represented
296 by ELF to their memory representation. */
297extern Elf_Data *elf32_xlatetom (Elf_Data *__dest, const Elf_Data *__src,
298 unsigned int __encode);
299/* Same for 64 bit class. */
300extern Elf_Data *elf64_xlatetom (Elf_Data *__dest, const Elf_Data *__src,
301 unsigned int __encode);
302
303/* Convert data structure from to the representation in memory
304 represented by ELF file representation. */
305extern Elf_Data *elf32_xlatetof (Elf_Data *__dest, const Elf_Data *__src,
306 unsigned int __encode);
307/* Same for 64 bit class. */
308extern Elf_Data *elf64_xlatetof (Elf_Data *__dest, const Elf_Data *__src,
309 unsigned int __encode);
310
311
312/* Return error code of last failing function call. This value is kept
313 separately for each thread. */
314extern int elf_errno (void);
315
316/* Return error string for ERROR. If ERROR is zero, return error string
317 for most recent error or NULL is none occurred. If ERROR is -1 the
318 behaviour is similar to the last case except that not NULL but a legal
319 string is returned. */
320extern const char *elf_errmsg (int __error);
321
322
323/* Coordinate ELF library and application versions. */
324extern unsigned int elf_version (unsigned int __version);
325
326/* Set fill bytes used to fill holes in data structures. */
327extern void elf_fill (int __fill);
328
329/* Compute hash value. */
330extern unsigned long int elf_hash (const char *__string)
331 __attribute__ ((__pure__));
332
333
334/* Compute simple checksum from permanent parts of the ELF file. */
335extern long int elf32_checksum (Elf *__elf);
336/* Similar but this time the binary calls is ELFCLASS64. */
337extern long int elf64_checksum (Elf *__elf);
338
339#ifdef __cplusplus
340}
341#endif
342
343#endif /* libelf.h */