1260684Skaiw/*-
2260684Skaiw * Copyright (c) 2006,2008-2010 Joseph Koshy
3260684Skaiw * All rights reserved.
4260684Skaiw *
5260684Skaiw * Redistribution and use in source and binary forms, with or without
6260684Skaiw * modification, are permitted provided that the following conditions
7260684Skaiw * are met:
8260684Skaiw * 1. Redistributions of source code must retain the above copyright
9260684Skaiw *    notice, this list of conditions and the following disclaimer.
10260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright
11260684Skaiw *    notice, this list of conditions and the following disclaimer in the
12260684Skaiw *    documentation and/or other materials provided with the distribution.
13260684Skaiw *
14260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17260684Skaiw * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24260684Skaiw * SUCH DAMAGE.
25260684Skaiw *
26280932Semaste * $Id: libelf.h 3174 2015-03-27 17:13:41Z emaste $
27260684Skaiw */
28260684Skaiw
29260684Skaiw#ifndef	_LIBELF_H_
30260684Skaiw#define	_LIBELF_H_
31260684Skaiw
32260684Skaiw#include <sys/types.h>
33260792Skaiw#include <sys/elf32.h>
34260792Skaiw#include <sys/elf64.h>
35260684Skaiw
36260684Skaiw/* Library private data structures */
37260684Skaiwtypedef struct _Elf Elf;
38260684Skaiwtypedef struct _Elf_Scn Elf_Scn;
39260684Skaiw
40260684Skaiw/* File types */
41260684Skaiwtypedef enum {
42260684Skaiw	ELF_K_NONE = 0,
43260684Skaiw	ELF_K_AR,	/* `ar' archives */
44260684Skaiw	ELF_K_COFF,	/* COFF files (unsupported) */
45260684Skaiw	ELF_K_ELF,	/* ELF files */
46260684Skaiw	ELF_K_NUM
47260684Skaiw} Elf_Kind;
48260684Skaiw
49260684Skaiw#define	ELF_K_FIRST	ELF_K_NONE
50260684Skaiw#define	ELF_K_LAST	ELF_K_NUM
51260684Skaiw
52260684Skaiw/* Data types */
53260684Skaiwtypedef enum {
54260684Skaiw	ELF_T_ADDR,
55260684Skaiw	ELF_T_BYTE,
56260684Skaiw	ELF_T_CAP,
57260684Skaiw	ELF_T_DYN,
58260684Skaiw	ELF_T_EHDR,
59260684Skaiw	ELF_T_HALF,
60260684Skaiw	ELF_T_LWORD,
61260684Skaiw	ELF_T_MOVE,
62260684Skaiw	ELF_T_MOVEP,
63260684Skaiw	ELF_T_NOTE,
64260684Skaiw	ELF_T_OFF,
65260684Skaiw	ELF_T_PHDR,
66260684Skaiw	ELF_T_REL,
67260684Skaiw	ELF_T_RELA,
68260684Skaiw	ELF_T_SHDR,
69260684Skaiw	ELF_T_SWORD,
70260684Skaiw	ELF_T_SXWORD,
71260684Skaiw	ELF_T_SYMINFO,
72260684Skaiw	ELF_T_SYM,
73260684Skaiw	ELF_T_VDEF,
74260684Skaiw	ELF_T_VNEED,
75260684Skaiw	ELF_T_WORD,
76260684Skaiw	ELF_T_XWORD,
77260684Skaiw	ELF_T_GNUHASH,	/* GNU style hash tables. */
78260684Skaiw	ELF_T_NUM
79260684Skaiw} Elf_Type;
80260684Skaiw
81260684Skaiw#define	ELF_T_FIRST	ELF_T_ADDR
82260684Skaiw#define	ELF_T_LAST	ELF_T_GNUHASH
83260684Skaiw
84260684Skaiw/* Commands */
85260684Skaiwtypedef enum {
86260684Skaiw	ELF_C_NULL = 0,
87260684Skaiw	ELF_C_CLR,
88260684Skaiw	ELF_C_FDDONE,
89260684Skaiw	ELF_C_FDREAD,
90260684Skaiw	ELF_C_RDWR,
91260684Skaiw	ELF_C_READ,
92260684Skaiw	ELF_C_SET,
93260684Skaiw	ELF_C_WRITE,
94260684Skaiw	ELF_C_NUM
95260684Skaiw} Elf_Cmd;
96260684Skaiw
97260684Skaiw#define	ELF_C_FIRST	ELF_C_NULL
98260684Skaiw#define	ELF_C_LAST	ELF_C_NUM
99260684Skaiw
100260684Skaiw/*
101260684Skaiw * An `Elf_Data' structure describes data in an
102260684Skaiw * ELF section.
103260684Skaiw */
104260684Skaiwtypedef struct _Elf_Data {
105260684Skaiw	/*
106260684Skaiw	 * `Public' members that are part of the ELF(3) API.
107260684Skaiw	 */
108260684Skaiw	uint64_t	d_align;
109260684Skaiw	void		*d_buf;
110260684Skaiw	uint64_t	d_off;
111260684Skaiw	uint64_t	d_size;
112260684Skaiw	Elf_Type	d_type;
113260684Skaiw	unsigned int	d_version;
114260684Skaiw} Elf_Data;
115260684Skaiw
116260684Skaiw/*
117260684Skaiw * An `Elf_Arhdr' structure describes an archive
118260684Skaiw * header.
119260684Skaiw */
120260684Skaiwtypedef struct {
121260684Skaiw	time_t		ar_date;
122260684Skaiw	char		*ar_name;	/* archive member name */
123260684Skaiw	gid_t		ar_gid;
124260684Skaiw	mode_t		ar_mode;
125260684Skaiw	char		*ar_rawname;	/* 'raw' member name */
126260684Skaiw	size_t		ar_size;
127260684Skaiw	uid_t		ar_uid;
128260684Skaiw
129260684Skaiw	/*
130260684Skaiw	 * Members that are not part of the public API.
131260684Skaiw	 */
132276371Semaste	unsigned int	ar_flags;
133260684Skaiw} Elf_Arhdr;
134260684Skaiw
135260684Skaiw/*
136260684Skaiw * An `Elf_Arsym' describes an entry in the archive
137260684Skaiw * symbol table.
138260684Skaiw */
139260684Skaiwtypedef struct {
140260684Skaiw	off_t		as_off;		/* byte offset to member's header */
141260684Skaiw	unsigned long	as_hash;	/* elf_hash() value for name */
142260684Skaiw	char		*as_name; 	/* null terminated symbol name */
143260684Skaiw} Elf_Arsym;
144260684Skaiw
145260684Skaiw/*
146260684Skaiw * Error numbers.
147260684Skaiw */
148260684Skaiw
149260684Skaiwenum Elf_Error {
150260684Skaiw	ELF_E_NONE,	/* No error */
151260684Skaiw	ELF_E_ARCHIVE,	/* Malformed ar(1) archive */
152260684Skaiw	ELF_E_ARGUMENT,	/* Invalid argument */
153260684Skaiw	ELF_E_CLASS,	/* Mismatched ELF class */
154260684Skaiw	ELF_E_DATA,	/* Invalid data descriptor */
155260684Skaiw	ELF_E_HEADER,	/* Missing or malformed ELF header */
156260684Skaiw	ELF_E_IO,	/* I/O error */
157260684Skaiw	ELF_E_LAYOUT,	/* Layout constraint violation */
158260684Skaiw	ELF_E_MODE,	/* Wrong mode for ELF descriptor */
159260684Skaiw	ELF_E_RANGE,	/* Value out of range */
160260684Skaiw	ELF_E_RESOURCE,	/* Resource exhaustion */
161260684Skaiw	ELF_E_SECTION,	/* Invalid section descriptor */
162260684Skaiw	ELF_E_SEQUENCE,	/* API calls out of sequence */
163260684Skaiw	ELF_E_UNIMPL,	/* Feature is unimplemented */
164260684Skaiw	ELF_E_VERSION,	/* Unknown API version */
165367466Sdim	ELF_E_INVALID_SECTION_FLAGS, /* Invalid ELF section header flags */
166367466Sdim	ELF_E_INVALID_SECTION_TYPE, /* Invalid ELF section header type */
167367466Sdim	ELF_E_NOT_COMPRESSED, /* Section is not compressed */
168260684Skaiw	ELF_E_NUM	/* Max error number */
169260684Skaiw};
170260684Skaiw
171260684Skaiw/*
172260684Skaiw * Flags defined by the API.
173260684Skaiw */
174260684Skaiw
175260684Skaiw#define	ELF_F_LAYOUT	0x001U	/* application will layout the file */
176260684Skaiw#define	ELF_F_DIRTY	0x002U	/* a section or ELF file is dirty */
177260684Skaiw
178260684Skaiw/* ELF(3) API extensions. */
179260684Skaiw#define	ELF_F_ARCHIVE	   0x100U /* archive creation */
180260684Skaiw#define	ELF_F_ARCHIVE_SYSV 0x200U /* SYSV style archive */
181260684Skaiw
182280932Semaste#ifdef __cplusplus
183280932Semasteextern "C" {
184280932Semaste#endif
185260684SkaiwElf		*elf_begin(int _fd, Elf_Cmd _cmd, Elf *_elf);
186260684Skaiwint		elf_cntl(Elf *_elf, Elf_Cmd _cmd);
187260684Skaiwint		elf_end(Elf *_elf);
188260684Skaiwconst char	*elf_errmsg(int _error);
189260684Skaiwint		elf_errno(void);
190260684Skaiwvoid		elf_fill(int _fill);
191260684Skaiwunsigned int	elf_flagarhdr(Elf_Arhdr *_arh, Elf_Cmd _cmd,
192260684Skaiw			unsigned int _flags);
193260684Skaiwunsigned int	elf_flagdata(Elf_Data *_data, Elf_Cmd _cmd,
194260684Skaiw			unsigned int _flags);
195260684Skaiwunsigned int	elf_flagehdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
196260684Skaiwunsigned int	elf_flagelf(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
197260684Skaiwunsigned int	elf_flagphdr(Elf *_elf, Elf_Cmd _cmd, unsigned int _flags);
198260684Skaiwunsigned int	elf_flagscn(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags);
199260684Skaiwunsigned int	elf_flagshdr(Elf_Scn *_scn, Elf_Cmd _cmd, unsigned int _flags);
200260684SkaiwElf_Arhdr	*elf_getarhdr(Elf *_elf);
201260684SkaiwElf_Arsym	*elf_getarsym(Elf *_elf, size_t *_ptr);
202260684Skaiwoff_t		elf_getbase(Elf *_elf);
203260684SkaiwElf_Data	*elf_getdata(Elf_Scn *, Elf_Data *);
204260684Skaiwchar		*elf_getident(Elf *_elf, size_t *_ptr);
205260684Skaiwint		elf_getphdrnum(Elf *_elf, size_t *_dst);
206260684Skaiwint		elf_getphnum(Elf *_elf, size_t *_dst);	/* Deprecated */
207260684SkaiwElf_Scn		*elf_getscn(Elf *_elf, size_t _index);
208260684Skaiwint		elf_getshdrnum(Elf *_elf, size_t *_dst);
209260684Skaiwint		elf_getshnum(Elf *_elf, size_t *_dst);	/* Deprecated */
210260684Skaiwint		elf_getshdrstrndx(Elf *_elf, size_t *_dst);
211260684Skaiwint		elf_getshstrndx(Elf *_elf, size_t *_dst); /* Deprecated */
212260684Skaiwunsigned long	elf_hash(const char *_name);
213260684SkaiwElf_Kind	elf_kind(Elf *_elf);
214260684SkaiwElf		*elf_memory(char *_image, size_t _size);
215260684Skaiwsize_t		elf_ndxscn(Elf_Scn *_scn);
216260684SkaiwElf_Data	*elf_newdata(Elf_Scn *_scn);
217260684SkaiwElf_Scn		*elf_newscn(Elf *_elf);
218260684SkaiwElf_Scn		*elf_nextscn(Elf *_elf, Elf_Scn *_scn);
219260684SkaiwElf_Cmd		elf_next(Elf *_elf);
220260684SkaiwElf		*elf_open(int _fd);
221260684SkaiwElf		*elf_openmemory(char *_image, size_t _size);
222260684Skaiwoff_t		elf_rand(Elf *_elf, off_t _off);
223260684SkaiwElf_Data	*elf_rawdata(Elf_Scn *_scn, Elf_Data *_data);
224260684Skaiwchar		*elf_rawfile(Elf *_elf, size_t *_size);
225260684Skaiwint		elf_setshstrndx(Elf *_elf, size_t _shnum);
226260684Skaiwchar		*elf_strptr(Elf *_elf, size_t _section, size_t _offset);
227260684Skaiwoff_t		elf_update(Elf *_elf, Elf_Cmd _cmd);
228260684Skaiwunsigned int	elf_version(unsigned int _version);
229260684Skaiw
230260684Skaiwlong		elf32_checksum(Elf *_elf);
231260684Skaiwsize_t		elf32_fsize(Elf_Type _type, size_t _count,
232260684Skaiw			unsigned int _version);
233367466SdimElf32_Chdr	*elf32_getchdr(Elf_Scn *_scn);
234260684SkaiwElf32_Ehdr	*elf32_getehdr(Elf *_elf);
235260684SkaiwElf32_Phdr	*elf32_getphdr(Elf *_elf);
236260684SkaiwElf32_Shdr	*elf32_getshdr(Elf_Scn *_scn);
237260684SkaiwElf32_Ehdr	*elf32_newehdr(Elf *_elf);
238260684SkaiwElf32_Phdr	*elf32_newphdr(Elf *_elf, size_t _count);
239260684SkaiwElf_Data	*elf32_xlatetof(Elf_Data *_dst, const Elf_Data *_src,
240260684Skaiw			unsigned int _enc);
241260684SkaiwElf_Data	*elf32_xlatetom(Elf_Data *_dst, const Elf_Data *_src,
242260684Skaiw			unsigned int _enc);
243260684Skaiw
244260684Skaiwlong		elf64_checksum(Elf *_elf);
245260684Skaiwsize_t		elf64_fsize(Elf_Type _type, size_t _count,
246260684Skaiw			unsigned int _version);
247367466SdimElf64_Chdr	*elf64_getchdr(Elf_Scn *_scn);
248260684SkaiwElf64_Ehdr	*elf64_getehdr(Elf *_elf);
249260684SkaiwElf64_Phdr	*elf64_getphdr(Elf *_elf);
250260684SkaiwElf64_Shdr	*elf64_getshdr(Elf_Scn *_scn);
251260684SkaiwElf64_Ehdr	*elf64_newehdr(Elf *_elf);
252260684SkaiwElf64_Phdr	*elf64_newphdr(Elf *_elf, size_t _count);
253260684SkaiwElf_Data	*elf64_xlatetof(Elf_Data *_dst, const Elf_Data *_src,
254260684Skaiw			unsigned int _enc);
255260684SkaiwElf_Data	*elf64_xlatetom(Elf_Data *_dst, const Elf_Data *_src,
256260684Skaiw			unsigned int _enc);
257280932Semaste#ifdef __cplusplus
258280932Semaste}
259280932Semaste#endif
260260684Skaiw
261260684Skaiw#endif	/* _LIBELF_H_ */
262