• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* 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.  */
27 typedef 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.  */
57 typedef 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 `...'.  */
69 typedef 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.  */
94 enum
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.  */
106 typedef 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.  */
118 typedef 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.  */
131 typedef 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.  */
140 typedef struct Elf Elf;
141 
142 /* Descriptor for ELF file section.  */
143 typedef struct Elf_Scn Elf_Scn;
144 
145 
146 #ifdef __cplusplus
147 extern "C" {
148 #endif
149 
150 /* Return descriptor for ELF file to work according to CMD.  */
151 extern 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.  */
157 extern Elf *elf_memory (char *__image, size_t __size);
158 
159 /* Advance archive descriptor to next element.  */
160 extern Elf_Cmd elf_next (Elf *__elf);
161 
162 /* Free resources allocated for ELF.  */
163 extern int elf_end (Elf *__elf);
164 
165 /* Update ELF descriptor and write file to disk.  */
166 extern off_t elf_update (Elf *__elf, Elf_Cmd __cmd);
167 
168 /* Determine what kind of file is associated with ELF.  */
169 extern Elf_Kind elf_kind (Elf *__elf) __attribute__ ((__pure__));
170 
171 /* Get the base offset for an object file.  */
172 extern off_t elf_getbase (Elf *__elf);
173 
174 
175 /* Retrieve file identification data.  */
176 extern char *elf_getident (Elf *__elf, size_t *__ptr);
177 
178 /* Retrieve class-dependent object file header.  */
179 extern Elf32_Ehdr *elf32_getehdr (Elf *__elf);
180 /* Similar but this time the binary calls is ELFCLASS64.  */
181 extern Elf64_Ehdr *elf64_getehdr (Elf *__elf);
182 
183 /* Create ELF header if none exists.  */
184 extern Elf32_Ehdr *elf32_newehdr (Elf *__elf);
185 /* Similar but this time the binary calls is ELFCLASS64.  */
186 extern Elf64_Ehdr *elf64_newehdr (Elf *__elf);
187 
188 /* Retrieve class-dependent program header table.  */
189 extern Elf32_Phdr *elf32_getphdr (Elf *__elf);
190 /* Similar but this time the binary calls is ELFCLASS64.  */
191 extern Elf64_Phdr *elf64_getphdr (Elf *__elf);
192 
193 /* Create ELF program header.  */
194 extern Elf32_Phdr *elf32_newphdr (Elf *__elf, size_t __cnt);
195 /* Similar but this time the binary calls is ELFCLASS64.  */
196 extern Elf64_Phdr *elf64_newphdr (Elf *__elf, size_t __cnt);
197 
198 
199 /* Get section at INDEX.  */
200 extern Elf_Scn *elf_getscn (Elf *__elf, size_t __index);
201 
202 /* Get index of section.  */
203 extern size_t elf_ndxscn (Elf_Scn *__scn);
204 
205 /* Get section with next section index.  */
206 extern Elf_Scn *elf_nextscn (Elf *__elf, Elf_Scn *__scn);
207 
208 /* Create a new section and append it at the end of the table.  */
209 extern 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.  */
215 extern 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.  */
222 extern int elf_getshstrndx (Elf *__elf, size_t *__dst);
223 
224 
225 /* Retrieve section header of ELFCLASS32 binary.  */
226 extern Elf32_Shdr *elf32_getshdr (Elf_Scn *__scn);
227 /* Similar for ELFCLASS64.  */
228 extern Elf64_Shdr *elf64_getshdr (Elf_Scn *__scn);
229 
230 
231 /* Set or clear flags for ELF file.  */
232 extern unsigned int elf_flagelf (Elf *__elf, Elf_Cmd __cmd,
233 				 unsigned int __flags);
234 /* Similarly for the ELF header.  */
235 extern unsigned int elf_flagehdr (Elf *__elf, Elf_Cmd __cmd,
236 				  unsigned int __flags);
237 /* Similarly for the ELF program header.  */
238 extern unsigned int elf_flagphdr (Elf *__elf, Elf_Cmd __cmd,
239 				  unsigned int __flags);
240 /* Similarly for the given ELF section.  */
241 extern unsigned int elf_flagscn (Elf_Scn *__scn, Elf_Cmd __cmd,
242 				 unsigned int __flags);
243 /* Similarly for the given ELF data.  */
244 extern unsigned int elf_flagdata (Elf_Data *__data, Elf_Cmd __cmd,
245 				  unsigned int __flags);
246 /* Similarly for the given ELF section header.  */
247 extern 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.  */
253 extern Elf_Data *elf_getdata (Elf_Scn *__scn, Elf_Data *__data);
254 
255 /* Get uninterpreted section content.  */
256 extern Elf_Data *elf_rawdata (Elf_Scn *__scn, Elf_Data *__data);
257 
258 /* Create new data descriptor for section SCN.  */
259 extern Elf_Data *elf_newdata (Elf_Scn *__scn);
260 
261 
262 /* Return pointer to string at OFFSET in section INDEX.  */
263 extern char *elf_strptr (Elf *__elf, size_t __index, size_t __offset);
264 
265 
266 /* Return header of archive.  */
267 extern Elf_Arhdr *elf_getarhdr (Elf *__elf);
268 
269 /* Select archive element at OFFSET.  */
270 extern size_t elf_rand (Elf *__elf, size_t __offset);
271 
272 /* Get symbol table of archhive.  */
273 extern Elf_Arsym *elf_getarsym (Elf *__elf, size_t *__ptr);
274 
275 
276 /* Control ELF descriptor.  */
277 extern int elf_cntl (Elf *__elf, Elf_Cmd __cmd);
278 
279 /* Retrieve uninterpreted file contents.  */
280 extern 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.  */
286 extern 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.  */
290 extern 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.  */
297 extern Elf_Data *elf32_xlatetom (Elf_Data *__dest, const Elf_Data *__src,
298 				 unsigned int __encode);
299 /* Same for 64 bit class.  */
300 extern 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.  */
305 extern Elf_Data *elf32_xlatetof (Elf_Data *__dest, const Elf_Data *__src,
306 				 unsigned int __encode);
307 /* Same for 64 bit class.  */
308 extern 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.  */
314 extern 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.  */
320 extern const char *elf_errmsg (int __error);
321 
322 
323 /* Coordinate ELF library and application versions.  */
324 extern unsigned int elf_version (unsigned int __version);
325 
326 /* Set fill bytes used to fill holes in data structures.  */
327 extern void elf_fill (int __fill);
328 
329 /* Compute hash value.  */
330 extern unsigned long int elf_hash (const char *__string)
331        __attribute__ ((__pure__));
332 
333 
334 /* Compute simple checksum from permanent parts of the ELF file.  */
335 extern long int elf32_checksum (Elf *__elf);
336 /* Similar but this time the binary calls is ELFCLASS64.  */
337 extern long int elf64_checksum (Elf *__elf);
338 
339 #ifdef __cplusplus
340 }
341 #endif
342 
343 #endif  /* libelf.h */
344