xref: /illumos-gate/usr/src/head/libelf.h (revision b13c8383ad6f847486face2fe8df9f0f50f068ed)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*	Copyright (c) 1988 AT&T	*/
22 /*	  All Rights Reserved  	*/
23 
24 /*
25  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  * Copyright 2014 PALO, Richard. All rights reserved.
28  */
29 
30 #ifndef _LIBELF_H
31 #define	_LIBELF_H
32 
33 #include <sys/types.h>
34 #include <sys/elf.h>
35 
36 
37 #ifdef	__cplusplus
38 extern "C" {
39 #endif
40 
41 
42 #if defined(_ILP32) && (_FILE_OFFSET_BITS != 32)
43 #error "large files are not supported by libelf"
44 #endif
45 
46 typedef void	Elf_Void;
47 
48 /*
49  * Commands
50  */
51 typedef enum {
52 	ELF_C_NULL = 0,	/* must be first, 0 */
53 	ELF_C_READ,
54 	ELF_C_WRITE,
55 	ELF_C_CLR,
56 	ELF_C_SET,
57 	ELF_C_FDDONE,
58 	ELF_C_FDREAD,
59 	ELF_C_RDWR,
60 	ELF_C_WRIMAGE,
61 	ELF_C_IMAGE,
62 	ELF_C_NUM	/* must be last */
63 } Elf_Cmd;
64 
65 
66 /*
67  * Flags
68  */
69 #define	ELF_F_DIRTY	0x1
70 #define	ELF_F_LAYOUT	0x4
71 
72 
73 /*
74  * File types
75  */
76 typedef enum {
77 	ELF_K_NONE = 0,	/* must be first, 0 */
78 	ELF_K_AR,
79 	ELF_K_COFF,
80 	ELF_K_ELF,
81 	ELF_K_NUM	/* must be last */
82 } Elf_Kind;
83 
84 
85 /*
86  * Translation types
87  */
88 typedef enum {
89 	ELF_T_BYTE = 0,	/* must be first, 0 */
90 	ELF_T_ADDR,
91 	ELF_T_DYN,
92 	ELF_T_EHDR,
93 	ELF_T_HALF,
94 	ELF_T_OFF,
95 	ELF_T_PHDR,
96 	ELF_T_RELA,
97 	ELF_T_REL,
98 	ELF_T_SHDR,
99 	ELF_T_SWORD,
100 	ELF_T_SYM,
101 	ELF_T_WORD,
102 	ELF_T_VDEF,
103 	ELF_T_VNEED,
104 	ELF_T_SXWORD,
105 	ELF_T_XWORD,
106 	ELF_T_SYMINFO,
107 	ELF_T_NOTE,
108 	ELF_T_MOVE,
109 	ELF_T_MOVEP,
110 	ELF_T_CAP,
111 	ELF_T_NUM	/* must be last */
112 } Elf_Type;
113 
114 
115 typedef struct Elf	Elf;
116 typedef struct Elf_Scn	Elf_Scn;
117 
118 
119 /*
120  * Archive member header
121  */
122 typedef struct {
123 	char		*ar_name;
124 	time_t		ar_date;
125 	uid_t		ar_uid;
126 	gid_t 		ar_gid;
127 	mode_t		ar_mode;
128 	off_t		ar_size;
129 	char 		*ar_rawname;
130 } Elf_Arhdr;
131 
132 
133 /*
134  * Archive symbol table
135  */
136 typedef struct {
137 	char		*as_name;
138 	size_t		as_off;
139 	unsigned long	as_hash;
140 } Elf_Arsym;
141 
142 
143 /*
144  * Data descriptor
145  */
146 typedef struct {
147 	Elf_Void	*d_buf;
148 	Elf_Type	d_type;
149 	size_t		d_size;
150 	off_t		d_off;		/* offset into section */
151 	size_t		d_align;	/* alignment in section */
152 	unsigned	d_version;	/* elf version */
153 } Elf_Data;
154 
155 
156 /*
157  * Function declarations
158  */
159 Elf		*elf_begin(int, Elf_Cmd, Elf *);
160 int		elf_cntl(Elf *, Elf_Cmd);
161 int		elf_end(Elf *);
162 const char	*elf_errmsg(int);
163 int		elf_errno(void);
164 void		elf_fill(int);
165 unsigned	elf_flagdata(Elf_Data *, Elf_Cmd, unsigned);
166 unsigned	elf_flagehdr(Elf *, Elf_Cmd,  unsigned);
167 unsigned	elf_flagelf(Elf *, Elf_Cmd, unsigned);
168 unsigned	elf_flagphdr(Elf *, Elf_Cmd, unsigned);
169 unsigned	elf_flagscn(Elf_Scn *, Elf_Cmd, unsigned);
170 unsigned	elf_flagshdr(Elf_Scn *, Elf_Cmd, unsigned);
171 size_t		elf32_fsize(Elf_Type, size_t, unsigned);
172 Elf_Arhdr	*elf_getarhdr(Elf *);
173 Elf_Arsym	*elf_getarsym(Elf *, size_t *);
174 off_t		elf_getbase(Elf *);
175 Elf_Data	*elf_getdata(Elf_Scn *, Elf_Data *);
176 Elf32_Ehdr	*elf32_getehdr(Elf *);
177 char		*elf_getident(Elf *, size_t *);
178 Elf32_Phdr	*elf32_getphdr(Elf *);
179 Elf_Scn		*elf_getscn(Elf *elf, size_t);
180 Elf32_Shdr	*elf32_getshdr(Elf_Scn *);
181 int		elf_getphnum(Elf *, size_t *);
182 int		elf_getphdrnum(Elf *, size_t *);
183 int		elf_getshnum(Elf *, size_t *);
184 int		elf_getshdrnum(Elf *, size_t *);
185 int		elf_getshstrndx(Elf *, size_t *);
186 int		elf_getshdrstrndx(Elf *, size_t *);
187 unsigned long	elf_hash(const char *);
188 uint_t		elf_sys_encoding(void);
189 long		elf32_checksum(Elf *);
190 Elf_Kind	elf_kind(Elf *);
191 Elf		*elf_memory(char *, size_t);
192 size_t		elf_ndxscn(Elf_Scn *);
193 Elf_Data	*elf_newdata(Elf_Scn *);
194 Elf32_Ehdr	*elf32_newehdr(Elf *);
195 Elf32_Phdr	*elf32_newphdr(Elf *, size_t);
196 Elf_Scn		*elf_newscn(Elf *);
197 Elf_Scn		*elf_nextscn(Elf *, Elf_Scn *);
198 Elf_Cmd		elf_next(Elf *);
199 size_t		elf_rand(Elf *, size_t);
200 Elf_Data	*elf_rawdata(Elf_Scn *, Elf_Data *);
201 char		*elf_rawfile(Elf *, size_t *);
202 char		*elf_strptr(Elf *, size_t, size_t);
203 off_t		elf_update(Elf *, Elf_Cmd);
204 unsigned	elf_version(unsigned);
205 Elf_Data	*elf32_xlatetof(Elf_Data *, const Elf_Data *, unsigned);
206 Elf_Data	*elf32_xlatetom(Elf_Data *, const Elf_Data *, unsigned);
207 
208 #if defined(_LP64) || defined(_LONGLONG_TYPE)
209 size_t		elf64_fsize(Elf_Type, size_t, unsigned);
210 Elf64_Ehdr	*elf64_getehdr(Elf *);
211 Elf64_Phdr	*elf64_getphdr(Elf *);
212 Elf64_Shdr	*elf64_getshdr(Elf_Scn *);
213 long		elf64_checksum(Elf *);
214 Elf64_Ehdr	*elf64_newehdr(Elf *);
215 Elf64_Phdr	*elf64_newphdr(Elf *, size_t);
216 Elf_Data	*elf64_xlatetof(Elf_Data *, const Elf_Data *, unsigned);
217 Elf_Data	*elf64_xlatetom(Elf_Data *, const Elf_Data *, unsigned);
218 #endif /* (defined(_LP64) || defined(_LONGLONG_TYPE) */
219 
220 #ifdef	__cplusplus
221 }
222 #endif
223 
224 #endif	/* _LIBELF_H */
225