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 */
28
29 #ifndef _LIBELF_H
30 #define _LIBELF_H
31
32 #include <sys/types.h>
33 #include <sys/elf.h>
34
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40
41 #if defined(_ILP32) && (_FILE_OFFSET_BITS != 32)
42 #error "large files are not supported by libelf"
43 #endif
44
45
46 #undef _
47 #ifdef __STDC__
48 typedef void Elf_Void;
49 #define _(a) a
50 #else
51 typedef char Elf_Void;
52 #define _(a) ()
53 #undef const
54 #define const
55 #endif
56
57
58 /*
59 * Commands
60 */
61 typedef enum {
62 ELF_C_NULL = 0, /* must be first, 0 */
63 ELF_C_READ,
64 ELF_C_WRITE,
65 ELF_C_CLR,
66 ELF_C_SET,
67 ELF_C_FDDONE,
68 ELF_C_FDREAD,
69 ELF_C_RDWR,
70 ELF_C_WRIMAGE,
71 ELF_C_IMAGE,
72 ELF_C_NUM /* must be last */
73 } Elf_Cmd;
74
75
76 /*
77 * Flags
78 */
79 #define ELF_F_DIRTY 0x1
80 #define ELF_F_LAYOUT 0x4
81
82
83 /*
84 * File types
85 */
86 typedef enum {
87 ELF_K_NONE = 0, /* must be first, 0 */
88 ELF_K_AR,
89 ELF_K_COFF,
90 ELF_K_ELF,
91 ELF_K_NUM /* must be last */
92 } Elf_Kind;
93
94
95 /*
96 * Translation types
97 */
98 typedef enum {
99 ELF_T_BYTE = 0, /* must be first, 0 */
100 ELF_T_ADDR,
101 ELF_T_DYN,
102 ELF_T_EHDR,
103 ELF_T_HALF,
104 ELF_T_OFF,
105 ELF_T_PHDR,
106 ELF_T_RELA,
107 ELF_T_REL,
108 ELF_T_SHDR,
109 ELF_T_SWORD,
110 ELF_T_SYM,
111 ELF_T_WORD,
112 ELF_T_VDEF,
113 ELF_T_VNEED,
114 ELF_T_SXWORD,
115 ELF_T_XWORD,
116 ELF_T_SYMINFO,
117 ELF_T_NOTE,
118 ELF_T_MOVE,
119 ELF_T_MOVEP,
120 ELF_T_CAP,
121 ELF_T_NUM /* must be last */
122 } Elf_Type;
123
124
125 typedef struct Elf Elf;
126 typedef struct Elf_Scn Elf_Scn;
127
128
129 /*
130 * Archive member header
131 */
132 typedef struct {
133 char *ar_name;
134 time_t ar_date;
135 uid_t ar_uid;
136 gid_t ar_gid;
137 mode_t ar_mode;
138 off_t ar_size;
139 char *ar_rawname;
140 } Elf_Arhdr;
141
142
143 /*
144 * Archive symbol table
145 */
146 typedef struct {
147 char *as_name;
148 size_t as_off;
149 unsigned long as_hash;
150 } Elf_Arsym;
151
152
153 /*
154 * Data descriptor
155 */
156 typedef struct {
157 Elf_Void *d_buf;
158 Elf_Type d_type;
159 size_t d_size;
160 off_t d_off; /* offset into section */
161 size_t d_align; /* alignment in section */
162 unsigned d_version; /* elf version */
163 } Elf_Data;
164
165
166 /*
167 * Function declarations
168 */
169 Elf *elf_begin _((int, Elf_Cmd, Elf *));
170 int elf_cntl _((Elf *, Elf_Cmd));
171 int elf_end _((Elf *));
172 const char *elf_errmsg _((int));
173 int elf_errno _((void));
174 void elf_fill _((int));
175 unsigned elf_flagdata _((Elf_Data *, Elf_Cmd, unsigned));
176 unsigned elf_flagehdr _((Elf *, Elf_Cmd, unsigned));
177 unsigned elf_flagelf _((Elf *, Elf_Cmd, unsigned));
178 unsigned elf_flagphdr _((Elf *, Elf_Cmd, unsigned));
179 unsigned elf_flagscn _((Elf_Scn *, Elf_Cmd, unsigned));
180 unsigned elf_flagshdr _((Elf_Scn *, Elf_Cmd, unsigned));
181 size_t elf32_fsize _((Elf_Type, size_t, unsigned));
182 Elf_Arhdr *elf_getarhdr _((Elf *));
183 Elf_Arsym *elf_getarsym _((Elf *, size_t *));
184 off_t elf_getbase _((Elf *));
185 Elf_Data *elf_getdata _((Elf_Scn *, Elf_Data *));
186 Elf32_Ehdr *elf32_getehdr _((Elf *));
187 char *elf_getident _((Elf *, size_t *));
188 Elf32_Phdr *elf32_getphdr _((Elf *));
189 Elf_Scn *elf_getscn _((Elf *elf, size_t));
190 Elf32_Shdr *elf32_getshdr _((Elf_Scn *));
191 int elf_getphnum _((Elf *, size_t *));
192 int elf_getphdrnum _((Elf *, size_t *));
193 int elf_getshnum _((Elf *, size_t *));
194 int elf_getshdrnum _((Elf *, size_t *));
195 int elf_getshstrndx _((Elf *, size_t *));
196 int elf_getshdrstrndx _((Elf *, size_t *));
197 unsigned long elf_hash _((const char *));
198 uint_t elf_sys_encoding _((void));
199 long elf32_checksum _((Elf *));
200 Elf_Kind elf_kind _((Elf *));
201 Elf *elf_memory _((char *, size_t));
202 size_t elf_ndxscn _((Elf_Scn *));
203 Elf_Data *elf_newdata _((Elf_Scn *));
204 Elf32_Ehdr *elf32_newehdr _((Elf *));
205 Elf32_Phdr *elf32_newphdr _((Elf *, size_t));
206 Elf_Scn *elf_newscn _((Elf *));
207 Elf_Scn *elf_nextscn _((Elf *, Elf_Scn *));
208 Elf_Cmd elf_next _((Elf *));
209 size_t elf_rand _((Elf *, size_t));
210 Elf_Data *elf_rawdata _((Elf_Scn *, Elf_Data *));
211 char *elf_rawfile _((Elf *, size_t *));
212 char *elf_strptr _((Elf *, size_t, size_t));
213 off_t elf_update _((Elf *, Elf_Cmd));
214 unsigned elf_version _((unsigned));
215 Elf_Data *elf32_xlatetof _((Elf_Data *, const Elf_Data *, unsigned));
216 Elf_Data *elf32_xlatetom _((Elf_Data *, const Elf_Data *, unsigned));
217
218 #if defined(_LP64) || defined(_LONGLONG_TYPE)
219 size_t elf64_fsize _((Elf_Type, size_t, unsigned));
220 Elf64_Ehdr *elf64_getehdr _((Elf *));
221 Elf64_Phdr *elf64_getphdr _((Elf *));
222 Elf64_Shdr *elf64_getshdr _((Elf_Scn *));
223 long elf64_checksum _((Elf *));
224 Elf64_Ehdr *elf64_newehdr _((Elf *));
225 Elf64_Phdr *elf64_newphdr _((Elf *, size_t));
226 Elf_Data *elf64_xlatetof _((Elf_Data *, const Elf_Data *, unsigned));
227 Elf_Data *elf64_xlatetom _((Elf_Data *, const Elf_Data *, unsigned));
228 #endif /* (defined(_LP64) || defined(_LONGLONG_TYPE) */
229
230 #undef _
231
232 #ifdef __cplusplus
233 }
234 #endif
235
236 #endif /* _LIBELF_H */