Sync usage with man page.
[netbsd-mini2440.git] / external / bsd / libelf / dist / elf_begin.3
blob31db09b15e7ca283908db75a3a257098c78c518c
1 .\"     $NetBSD$
2 .\"
3 .\" Copyright (c) 2006 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 .\" $FreeBSD: src/lib/libelf/elf_begin.3,v 1.3.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $
27 .\"
28 .Dd June 21, 2006
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 argument
87 .Ar fd .
88 It can be used for both
89 .Xr ar 1
90 archives and for regular ELF files.
91 .Pp
92 Argument
93 .Ar fd
94 should have been opened for reading.
95 If argument
96 .Ar elf
97 is NULL, the library will allocate a new ELF descriptor for
98 the file being processed.
99 If argument
100 .Ar elf
101 is not NULL, and references a regular ELF file previously opened with
102 .Fn elf_begin ,
103 then the activation count for
104 .Ar elf
105 is incremented.
106 If argument
107 .Ar elf
108 is not NULL, and references a descriptor for an
109 .Xr ar 1
110 archive opened earlier with
111 .Fn elf_begin ,
112 a descriptor for an element in the archive is returned as
113 described in the section
114 .Sx "Processing ar(1) archives"
115 below.
116 .It Dv ELF_C_RDWR
117 The command is used to prepare an ELF file for reading and writing.
118 It is not supported for archives.
120 Argument
121 .Ar fd
122 should have been opened for reading and writing.
123 If argument
124 .Ar elf
125 is NULL, the library will allocate a new ELF descriptor for
126 the file being processed.
127 If the argument
128 .Ar elf
129 is non-null, it should point to a descriptor previously
130 allocated with
131 .Fn elf_begin
132 with the same values for arguments
133 .Ar fd
135 .Ar cmd ;
136 in this case the library will increment the activation count for descriptor
137 .Ar elf
138 and return the same descriptor.
139 Changes to the in-memory image of the ELF file are written back to
140 disk using the
141 .Xr elf_update 3
142 function.
144 This command is not valid for
145 .Xr ar 1
146 archives.
147 .It Dv ELF_C_WRITE
148 This command is used when the application wishes to create a new ELF
149 file.
150 Argument
151 .Ar fd
152 should have been opened for writing.
153 Argument
154 .Ar elf
155 is ignored, and the previous contents of file referenced by
156 argument
157 .Ar fd
158 are overwritten.
160 .Ss Processing ar(1) archives
162 .Xr ar 1
163 archive may be opened in read mode (with argument
164 .Ar cmd
165 set to
166 .Dv ELF_C_READ )
167 using
168 .Fn elf_begin .
169 The returned ELF descriptor can be passed into to
170 subsequent calls to
171 .Fn elf_begin
172 to access individual members of the archive.
174 Random access within an opened archive is possible using
176 .Xr elf_next 3
178 .Xr elf_rand 3
179 functions.
181 The symbol table of the archive may be retrieved
182 using
183 .Xr elf_getarsym 3 .
184 .Sh RETURN VALUES
185 The function returns a pointer to a ELF descriptor if successful, or NULL
186 if an error occurred.
187 .Sh EXAMPLES
188 To iterate through the members of an
189 .Xr ar 1
190 archive, use:
191 .Bd -literal -offset indent
192 Elf_Cmd c;
193 Elf *ar_e, *elf_e;
194 \&...
195 c = ELF_C_READ;
196 if ((ar_e = elf_begin(fd, c, (Elf *) 0)) == 0) {
197         \&... handle error in opening the archive ...
199 while ((elf_e = elf_begin(fd, c, ar_e)) != 0) {
200         \&... process member referenced by elf_e here ...
201         c = elf_next(elf_e);
202         elf_end(elf_e);
206 To create a new ELF file, use:
207 .Bd -literal -offset indent
208 int fd;
209 Elf *e;
210 \&...
211 if ((fd = open("filename", O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) {
212         \&... handle the error from open(2) ...
214 if ((e = elf_begin(fd, ELF_C_WRITE, (Elf *) 0)) == 0) {
215         \&... handle the error from elf_begin() ...
217 \&... create the ELF image using other elf(3) APIs ...
218 elf_update(e, ELF_C_WRITE);
219 elf_end(e);
221 .Sh ERRORS
222 Function
223 .Fn elf_begin
224 can fail with the following errors:
226 .Bl -tag -width "[ELF_E_RESOURCE]"
227 .It Bq Er ELF_E_ARGUMENT
228 An unrecognized value was specified in argument
229 .Ar cmd .
230 .It Bq Er ELF_E_ARGUMENT
231 A non-null value for argument
232 .Ar elf
233 was specified when
234 .Ar cmd
235 was set to
236 .Dv ELF_C_RDWR .
237 .It Bq Er ELF_E_ARGUMENT
238 The value of argument
239 .Ar fd
240 differs from the one the ELF descriptor
241 .Ar elf
242 was created with.
243 .It Bq Er ELF_E_ARGUMENT
244 Argument
245 .Ar cmd
246 differs from the value specified when ELF descriptor
247 .Ar elf
248 was created.
249 .It Bq Er ELF_E_ARGUMENT
250 Argument
251 .Ar elf
252 was not a descriptor for an
253 .Xr ar 1
254 archive.
255 .It Bq Er ELF_E_ARGUMENT
257 .Xr ar 1
258 archive was opened with with
259 .Ar cmd
260 set to
261 .Dv ELF_C_RDWR .
262 .It Bq Er ELF_E_IO
263 Function
264 .Fn elf_begin
265 was unable to truncate a file opened for writing using
266 .Dv ELF_C_WRITE .
267 .It Bq Er ELF_E_RESOURCE
268 An out of memory condition was encountered.
269 .It Bq Er ELF_E_SEQUENCE
270 Function
271 .Fn elf_begin
272 was called before a working version was established with
273 .Xr elf_version 3 .
275 .Sh SEE ALSO
276 .Xr elf 3 ,
277 .Xr elf_end 3 ,
278 .Xr elf_errno 3 ,
279 .Xr elf_memory 3 ,
280 .Xr elf_next 3 ,
281 .Xr elf_rand 3 ,
282 .Xr elf_update 3 ,
283 .Xr gelf 3