xref: /openbsd-src/lib/libelf/libelf.h (revision a1b5ec256a03e12d667837fca8bf42f20675916f)
1*a1b5ec25Sjsg /*-
2*a1b5ec25Sjsg  * Copyright (c) 2006,2008-2010 Joseph Koshy
3*a1b5ec25Sjsg  * All rights reserved.
4*a1b5ec25Sjsg  *
5*a1b5ec25Sjsg  * Redistribution and use in source and binary forms, with or without
6*a1b5ec25Sjsg  * modification, are permitted provided that the following conditions
7*a1b5ec25Sjsg  * are met:
8*a1b5ec25Sjsg  * 1. Redistributions of source code must retain the above copyright
9*a1b5ec25Sjsg  *    notice, this list of conditions and the following disclaimer.
10*a1b5ec25Sjsg  * 2. Redistributions in binary form must reproduce the above copyright
11*a1b5ec25Sjsg  *    notice, this list of conditions and the following disclaimer in the
12*a1b5ec25Sjsg  *    documentation and/or other materials provided with the distribution.
13*a1b5ec25Sjsg  *
14*a1b5ec25Sjsg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*a1b5ec25Sjsg  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*a1b5ec25Sjsg  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*a1b5ec25Sjsg  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*a1b5ec25Sjsg  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*a1b5ec25Sjsg  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*a1b5ec25Sjsg  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*a1b5ec25Sjsg  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*a1b5ec25Sjsg  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*a1b5ec25Sjsg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*a1b5ec25Sjsg  * SUCH DAMAGE.
25*a1b5ec25Sjsg  *
26*a1b5ec25Sjsg  * $Id: libelf.h,v 1.1 2019/02/01 05:27:38 jsg Exp $
27*a1b5ec25Sjsg  */
28*a1b5ec25Sjsg 
29*a1b5ec25Sjsg #ifndef	_LIBELF_H_
30*a1b5ec25Sjsg #define	_LIBELF_H_
31*a1b5ec25Sjsg 
32*a1b5ec25Sjsg #include <sys/types.h>
33*a1b5ec25Sjsg 
34*a1b5ec25Sjsg #include <sys/exec_elf.h>
35*a1b5ec25Sjsg 
36*a1b5ec25Sjsg /* Non-standard public data structures */
37*a1b5ec25Sjsg 
38*a1b5ec25Sjsg /* Capability */
39*a1b5ec25Sjsg typedef struct {
40*a1b5ec25Sjsg 	Elf32_Word	c_tag;
41*a1b5ec25Sjsg 	union {
42*a1b5ec25Sjsg 		Elf32_Word	c_val;
43*a1b5ec25Sjsg 		Elf32_Addr	c_ptr;
44*a1b5ec25Sjsg 	} c_un;
45*a1b5ec25Sjsg } Elf32_Cap;
46*a1b5ec25Sjsg 
47*a1b5ec25Sjsg typedef struct {
48*a1b5ec25Sjsg 	Elf64_Xword	c_tag;
49*a1b5ec25Sjsg 	union {
50*a1b5ec25Sjsg 		Elf64_Xword	c_val;
51*a1b5ec25Sjsg 		Elf64_Addr	c_ptr;
52*a1b5ec25Sjsg 	} c_un;
53*a1b5ec25Sjsg } Elf64_Cap;
54*a1b5ec25Sjsg 
55*a1b5ec25Sjsg /* Move */
56*a1b5ec25Sjsg typedef struct {
57*a1b5ec25Sjsg 	Elf32_Lword	m_value;
58*a1b5ec25Sjsg 	Elf32_Word	m_info;
59*a1b5ec25Sjsg 	Elf32_Word	m_poffset;
60*a1b5ec25Sjsg 	Elf32_Half	m_repeat;
61*a1b5ec25Sjsg 	Elf32_Half	m_stride;
62*a1b5ec25Sjsg } Elf32_Move;
63*a1b5ec25Sjsg 
64*a1b5ec25Sjsg typedef struct {
65*a1b5ec25Sjsg 	Elf64_Lword	m_value;
66*a1b5ec25Sjsg 	Elf64_Xword	m_info;
67*a1b5ec25Sjsg 	Elf64_Xword	m_poffset;
68*a1b5ec25Sjsg 	Elf64_Half	m_repeat;
69*a1b5ec25Sjsg 	Elf64_Half	m_stride;
70*a1b5ec25Sjsg } Elf64_Move;
71*a1b5ec25Sjsg 
72*a1b5ec25Sjsg /* Syminfo Table */
73*a1b5ec25Sjsg typedef struct {
74*a1b5ec25Sjsg 	Elf32_Half	si_boundto;
75*a1b5ec25Sjsg 	Elf32_Half	si_flags;
76*a1b5ec25Sjsg } Elf32_Syminfo;
77*a1b5ec25Sjsg 
78*a1b5ec25Sjsg typedef struct {
79*a1b5ec25Sjsg 	Elf64_Half	si_boundto;
80*a1b5ec25Sjsg 	Elf64_Half	si_flags;
81*a1b5ec25Sjsg } Elf64_Syminfo;
82*a1b5ec25Sjsg 
83*a1b5ec25Sjsg /* Version Definition */
84*a1b5ec25Sjsg typedef struct {
85*a1b5ec25Sjsg 	Elf32_Half	vd_version;
86*a1b5ec25Sjsg 	Elf32_Half	vd_flags;
87*a1b5ec25Sjsg 	Elf32_Half	vd_ndx;
88*a1b5ec25Sjsg 	Elf32_Half	vd_cnt;
89*a1b5ec25Sjsg 	Elf32_Word	vd_hash;
90*a1b5ec25Sjsg 	Elf32_Word	vd_aux;
91*a1b5ec25Sjsg 	Elf32_Word	vd_next;
92*a1b5ec25Sjsg } Elf32_Verdef;
93*a1b5ec25Sjsg 
94*a1b5ec25Sjsg typedef struct {
95*a1b5ec25Sjsg 	Elf32_Word	vda_name;
96*a1b5ec25Sjsg 	Elf32_Word	vda_next;
97*a1b5ec25Sjsg } Elf32_Verdaux;
98*a1b5ec25Sjsg 
99*a1b5ec25Sjsg typedef struct {
100*a1b5ec25Sjsg 	Elf64_Half	vd_version;
101*a1b5ec25Sjsg 	Elf64_Half	vd_flags;
102*a1b5ec25Sjsg 	Elf64_Half	vd_ndx;
103*a1b5ec25Sjsg 	Elf64_Half	vd_cnt;
104*a1b5ec25Sjsg 	Elf64_Word	vd_hash;
105*a1b5ec25Sjsg 	Elf64_Word	vd_aux;
106*a1b5ec25Sjsg 	Elf64_Word	vd_next;
107*a1b5ec25Sjsg } Elf64_Verdef;
108*a1b5ec25Sjsg 
109*a1b5ec25Sjsg typedef struct {
110*a1b5ec25Sjsg 	Elf64_Word	vda_name;
111*a1b5ec25Sjsg 	Elf64_Word	vda_next;
112*a1b5ec25Sjsg } Elf64_Verdaux;
113*a1b5ec25Sjsg 
114*a1b5ec25Sjsg /* Version Dependency */
115*a1b5ec25Sjsg 
116*a1b5ec25Sjsg typedef struct {
117*a1b5ec25Sjsg 	Elf32_Half	vn_version;
118*a1b5ec25Sjsg 	Elf32_Half	vn_cnt;
119*a1b5ec25Sjsg 	Elf32_Word	vn_file;
120*a1b5ec25Sjsg 	Elf32_Word	vn_aux;
121*a1b5ec25Sjsg 	Elf32_Word	vn_next;
122*a1b5ec25Sjsg } Elf32_Verneed;
123*a1b5ec25Sjsg 
124*a1b5ec25Sjsg typedef struct {
125*a1b5ec25Sjsg 	Elf32_Word	vna_hash;
126*a1b5ec25Sjsg 	Elf32_Half	vna_flags;
127*a1b5ec25Sjsg 	Elf32_Half	vna_other;
128*a1b5ec25Sjsg 	Elf32_Word	vna_name;
129*a1b5ec25Sjsg 	Elf32_Word	vna_next;
130*a1b5ec25Sjsg } Elf32_Vernaux;
131*a1b5ec25Sjsg 
132*a1b5ec25Sjsg typedef struct {
133*a1b5ec25Sjsg         Elf64_Half	vn_version;
134*a1b5ec25Sjsg         Elf64_Half	vn_cnt;
135*a1b5ec25Sjsg         Elf64_Word	vn_file;
136*a1b5ec25Sjsg         Elf64_Word	vn_aux;
137*a1b5ec25Sjsg         Elf64_Word	vn_next;
138*a1b5ec25Sjsg } Elf64_Verneed;
139*a1b5ec25Sjsg 
140*a1b5ec25Sjsg typedef struct {
141*a1b5ec25Sjsg 	Elf64_Word	vna_hash;
142*a1b5ec25Sjsg 	Elf64_Half	vna_flags;
143*a1b5ec25Sjsg 	Elf64_Half	vna_other;
144*a1b5ec25Sjsg 	Elf64_Word	vna_name;
145*a1b5ec25Sjsg 	Elf64_Word	vna_next;
146*a1b5ec25Sjsg } Elf64_Vernaux;
147*a1b5ec25Sjsg 
148*a1b5ec25Sjsg /* GNU-style hash sections */
149*a1b5ec25Sjsg typedef struct {
150*a1b5ec25Sjsg 	uint32_t	gh_nbuckets;	/* Number of hash buckets. */
151*a1b5ec25Sjsg 	uint32_t	gh_symndx;	/* First visible symbol in .dynsym. */
152*a1b5ec25Sjsg 	uint32_t	gh_maskwords;	/* #maskwords used in bloom filter. */
153*a1b5ec25Sjsg 	uint32_t	gh_shift2;	/* Bloom filter shift count. */
154*a1b5ec25Sjsg } Elf_GNU_Hash_Header;
155*a1b5ec25Sjsg 
156*a1b5ec25Sjsg /* Library private data structures */
157*a1b5ec25Sjsg typedef struct _Elf Elf;
158*a1b5ec25Sjsg typedef struct _Elf_Scn Elf_Scn;
159*a1b5ec25Sjsg 
160*a1b5ec25Sjsg /* File types */
161*a1b5ec25Sjsg typedef enum {
162*a1b5ec25Sjsg 	ELF_K_NONE = 0,
163*a1b5ec25Sjsg 	ELF_K_AR,	/* `ar' archives */
164*a1b5ec25Sjsg 	ELF_K_COFF,	/* COFF files (unsupported) */
165*a1b5ec25Sjsg 	ELF_K_ELF,	/* ELF files */
166*a1b5ec25Sjsg 	ELF_K_NUM
167*a1b5ec25Sjsg } Elf_Kind;
168*a1b5ec25Sjsg 
169*a1b5ec25Sjsg #define	ELF_K_FIRST	ELF_K_NONE
170*a1b5ec25Sjsg #define	ELF_K_LAST	ELF_K_NUM
171*a1b5ec25Sjsg 
172*a1b5ec25Sjsg /* Data types */
173*a1b5ec25Sjsg typedef enum {
174*a1b5ec25Sjsg 	ELF_T_ADDR,
175*a1b5ec25Sjsg 	ELF_T_BYTE,
176*a1b5ec25Sjsg 	ELF_T_CAP,
177*a1b5ec25Sjsg 	ELF_T_DYN,
178*a1b5ec25Sjsg 	ELF_T_EHDR,
179*a1b5ec25Sjsg 	ELF_T_HALF,
180*a1b5ec25Sjsg 	ELF_T_LWORD,
181*a1b5ec25Sjsg 	ELF_T_MOVE,
182*a1b5ec25Sjsg 	ELF_T_MOVEP,
183*a1b5ec25Sjsg 	ELF_T_NOTE,
184*a1b5ec25Sjsg 	ELF_T_OFF,
185*a1b5ec25Sjsg 	ELF_T_PHDR,
186*a1b5ec25Sjsg 	ELF_T_REL,
187*a1b5ec25Sjsg 	ELF_T_RELA,
188*a1b5ec25Sjsg 	ELF_T_SHDR,
189*a1b5ec25Sjsg 	ELF_T_SWORD,
190*a1b5ec25Sjsg 	ELF_T_SXWORD,
191*a1b5ec25Sjsg 	ELF_T_SYMINFO,
192*a1b5ec25Sjsg 	ELF_T_SYM,
193*a1b5ec25Sjsg 	ELF_T_VDEF,
194*a1b5ec25Sjsg 	ELF_T_VNEED,
195*a1b5ec25Sjsg 	ELF_T_WORD,
196*a1b5ec25Sjsg 	ELF_T_XWORD,
197*a1b5ec25Sjsg 	ELF_T_GNUHASH,	/* GNU style hash tables. */
198*a1b5ec25Sjsg 	ELF_T_NUM
199*a1b5ec25Sjsg } Elf_Type;
200*a1b5ec25Sjsg 
201*a1b5ec25Sjsg #define	ELF_T_FIRST	ELF_T_ADDR
202*a1b5ec25Sjsg #define	ELF_T_LAST	ELF_T_GNUHASH
203*a1b5ec25Sjsg 
204*a1b5ec25Sjsg /* Commands */
205*a1b5ec25Sjsg typedef enum {
206*a1b5ec25Sjsg 	ELF_C_NULL = 0,
207*a1b5ec25Sjsg 	ELF_C_CLR,
208*a1b5ec25Sjsg 	ELF_C_FDDONE,
209*a1b5ec25Sjsg 	ELF_C_FDREAD,
210*a1b5ec25Sjsg 	ELF_C_RDWR,
211*a1b5ec25Sjsg 	ELF_C_READ,
212*a1b5ec25Sjsg 	ELF_C_SET,
213*a1b5ec25Sjsg 	ELF_C_WRITE,
214*a1b5ec25Sjsg 	ELF_C_NUM
215*a1b5ec25Sjsg } Elf_Cmd;
216*a1b5ec25Sjsg 
217*a1b5ec25Sjsg #define	ELF_C_FIRST	ELF_C_NULL
218*a1b5ec25Sjsg #define	ELF_C_LAST	ELF_C_NUM
219*a1b5ec25Sjsg 
220*a1b5ec25Sjsg /*
221*a1b5ec25Sjsg  * An `Elf_Data' structure describes data in an
222*a1b5ec25Sjsg  * ELF section.
223*a1b5ec25Sjsg  */
224*a1b5ec25Sjsg typedef struct _Elf_Data {
225*a1b5ec25Sjsg 	/*
226*a1b5ec25Sjsg 	 * `Public' members that are part of the ELF(3) API.
227*a1b5ec25Sjsg 	 */
228*a1b5ec25Sjsg 	uint64_t	d_align;
229*a1b5ec25Sjsg 	void		*d_buf;
230*a1b5ec25Sjsg 	uint64_t	d_off;
231*a1b5ec25Sjsg 	uint64_t	d_size;
232*a1b5ec25Sjsg 	Elf_Type	d_type;
233*a1b5ec25Sjsg 	unsigned int	d_version;
234*a1b5ec25Sjsg } Elf_Data;
235*a1b5ec25Sjsg 
236*a1b5ec25Sjsg /*
237*a1b5ec25Sjsg  * An `Elf_Arhdr' structure describes an archive
238*a1b5ec25Sjsg  * header.
239*a1b5ec25Sjsg  */
240*a1b5ec25Sjsg typedef struct {
241*a1b5ec25Sjsg 	time_t		ar_date;
242*a1b5ec25Sjsg 	char		*ar_name;	/* archive member name */
243*a1b5ec25Sjsg 	gid_t		ar_gid;
244*a1b5ec25Sjsg 	mode_t		ar_mode;
245*a1b5ec25Sjsg 	char		*ar_rawname;	/* 'raw' member name */
246*a1b5ec25Sjsg 	size_t		ar_size;
247*a1b5ec25Sjsg 	uid_t		ar_uid;
248*a1b5ec25Sjsg 
249*a1b5ec25Sjsg 	/*
250*a1b5ec25Sjsg 	 * Members that are not part of the public API.
251*a1b5ec25Sjsg 	 */
252*a1b5ec25Sjsg 	unsigned int	ar_flags;
253*a1b5ec25Sjsg } Elf_Arhdr;
254*a1b5ec25Sjsg 
255*a1b5ec25Sjsg /*
256*a1b5ec25Sjsg  * An `Elf_Arsym' describes an entry in the archive
257*a1b5ec25Sjsg  * symbol table.
258*a1b5ec25Sjsg  */
259*a1b5ec25Sjsg typedef struct {
260*a1b5ec25Sjsg 	off_t		as_off;		/* byte offset to member's header */
261*a1b5ec25Sjsg 	unsigned long	as_hash;	/* elf_hash() value for name */
262*a1b5ec25Sjsg 	char		*as_name; 	/* null terminated symbol name */
263*a1b5ec25Sjsg } Elf_Arsym;
264*a1b5ec25Sjsg 
265*a1b5ec25Sjsg /*
266*a1b5ec25Sjsg  * Error numbers.
267*a1b5ec25Sjsg  */
268*a1b5ec25Sjsg 
269*a1b5ec25Sjsg enum Elf_Error {
270*a1b5ec25Sjsg 	ELF_E_NONE,	/* No error */
271*a1b5ec25Sjsg 	ELF_E_ARCHIVE,	/* Malformed ar(1) archive */
272*a1b5ec25Sjsg 	ELF_E_ARGUMENT,	/* Invalid argument */
273*a1b5ec25Sjsg 	ELF_E_CLASS,	/* Mismatched ELF class */
274*a1b5ec25Sjsg 	ELF_E_DATA,	/* Invalid data descriptor */
275*a1b5ec25Sjsg 	ELF_E_HEADER,	/* Missing or malformed ELF header */
276*a1b5ec25Sjsg 	ELF_E_IO,	/* I/O error */
277*a1b5ec25Sjsg 	ELF_E_LAYOUT,	/* Layout constraint violation */
278*a1b5ec25Sjsg 	ELF_E_MODE,	/* Wrong mode for ELF descriptor */
279*a1b5ec25Sjsg 	ELF_E_RANGE,	/* Value out of range */
280*a1b5ec25Sjsg 	ELF_E_RESOURCE,	/* Resource exhaustion */
281*a1b5ec25Sjsg 	ELF_E_SECTION,	/* Invalid section descriptor */
282*a1b5ec25Sjsg 	ELF_E_SEQUENCE,	/* API calls out of sequence */
283*a1b5ec25Sjsg 	ELF_E_UNIMPL,	/* Feature is unimplemented */
284*a1b5ec25Sjsg 	ELF_E_VERSION,	/* Unknown API version */
285*a1b5ec25Sjsg 	ELF_E_NUM	/* Max error number */
286*a1b5ec25Sjsg };
287*a1b5ec25Sjsg 
288*a1b5ec25Sjsg /*
289*a1b5ec25Sjsg  * Flags defined by the API.
290*a1b5ec25Sjsg  */
291*a1b5ec25Sjsg 
292*a1b5ec25Sjsg #define	ELF_F_LAYOUT	0x001U	/* application will layout the file */
293*a1b5ec25Sjsg #define	ELF_F_DIRTY	0x002U	/* a section or ELF file is dirty */
294*a1b5ec25Sjsg 
295*a1b5ec25Sjsg /* ELF(3) API extensions. */
296*a1b5ec25Sjsg #define	ELF_F_ARCHIVE	   0x100U /* archive creation */
297*a1b5ec25Sjsg #define	ELF_F_ARCHIVE_SYSV 0x200U /* SYSV style archive */
298*a1b5ec25Sjsg 
299*a1b5ec25Sjsg #ifdef __cplusplus
300*a1b5ec25Sjsg extern "C" {
301*a1b5ec25Sjsg #endif
302*a1b5ec25Sjsg Elf		*elf_begin(int _fd, Elf_Cmd _cmd, Elf *_elf);
303*a1b5ec25Sjsg int		elf_cntl(Elf *_elf, Elf_Cmd _cmd);
304*a1b5ec25Sjsg int		elf_end(Elf *_elf);
305*a1b5ec25Sjsg const char	*elf_errmsg(int _error);
306*a1b5ec25Sjsg int		elf_errno(void);
307*a1b5ec25Sjsg void		elf_fill(int _fill);
308*a1b5ec25Sjsg unsigned int	elf_flagarhdr(Elf_Arhdr *_arh, Elf_Cmd _cmd,
309*a1b5ec25Sjsg 			unsigned int _flags);
310*a1b5ec25Sjsg unsigned int	elf_flagdata(Elf_Data *_data, Elf_Cmd _cmd,
311*a1b5ec25Sjsg 			unsigned int _flags);
312*a1b5ec25Sjsg unsigned int	elf_flagehdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
313*a1b5ec25Sjsg unsigned int	elf_flagelf(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
314*a1b5ec25Sjsg unsigned int	elf_flagphdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
315*a1b5ec25Sjsg unsigned int	elf_flagscn(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags);
316*a1b5ec25Sjsg unsigned int	elf_flagshdr(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags);
317*a1b5ec25Sjsg Elf_Arhdr	*elf_getarhdr(Elf *_elf);
318*a1b5ec25Sjsg Elf_Arsym	*elf_getarsym(Elf *_elf, size_t *_ptr);
319*a1b5ec25Sjsg off_t		elf_getbase(Elf *_elf);
320*a1b5ec25Sjsg Elf_Data	*elf_getdata(Elf_Scn *, Elf_Data *);
321*a1b5ec25Sjsg char		*elf_getident(Elf *_elf, size_t *_ptr);
322*a1b5ec25Sjsg int		elf_getphdrnum(Elf *_elf, size_t *_dst);
323*a1b5ec25Sjsg int		elf_getphnum(Elf *_elf, size_t *_dst);	/* Deprecated */
324*a1b5ec25Sjsg Elf_Scn		*elf_getscn(Elf *_elf, size_t _index);
325*a1b5ec25Sjsg int		elf_getshdrnum(Elf *_elf, size_t *_dst);
326*a1b5ec25Sjsg int		elf_getshnum(Elf *_elf, size_t *_dst);	/* Deprecated */
327*a1b5ec25Sjsg int		elf_getshdrstrndx(Elf *_elf, size_t *_dst);
328*a1b5ec25Sjsg int		elf_getshstrndx(Elf *_elf, size_t *_dst); /* Deprecated */
329*a1b5ec25Sjsg unsigned long	elf_hash(const char *_name);
330*a1b5ec25Sjsg Elf_Kind	elf_kind(Elf *_elf);
331*a1b5ec25Sjsg Elf		*elf_memory(char *_image, size_t _size);
332*a1b5ec25Sjsg size_t		elf_ndxscn(Elf_Scn *_scn);
333*a1b5ec25Sjsg Elf_Data	*elf_newdata(Elf_Scn *_scn);
334*a1b5ec25Sjsg Elf_Scn		*elf_newscn(Elf *_elf);
335*a1b5ec25Sjsg Elf_Scn		*elf_nextscn(Elf *_elf, Elf_Scn *_scn);
336*a1b5ec25Sjsg Elf_Cmd		elf_next(Elf *_elf);
337*a1b5ec25Sjsg Elf		*elf_open(int _fd);
338*a1b5ec25Sjsg Elf		*elf_openmemory(char *_image, size_t _size);
339*a1b5ec25Sjsg off_t		elf_rand(Elf *_elf, off_t _off);
340*a1b5ec25Sjsg Elf_Data	*elf_rawdata(Elf_Scn *_scn, Elf_Data *_data);
341*a1b5ec25Sjsg char		*elf_rawfile(Elf *_elf, size_t *_size);
342*a1b5ec25Sjsg int		elf_setshstrndx(Elf *_elf, size_t _shnum);
343*a1b5ec25Sjsg char		*elf_strptr(Elf *_elf, size_t _section, size_t _offset);
344*a1b5ec25Sjsg off_t		elf_update(Elf *_elf, Elf_Cmd _cmd);
345*a1b5ec25Sjsg unsigned int	elf_version(unsigned int _version);
346*a1b5ec25Sjsg 
347*a1b5ec25Sjsg long		elf32_checksum(Elf *_elf);
348*a1b5ec25Sjsg size_t		elf32_fsize(Elf_Type _type, size_t _count,
349*a1b5ec25Sjsg 			unsigned int _version);
350*a1b5ec25Sjsg Elf32_Ehdr	*elf32_getehdr(Elf *_elf);
351*a1b5ec25Sjsg Elf32_Phdr	*elf32_getphdr(Elf *_elf);
352*a1b5ec25Sjsg Elf32_Shdr	*elf32_getshdr(Elf_Scn *_scn);
353*a1b5ec25Sjsg Elf32_Ehdr	*elf32_newehdr(Elf *_elf);
354*a1b5ec25Sjsg Elf32_Phdr	*elf32_newphdr(Elf *_elf, size_t _count);
355*a1b5ec25Sjsg Elf_Data	*elf32_xlatetof(Elf_Data *_dst, const Elf_Data *_src,
356*a1b5ec25Sjsg 			unsigned int _enc);
357*a1b5ec25Sjsg Elf_Data	*elf32_xlatetom(Elf_Data *_dst, const Elf_Data *_src,
358*a1b5ec25Sjsg 			unsigned int _enc);
359*a1b5ec25Sjsg 
360*a1b5ec25Sjsg long		elf64_checksum(Elf *_elf);
361*a1b5ec25Sjsg size_t		elf64_fsize(Elf_Type _type, size_t _count,
362*a1b5ec25Sjsg 			unsigned int _version);
363*a1b5ec25Sjsg Elf64_Ehdr	*elf64_getehdr(Elf *_elf);
364*a1b5ec25Sjsg Elf64_Phdr	*elf64_getphdr(Elf *_elf);
365*a1b5ec25Sjsg Elf64_Shdr	*elf64_getshdr(Elf_Scn *_scn);
366*a1b5ec25Sjsg Elf64_Ehdr	*elf64_newehdr(Elf *_elf);
367*a1b5ec25Sjsg Elf64_Phdr	*elf64_newphdr(Elf *_elf, size_t _count);
368*a1b5ec25Sjsg Elf_Data	*elf64_xlatetof(Elf_Data *_dst, const Elf_Data *_src,
369*a1b5ec25Sjsg 			unsigned int _enc);
370*a1b5ec25Sjsg Elf_Data	*elf64_xlatetom(Elf_Data *_dst, const Elf_Data *_src,
371*a1b5ec25Sjsg 			unsigned int _enc);
372*a1b5ec25Sjsg #ifdef __cplusplus
373*a1b5ec25Sjsg }
374*a1b5ec25Sjsg #endif
375*a1b5ec25Sjsg 
376*a1b5ec25Sjsg #endif	/* _LIBELF_H_ */
377