Drop main() prototype. Syncs with NetBSD-8
[minix.git] / external / bsd / elftoolchain / dist / libelf / elf_begin.3
blob040c112300862a8bf325ab3aebd8750b7c1eaa9b
1 .\"     $NetBSD: elf_begin.3,v 1.2 2014/03/09 16:58:04 christos Exp $
2 .\"
3 .\" Copyright (c) 2006,2008-2011 Joseph Koshy.  All rights reserved.
4 .\"
5 .\" Redistribution and use in source and binary forms, with or without
6 .\" modification, are permitted provided that the following conditions
7 .\" are met:
8 .\" 1. Redistributions of source code must retain the above copyright
9 .\"    notice, this list of conditions and the following disclaimer.
10 .\" 2. Redistributions in binary form must reproduce the above copyright
11 .\"    notice, this list of conditions and the following disclaimer in the
12 .\"    documentation and/or other materials provided with the distribution.
13 .\"
14 .\" This software is provided by Joseph Koshy ``as is'' and
15 .\" any express or implied warranties, including, but not limited to, the
16 .\" implied warranties of merchantability and fitness for a particular purpose
17 .\" are disclaimed.  in no event shall Joseph Koshy be liable
18 .\" for any direct, indirect, incidental, special, exemplary, or consequential
19 .\" damages (including, but not limited to, procurement of substitute goods
20 .\" or services; loss of use, data, or profits; or business interruption)
21 .\" however caused and on any theory of liability, whether in contract, strict
22 .\" liability, or tort (including negligence or otherwise) arising in any way
23 .\" out of the use of this software, even if advised of the possibility of
24 .\" such damage.
25 .\"
26 .\" Id: elf_begin.3 2313 2011-12-11 06:19:24Z jkoshy  
27 .\"
28 .Dd December 11, 2011
29 .Os
30 .Dt ELF_BEGIN 3
31 .Sh NAME
32 .Nm elf_begin
33 .Nd open an ELF file or ar(1) archive
34 .Sh LIBRARY
35 .Lb libelf
36 .Sh SYNOPSIS
37 .In libelf.h
38 .Ft "Elf *"
39 .Fn elf_begin "int fd" "Elf_Cmd cmd" "Elf *elf"
40 .Sh DESCRIPTION
41 Function
42 .Fn elf_begin
43 is used to open ELF files and
44 .Xr ar 1
45 archives for further processing by other APIs in the
46 .Xr elf 3
47 library.
48 It is also used to access individual ELF members of an
49 .Xr ar 1
50 archive in combination with the
51 .Xr elf_next 3
52 and
53 .Xr elf_rand 3
54 APIs.
55 .Pp
56 Argument
57 .Ar fd
58 is an open file descriptor returned from an
59 .Xr open 2
60 system call.
61 Function
62 .Fn elf_begin
63 uses argument
64 .Ar fd
65 for reading or writing depending on the value of argument
66 .Ar cmd .
67 Argument
68 .Ar elf
69 is primarily used for iterating through archives.
70 .Pp
71 The argument
72 .Ar cmd
73 can have the following values:
74 .Bl -tag -width "ELF_C_WRITE"
75 .It ELF_C_NULL
76 Causes
77 .Fn elf_begin
78 to return NULL.
79 Arguments
80 .Ar fd
81 and
82 .Ar elf
83 are ignored, and no additional error is signalled.
84 .It ELF_C_READ
85 This value is to be when the application wishes to examine (but not
86 modify) the contents of the file specified by the arguments
87 .Ar fd
88 and
89 .Ar elf .
90 It can be used for both
91 .Xr ar 1
92 archives and for ELF objects.
93 .Pp
94 If argument
95 .Ar elf
96 is NULL, the library will allocate a new ELF descriptor for the file
97 being processed.
98 The argument
99 .Ar fd
100 should have been opened for reading.
102 If argument
103 .Ar elf
104 is not NULL, and references a regular ELF file previously opened with
105 .Fn elf_begin ,
106 then the activation count for the descriptor referenced by argument
107 .Ar elf
108 is incremented.
109 The value in argument
110 .Ar fd
111 should match that used to open the descriptor argument
112 .Ar elf .
114 If argument
115 .Ar elf
116 is not NULL, and references a descriptor for an
117 .Xr ar 1
118 archive opened earlier with
119 .Fn elf_begin ,
120 a descriptor for an element in the archive is returned as
121 described in the section
122 .Sx "Processing ar(1) archives"
123 below.
124 The value for argument
125 .Ar fd
126 should match that used to open the archive earlier.
128 If argument
129 .Ar elf
130 is not NULL, and references an
131 .Xr ar 1
132 archive opened earlier with
133 .Fn elf_memory ,
134 then the value of the argument
135 .Ar fd
136 is ignored.
137 .It Dv ELF_C_RDWR
138 This command is used to prepare an ELF file for reading and writing.
139 This command is not supported for
140 .Xr ar 1
141 archives.
143 Argument
144 .Ar fd
145 should have been opened for reading and writing.
146 If argument
147 .Ar elf
148 is NULL, the library will allocate a new ELF descriptor for
149 the file being processed.
150 If the argument
151 .Ar elf
152 is non-null, it should point to a descriptor previously
153 allocated with
154 .Fn elf_begin
155 with the same values for arguments
156 .Ar fd
158 .Ar cmd ;
159 in this case the library will increment the activation count for descriptor
160 .Ar elf
161 and return the same descriptor.
163 Changes to the in-memory image of the ELF file may be written back to
164 disk using the
165 .Xr elf_update 3
166 function.
167 .It Dv ELF_C_WRITE
168 This command is used when the application wishes to create a new ELF
169 file.
170 Argument
171 .Ar fd
172 should have been opened for writing.
173 Argument
174 .Ar elf
175 is ignored, and the previous contents of file referenced by argument
176 .Ar fd
177 are overwritten.
179 .Ss Processing ar(1) archives
181 .Xr ar 1
182 archive may be opened in read mode (with argument
183 .Ar cmd
184 set to
185 .Dv ELF_C_READ )
186 using
187 .Fn elf_begin
189 .Fn elf_memory .
190 The returned ELF descriptor can be passed into to
191 subsequent calls to
192 .Fn elf_begin
193 to access individual members of the archive.
195 Random access within an opened archive is possible using
197 .Xr elf_next 3
199 .Xr elf_rand 3
200 functions.
202 The symbol table of the archive may be retrieved
203 using
204 .Xr elf_getarsym 3 .
205 .Sh RETURN VALUES
206 The function returns a pointer to a ELF descriptor if successful, or NULL
207 if an error occurred.
208 .Sh EXAMPLES
209 To iterate through the members of an
210 .Xr ar 1
211 archive, use:
212 .Bd -literal -offset indent
213 Elf_Cmd c;
214 Elf *ar_e, *elf_e;
215 \&...
216 c = ELF_C_READ;
217 if ((ar_e = elf_begin(fd, c, (Elf *) 0)) == 0) {
218         \&... handle error in opening the archive ...
220 while ((elf_e = elf_begin(fd, c, ar_e)) != 0) {
221         \&... process member referenced by elf_e here ...
222         c = elf_next(elf_e);
223         elf_end(elf_e);
227 To create a new ELF file, use:
228 .Bd -literal -offset indent
229 int fd;
230 Elf *e;
231 \&...
232 if ((fd = open("filename", O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) {
233         \&... handle the error from open(2) ...
235 if ((e = elf_begin(fd, ELF_C_WRITE, (Elf *) 0)) == 0) {
236         \&... handle the error from elf_begin() ...
238 \&... create the ELF image using other elf(3) APIs ...
239 elf_update(e, ELF_C_WRITE);
240 elf_end(e);
242 .Sh ERRORS
243 Function
244 .Fn elf_begin
245 can fail with the following errors:
246 .Bl -tag -width "[ELF_E_RESOURCE]"
247 .It Bq Er ELF_E_ARCHIVE
248 The archive denoted by argument
249 .Ar elf
250 could not be parsed.
251 .It Bq Er ELF_E_ARGUMENT
252 The value in argument
253 .Ar cmd
254 was unrecognized.
255 .It Bq Er ELF_E_ARGUMENT
256 A non-null value for argument
257 .Ar elf
258 was specified when
259 .Ar cmd
260 was set to
261 .Dv ELF_C_RDWR .
262 .It Bq Er ELF_E_ARGUMENT
263 The value of argument
264 .Ar fd
265 differs from the one the ELF descriptor
266 .Ar elf
267 was created with.
268 .It Bq Er ELF_E_ARGUMENT
269 Argument
270 .Ar cmd
271 differs from the value specified when ELF descriptor
272 .Ar elf
273 was created.
274 .It Bq Er ELF_E_ARGUMENT
276 .Xr ar 1
277 archive was opened with with
278 .Ar cmd
279 set to
280 .Dv ELF_C_RDWR .
281 .It Bq Er ELF_E_ARGUMENT
282 The file referenced by argument
283 .Ar fd
284 was empty.
285 .It Bq Er ELF_E_ARGUMENT
286 The underlying file for argument
287 .Ar fd
288 was of an unsupported type.
289 .It Bq Er ELF_E_IO
290 The file descriptor in argument
291 .Ar fd
292 was invalid.
293 .It Bq Er ELF_E_IO
294 The file descriptor in argument
295 .Ar fd
296 could not be read or written to.
297 .It Bq Er ELF_E_RESOURCE
298 An out of memory condition was encountered.
299 .It Bq Er ELF_E_SEQUENCE
300 Function
301 .Fn elf_begin
302 was called before a working version was established with
303 .Xr elf_version 3 .
304 .It Bq Er ELF_E_VERSION
305 The ELF object referenced by argument
306 .Ar fd
307 was of an unsupported ELF version.
309 .Sh SEE ALSO
310 .Xr elf 3 ,
311 .Xr elf_end 3 ,
312 .Xr elf_errno 3 ,
313 .Xr elf_memory 3 ,
314 .Xr elf_next 3 ,
315 .Xr elf_rand 3 ,
316 .Xr elf_update 3 ,
317 .Xr gelf 3