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