Merge commit 'b31ca922c7346747131aed07c0c171ec2f573aac' into merges
[unleashed.git] / share / man / man3elf / elf_begin.3elf
blobea182651de1ed6a7c61ed6169e9b0d1fed543334
1 '\" te
2 .\"  Copyright 1989 AT&T  Copyright (c) 1996, Sun Microsystems, Inc.  All Rights Reserved
3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
4 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
5 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
6 .TH ELF_BEGIN 3ELF "Jul 11, 2001"
7 .SH NAME
8 elf_begin, elf_end, elf_memory, elf_next, elf_rand \- process ELF object files
9 .SH SYNOPSIS
10 .LP
11 .nf
12 cc [ \fIflag\fR... ] \fIfile\fR ... \fB-lelf\fR [ \fIlibrary\fR ... ]
13 #include <libelf.h>
15 \fBElf *\fR\fBelf_begin\fR(\fBint\fR \fIfildes\fR, \fBElf_Cmd\fR \fIcmd\fR, \fBElf *\fR\fIref\fR);
16 .fi
18 .LP
19 .nf
20 \fBint\fR \fBelf_end\fR(\fBElf *\fR\fIelf\fR);
21 .fi
23 .LP
24 .nf
25 \fBElf *\fR\fBelf_memory\fR(\fBchar *\fR\fIimage\fR, \fBsize_t\fR \fIsz\fR);
26 .fi
28 .LP
29 .nf
30 \fBElf_Cmd\fR \fBelf_next\fR(\fBElf *\fR\fIelf\fR);
31 .fi
33 .LP
34 .nf
35 \fBsize_t\fR \fBelf_rand\fR(\fBElf *\fR\fIelf\fR, \fBsize_t\fR \fIoffset\fR);
36 .fi
38 .SH DESCRIPTION
39 .sp
40 .LP
41 The \fBelf_begin()\fR, \fBelf_end()\fR, \fBelf_memory()\fR, \fBelf_next()\fR,
42 and \fBelf_rand()\fR functions work together to process Executable and Linking
43 Format (ELF) object files, either individually or as members of archives. After
44 obtaining an \fBELF\fR descriptor from \fBelf_begin()\fR or \fBelf_memory()\fR,
45 the program can read an existing file, update an existing file, or create a new
46 file. The \fIfildes\fR argument is an open file descriptor that
47 \fBelf_begin()\fR uses for reading or writing. The \fIelf\fR argument is an
48 \fBELF\fR descriptor previously returned from \fBelf_begin()\fR. The initial
49 file offset (see \fBlseek\fR(2)) is unconstrained, and the resulting file
50 offset is undefined.
51 .sp
52 .LP
53 The \fIcmd\fR argument can take the following values:
54 .sp
55 .ne 2
56 .na
57 \fB\fBELF_C_NULL\fR\fR
58 .ad
59 .RS 15n
60 When a program sets \fIcmd\fR to this value, \fBelf_begin()\fR returns a null
61 pointer, without opening a new descriptor. \fIref\fR is ignored for this
62 command. See the examples below for more information.
63 .RE
65 .sp
66 .ne 2
67 .na
68 \fB\fBELF_C_READ\fR\fR
69 .ad
70 .RS 15n
71 When a program wants to examine the contents of an existing file, it should set
72 \fIcmd\fR to this value. Depending on the value of \fIref\fR, this command
73 examines archive members or entire files. Three cases can occur.
74 .RS +4
75 .TP
76 .ie t \(bu
77 .el o
78 If \fIref\fR is a null pointer, \fBelf_begin()\fR allocates a new \fBELF\fR
79 descriptor and prepares to process the entire file. If the file being read is
80 an archive, \fBelf_begin()\fR also prepares the resulting descriptor to examine
81 the initial archive member on the next call to \fBelf_begin()\fR, as if the
82 program had used \fB elf_next()\fR or \fBelf_rand()\fR to ``move'' to the
83 initial member.
84 .RE
85 .RS +4
86 .TP
87 .ie t \(bu
88 .el o
89 If \fIref\fR is a non-null descriptor associated with an archive file,
90 \fBelf_begin()\fR lets a program obtain a separate \fBELF\fR descriptor
91 associated with an individual member. The program should have used
92 \fBelf_next()\fR or \fBelf_rand()\fR to position \fIref\fR appropriately
93 (except for the initial member, which \fBelf_begin()\fR prepares; see the
94 example below). In this case, \fIfildes\fR should be the same file descriptor
95 used for the parent archive.
96 .RE
97 .RS +4
98 .TP
99 .ie t \(bu
100 .el o
101 If \fIref\fR is a non-null \fBELF\fR descriptor that is not an archive,
102 \fBelf_begin()\fR increments the number of activations for the descriptor and
103 returns \fIref\fR, without allocating a new descriptor and without changing the
104 descriptor's read/write permissions. To terminate the descriptor for \fIref\fR,
105 the program must call \fBelf_end()\fR once for each activation. See the
106 examples below for more information.
111 .ne 2
113 \fB\fBELF_C_RDWR\fR\fR
115 .RS 15n
116 This command duplicates the actions of \fBELF_C_READ\fR and additionally allows
117 the program to update the file image (see \fBelf_update\fR(3ELF)). Using
118 \fBELF_C_READ\fR gives a read-only view of the file, while \fBELF_C_RDWR\fR
119 lets the program read \fIand\fR write the file. \fBELF_C_RDWR\fR is not valid
120 for archive members. If  \fIref\fR is non-null, it must have been created with
121 the \fBELF_C_RDWR\fR command.
125 .ne 2
127 \fB\fBELF_C_WRITE\fR\fR
129 .RS 15n
130 If the program wants to ignore previous file contents, presumably to create a
131 new file, it should set \fIcmd\fR to this value. \fIref\fR is ignored for this
132 command.
137 The \fBelf_begin()\fR function operates on all files (including files with zero
138 bytes), providing it can allocate memory for its internal structures and read
139 any necessary information from the file. Programs reading object files can call
140 \fBelf_kind\fR(3ELF) or \fBelf32_getehdr\fR(3ELF) to determine the file type
141 (only object files have an \fBELF\fR header). If the file is an archive with no
142 more members to process, or an error occurs, \fBelf_begin()\fR returns a null
143 pointer. Otherwise, the return value is a non-null \fBELF\fR descriptor.
146 Before the first call to \fBelf_begin()\fR, a program must call
147 \fBelf_version()\fR to coordinate versions.
150 The \fBelf_end()\fR function is used to terminate an \fBELF\fR descriptor,
151 \fIelf\fR, and to deallocate data associated with the descriptor. Until the
152 program terminates a descriptor, the data remain allocated. A null pointer is
153 allowed as an argument, to simplify error handling. If the program wants to
154 write data associated with the \fBELF\fR descriptor to the file, it must use
155 \fBelf_update()\fR before calling \fBelf_end()\fR.
158 Calling \fBelf_end()\fR removes one activation and returns the remaining
159 activation count. The library does not terminate the descriptor until the
160 activation count reaches \fB0\fR. Consequently, a \fB0\fR return value
161 indicates the \fBELF\fR descriptor is no longer valid.
164 The \fBelf_memory()\fR function returns a pointer to an \fBELF\fR descriptor.
165 The \fBELF\fR image has read operations enabled ( \fBELF_C_READ\fR). The
166 \fIimage\fR argument is a pointer to an image of the Elf file mapped into
167 memory. The \fIsz\fR argument is the size of the \fBELF\fR image. An \fBELF\fR
168 image that is mapped in with \fBelf_memory()\fR can be read and modified, but
169 the \fBELF\fR image size cannot be changed.
172 The \fBelf_next()\fR function provides sequential access to the next archive
173 member. Having an \fBELF\fR descriptor, \fIelf\fR, associated with an archive
174 member, \fBelf_next()\fR prepares the containing archive to access the
175 following member when the program calls \fBelf_begin()\fR. After successfully
176 positioning an archive for the next member, \fBelf_next()\fR returns the value
177 \fBELF_C_READ\fR. Otherwise, the open file was not an archive, \fIelf\fR was
178 \fINULL\fR, or an error occurred, and the return value is \fBELF_C_NULL\fR. In
179 either case, the return value can be passed as an argument to
180 \fBelf_begin()\fR, specifying the appropriate action.
183 The \fBelf_rand()\fR function provides random archive processing, preparing
184 \fIelf\fR to access an arbitrary archive member. The \fIelf\fR argument must be
185 a descriptor for the archive itself, not a member within the archive. The
186 \fIoffset\fR argument specifies the byte offset from the beginning of the
187 archive to the archive header of the desired member. See
188 \fBelf_getarsym\fR(3ELF) for more information about archive member offsets.
189 When \fBelf_rand()\fR works, it returns \fIoffset\fR. Otherwise, it returns
190 \fB0\fR, because an error occurred, \fIelf\fR was \fI NULL\fR, or the file was
191 not an archive (no archive member can have a zero offset). A program can mix
192 random and sequential archive processing.
193 .SS "System Services"
196 When processing a file, the library decides when to read or write the file,
197 depending on the program's requests. Normally, the library assumes the file
198 descriptor remains usable for the life of the \fBELF\fR descriptor. If,
199 however, a program must process many files simultaneously and the underlying
200 operating system limits the number of open files, the program can use
201 \fBelf_cntl()\fR to let it reuse file descriptors. After calling
202 \fBelf_cntl()\fR with appropriate arguments, the program can close the file
203 descriptor without interfering with the library.
206 All data associated with an \fBELF\fR descriptor remain allocated until
207 \fBelf_end()\fR terminates the descriptor's last activation. After the
208 descriptors have been terminated, the storage is released; attempting to
209 reference such data gives undefined behavior. Consequently, a program that
210 deals with multiple input (or output) files must keep the \fBELF\fR descriptors
211 active until it finishes with them.
212 .SH EXAMPLES
214 \fBExample 1 \fRA sample program of calling the \fBelf_begin()\fR function.
217 A prototype for reading a file appears on the next page. If the file is a
218 simple object file, the program executes the loop one time, receiving a null
219 descriptor in the second iteration. In this case, both \fBelf\fR and \fBarf\fR
220 will have the same value, the activation count will be \fB2\fR, and the program
221 calls \fBelf_end()\fR twice to terminate the descriptor. If the file is an
222 archive, the loop processes each archive member in turn, ignoring those that
223 are not object files.
226 .in +2
228 \fBif (elf_version(EV_CURRENT) == EV_NONE)
230         /* library out of date */
231         /* recover from error */
233 cmd = ELF_C_READ;
234 arf = elf_begin(fildes, cmd, (Elf *)0);
235 while ((elf = elf_begin(fildes, cmd, arf)) != 0)
237         if ((ehdr = elf32_getehdr(elf)) != 0)
238         {
239                 /* process the file \|.\|.\|. */
240         }
241         cmd = elf_next(elf);
242         elf_end(elf);
244 elf_end(arf);\fR
246 .in -2
250 Alternatively, the next example illustrates random archive processing. After
251 identifying the file as an archive, the program repeatedly processes archive
252 members of interest. For clarity, this example omits error checking and ignores
253 simple object files. Additionally, this fragment preserves the \fBELF\fR
254 descriptors for all archive members, because it does not call \fBelf_end()\fR
255 to terminate them.
258 .in +2
260 \fBelf_version(EV_CURRENT);
261 arf = elf_begin(fildes, ELF_C_READ, (Elf *)0);
262 if (elf_kind(arf) != ELF_K_AR)
264         /* not an archive */
266 /* initial processing */
267 /* set offset = \|.\|.\|. for desired member header */
268 while (elf_rand(arf, offset) == offset)
270         if ((elf = elf_begin(fildes, ELF_C_READ, arf)) == 0)
271                 break;
272         if ((ehdr = elf32_getehdr(elf)) != 0)
273         {
274                 /* process archive member \|.\|.\|. */
275         }
276         /* set offset = \|.\|.\|. for desired member header */
277 }\fR
279 .in -2
283 An archive starts with a ``magic string'' that has \fBSARMAG\fR bytes; the
284 initial archive member follows immediately. An application could thus provide
285 the following function to rewind an archive (the function returns \fB\(mi1\fR
286 for errors and \fB0\fR otherwise).
289 .in +2
291 \fB#include <ar.h>
292 #include <libelf.h>
294 rewindelf(Elf *elf)
296      if (elf_rand(elf, (size_t)SARMAG) == SARMAG)
297           return 0;
298      return \(mi1;
299 }\fR
301 .in -2
305 The following outline shows how one might create a new \fBELF\fR file. This
306 example is simplified to show the overall flow.
309 .in +2
311 \fBelf_version(EV_CURRENT);
312 fildes = open("path/name", O_RDWR|O_TRUNC|O_CREAT, 0666);
313 if ((elf = elf_begin(fildes, ELF_C_WRITE, (Elf *)0)) == 0)
314         return;
315 ehdr = elf32_newehdr(elf);
316 phdr = elf32_newphdr(elf, count);
317 scn = elf_newscn(elf);
318 shdr = elf32_getshdr(scn);
319 data = elf_newdata(scn);
320 elf_update(elf, ELF_C_WRITE);
321 elf_end(elf);\fR
323 .in -2
327 Finally, the following outline shows how one might update an existing \fBELF\fR
328 file. Again, this example is simplified to show the overall flow.
331 .in +2
333 \fBelf_version(EV_CURRENT);
334 fildes = open("path/name", O_RDWR);
335 elf = elf_begin(fildes, ELF_C_RDWR, (Elf *)0);
336 /* add new or delete old information */
337 \|.\|.\|.
338 /* ensure that the memory image of the file is complete */
339 elf_update(elf, ELF_C_NULL);
340 elf_update(elf, ELF_C_WRITE);   /* update file */
341 elf_end(elf);\fR
343 .in -2
347 Notice that both file creation examples open the file with write \fIand\fR read
348 permissions. On systems that support \fBmmap\fR(2), the library uses it to
349 enhance performance, and \fBmmap\fR(2) requires a readable file descriptor.
350 Although the library can use a write-only file descriptor, the application will
351 not obtain the performance advantages of \fBmmap\fR(2).
353 .SH ATTRIBUTES
356 See \fBattributes\fR(5) for descriptions of the following attributes:
361 box;
362 c | c
363 l | l .
364 ATTRIBUTE TYPE  ATTRIBUTE VALUE
366 Interface Stability     Stable
368 MT-Level        MT-Safe
371 .SH SEE ALSO
374 \fBcreat\fR(2), \fBlseek\fR(2), \fBmmap\fR(2), \fBopen\fR(2),
375 \fBar.h\fR(3HEAD), \fBelf\fR(3ELF), \fBelf32_getehdr\fR(3ELF),
376 \fBelf_cntl\fR(3ELF), \fBelf_getarhdr\fR(3ELF), \fBelf_getarsym\fR(3ELF),
377 \fBelf_getbase\fR(3ELF), \fBelf_getdata\fR(3ELF), \fBelf_getscn\fR(3ELF),
378 \fBelf_kind\fR(3ELF), \fBelf_rawfile\fR(3ELF), \fBelf_update\fR(3ELF),
379 \fBelf_version\fR(3ELF), \fBlibelf\fR(3LIB), \fBattributes\fR(5)