585 lines
17 KiB
Groff
585 lines
17 KiB
Groff
.\" Copyright (c) 2006-2008 Joseph Koshy. All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\"
|
|
.\" This software is provided by Joseph Koshy ``as is'' and
|
|
.\" any express or implied warranties, including, but not limited to, the
|
|
.\" implied warranties of merchantability and fitness for a particular purpose
|
|
.\" are disclaimed. in no event shall Joseph Koshy be liable
|
|
.\" for any direct, indirect, incidental, special, exemplary, or consequential
|
|
.\" damages (including, but not limited to, procurement of substitute goods
|
|
.\" or services; loss of use, data, or profits; or business interruption)
|
|
.\" however caused and on any theory of liability, whether in contract, strict
|
|
.\" liability, or tort (including negligence or otherwise) arising in any way
|
|
.\" out of the use of this software, even if advised of the possibility of
|
|
.\" such damage.
|
|
.\"
|
|
.\" $Id$
|
|
.\"
|
|
.Dd October 21, 2007
|
|
.Os
|
|
.Dt ELF 3
|
|
.Sh NAME
|
|
.Nm elf
|
|
.Nd API for manipulating ELF objects
|
|
.Sh LIBRARY
|
|
.Lb libelf
|
|
.Sh SYNOPSIS
|
|
.In libelf.h
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Lb libelf
|
|
provides functions that allow an application to read and manipulate
|
|
ELF object files, and to read
|
|
.Xr ar 1
|
|
archives.
|
|
The library allows the manipulation of ELF objects in a byte ordering
|
|
and word-size independent way, allowing an application to read and
|
|
create ELF objects for 32 and 64 bit architectures and for little-
|
|
and big-endian machines.
|
|
The library is capable of processing ELF objects that use extended
|
|
section numbering.
|
|
.Pp
|
|
This manual page serves to provide an overview of the functionality in
|
|
the ELF library.
|
|
Further information may found in the manual pages for individual
|
|
.Xr ELF 3
|
|
functions that comprise the library.
|
|
.Ss ELF Concepts
|
|
As described in
|
|
.Xr elf 5 ,
|
|
ELF files contain several data structures that are laid out in a
|
|
specific way.
|
|
ELF files begin with an
|
|
.Dq Executable Header ,
|
|
and may contain an optional
|
|
.Dq Program Header Table ,
|
|
and optional data in the form of ELF
|
|
.Dq sections .
|
|
A
|
|
.Dq Section Header Table
|
|
describes the content of the data in these sections.
|
|
.Pp
|
|
ELF objects have an associated
|
|
.Dq "ELF class"
|
|
which denotes the natural machine word size for the architecture
|
|
the object is associated with.
|
|
Objects for 32 bit architectures have an ELF class of
|
|
.Dv ELFCLASS32 .
|
|
Objects for 64 bit architectures have an ELF class of
|
|
.Dv ELFCLASS64 .
|
|
.Pp
|
|
ELF objects also have an associated
|
|
.Dq endianness
|
|
which denotes the endianness of the machine architecture associated
|
|
with the object.
|
|
This may be
|
|
.Dv ELFDATA2LSB
|
|
for little-endian architectures and
|
|
.Dv ELFDATA2MSB
|
|
for big-endian architectures.
|
|
.Pp
|
|
ELF objects are also associated with an API version number.
|
|
This version number determines the layout of the individual components
|
|
of an ELF file and the semantics associated with these.
|
|
.Ss Data Representation And Translation
|
|
The
|
|
.Xr ELF 3
|
|
library distinguishes between
|
|
.Dq native
|
|
representations of ELF data structures and their
|
|
.Dq file
|
|
representations.
|
|
.Pp
|
|
An application would work with ELF data in its
|
|
.Dq native
|
|
representation, i.e., using the native byteorder and alignment mandated
|
|
by the processor the application is running on.
|
|
The
|
|
.Dq file
|
|
representation of the same data could use a different byte ordering
|
|
and follow different constraints on object alignment than these native
|
|
constraints.
|
|
.Pp
|
|
Accordingly, the
|
|
.Xr ELF 3
|
|
library offers translation facilities
|
|
.Xr ( elf32_xlatetof 3 ,
|
|
.Xr elf32_xlatetom 3 ,
|
|
.Xr elf64_xlatetof 3
|
|
and
|
|
.Xr elf64_xlatetom 3 )
|
|
to and from these
|
|
representations and also provides higher-level APIs that retrieve and store
|
|
data from the ELF object in a transparent manner.
|
|
.Ss Library Working Version
|
|
Conceptually, there are three version numbers associated with an
|
|
application using the ELF library to manipulate ELF objects:
|
|
.Bl -bullet -compact -offset indent
|
|
.It
|
|
The ELF version that the application was compiled against.
|
|
This version determines the ABI expected by the application.
|
|
.It
|
|
The ELF version of the ELF object being manipulated by the
|
|
application through the ELF library.
|
|
.It
|
|
The ELF version (or set of versions) supported by the ELF library itself.
|
|
.El
|
|
.Pp
|
|
In order to facilitate working with ELF objects of differing versions,
|
|
the ELF library requires the application to call the
|
|
.Fn elf_version
|
|
function before invoking many of its operations, in order to inform
|
|
the library of the application's desired working version.
|
|
.Pp
|
|
In the current implementation, all three versions have to be
|
|
.Dv EV_CURRENT .
|
|
.Ss Namespace use
|
|
The ELF library uses the following prefixes:
|
|
.Bl -tag -width "ELF_F_*"
|
|
.It Dv elf_
|
|
Used for class-independent functions.
|
|
.It Dv elf32_
|
|
Used for functions working with 32 bit ELF objects.
|
|
.It Dv elf64_
|
|
Used for functions working with 64 bit ELF objects.
|
|
.It Dv Elf_
|
|
Used for class-independent data types.
|
|
.It Dv ELF_C_
|
|
Used for command values used in a few functions.
|
|
These symbols are defined as members of the
|
|
.Vt Dv Elf_Cmd
|
|
enumeration.
|
|
.It Dv ELF_E_
|
|
Used for error numbers.
|
|
.It Dv ELF_F_
|
|
Used for flags.
|
|
.It Dv ELF_K_
|
|
These constants define the kind of file associated with an ELF
|
|
descriptor.
|
|
See
|
|
.Xr elf_kind 3 .
|
|
The symbols are defined by the
|
|
.Vt Elf_Kind
|
|
enumeration.
|
|
.It Dv ELF_T_
|
|
These values are defined by the
|
|
.Vt Elf_Type
|
|
enumeration, and denote the types of ELF data structures
|
|
that can be present in an ELF object.
|
|
.El
|
|
.Pp
|
|
In addition, the library uses symbols with prefixes
|
|
.Dv _ELF
|
|
and
|
|
.Dv _libelf
|
|
for its internal use.
|
|
.Ss Descriptors
|
|
Applications communicate with the library using descriptors.
|
|
These are:
|
|
.Bl -tag -width ".Vt Elf_Data"
|
|
.It Vt Elf
|
|
An
|
|
.Vt Elf
|
|
descriptor represents an ELF object or an
|
|
.Xr ar 1
|
|
archive.
|
|
It is allocated using one of the
|
|
.Fn elf_begin
|
|
or
|
|
.Fn elf_memory
|
|
functions.
|
|
An
|
|
.Vt Elf
|
|
descriptor can be used to read and write data to an ELF file.
|
|
An
|
|
.Vt Elf
|
|
descriptor can be associated with zero or more
|
|
.Vt Elf_Scn
|
|
section descriptors.
|
|
.Pp
|
|
Given an ELF descriptor, the application may retrieve the ELF
|
|
object's class-dependent
|
|
.Dq "Executable Header"
|
|
structures using the
|
|
.Fn elf32_getehdr
|
|
or
|
|
.Fn elf64_getehdr
|
|
functions.
|
|
A new Ehdr structure may be allocated using the
|
|
.Fn elf64_newehdr
|
|
or
|
|
.Fn elf64_newehdr
|
|
functions.
|
|
.Pp
|
|
The
|
|
.Dq "Program Header Table"
|
|
associated with an ELF descriptor may be allocated using the
|
|
.Fn elf32_getphdr
|
|
or
|
|
.Fn elf64_getphdr
|
|
functions.
|
|
A new program header table may be allocated or an existing table
|
|
resized using the
|
|
.Fn elf32_newphdr
|
|
or
|
|
.Fn elf64_newphdr
|
|
functions.
|
|
.Pp
|
|
The
|
|
.Vt Elf
|
|
structure is opaque and has no members visible to the
|
|
application.
|
|
.\" TODO describe the Elf_Arhdr and Elf_Arsym structures.
|
|
.It Vt Elf_Data
|
|
An
|
|
.Vt Elf_Data
|
|
data structure describes an individual chunk of a ELF file as
|
|
represented in memory.
|
|
It has the following application visible members:
|
|
.Bl -tag -width ".Vt unsigned int d_version" -compact
|
|
.It Vt "uint64_t d_align"
|
|
The in-file alignment of the data buffer within its containing ELF section.
|
|
This value must be a power of two.
|
|
.It Vt "uint64_t d_off"
|
|
The offset with the containing section where this descriptors data
|
|
would be placed.
|
|
This field will be computed by the library unless the application
|
|
requests full control of the ELF object's layout.
|
|
.It Vt "uint64_t d_size"
|
|
The number of bytes of data in this descriptor.
|
|
.It Vt "void *d_buf"
|
|
A pointer to data in memory.
|
|
.It Vt "Elf_Type d_type"
|
|
The ELF type (see below) of the data in this descriptor.
|
|
.It Vt "unsigned int d_version"
|
|
The operating version for the data in this buffer.
|
|
.El
|
|
.Pp
|
|
.Vt Elf_Data
|
|
descriptors are usually associated with
|
|
.Vt Elf_Scn
|
|
descriptors.
|
|
Existing data descriptors associated with an ELF section may be
|
|
structures are retrieved using the
|
|
.Fn elf_getdata
|
|
function.
|
|
The
|
|
.Fn elf_newdata
|
|
function may be used to attach new data descriptors to an ELF section.
|
|
.It Vt Elf_Scn
|
|
.Vt Elf_Scn
|
|
descriptors represent a section in an ELF object.
|
|
.Pp
|
|
They are retrieved using the
|
|
.Fn elf_getscn
|
|
function.
|
|
An application may iterate through the existing sections of an ELF
|
|
object using the
|
|
.Fn elf_nextscn
|
|
function.
|
|
New sections may be allocated using the
|
|
.Fn elf_newscn
|
|
function.
|
|
.Pp
|
|
The
|
|
.Vt Elf_Scn
|
|
descriptor is opaque and contains no application modifiable fields.
|
|
.El
|
|
.Ss Supported Elf Types
|
|
The following ELF datatypes are supported by the library.
|
|
.Pp
|
|
.Bl -tag -width ".Dv ELF_T_SYMINFO" -compact
|
|
.It Dv ELF_T_ADDR
|
|
Machine addresses.
|
|
.It Dv ELF_T_BYTE
|
|
Byte data.
|
|
The library will not attempt to translate byte data.
|
|
.It Dv ELF_T_CAP
|
|
Software and hardware capability records.
|
|
.It Dv ELF_T_DYN
|
|
Records used in a section of type
|
|
.Dv SHT_DYNAMIC .
|
|
.It Dv ELF_T_EHDR
|
|
ELF executable header.
|
|
.It Dv ELF_T_HALF
|
|
16-bit unsigned words.
|
|
.It Dv ELF_T_LWORD
|
|
64 bit unsigned words.
|
|
.It Dv ELF_T_MOVE
|
|
ELF Move records.
|
|
.\".It Dv ELF_T_MOVEP
|
|
.\" As yet unsupported.
|
|
.It Dv ELF_T_NOTE
|
|
ELF Note structures.
|
|
.It Dv ELF_T_OFF
|
|
File offsets.
|
|
.It Dv ELF_T_PHDR
|
|
ELF program header table entries.
|
|
.It Dv ELF_T_REL
|
|
ELF relocation entries.
|
|
.It Dv ELF_T_RELA
|
|
ELF relocation entries with addends.
|
|
.It Dv ELF_T_SHDR
|
|
ELF section header entries.
|
|
.It Dv ELF_T_SWORD
|
|
Signed 32-bit words.
|
|
.It Dv ELF_T_SXWORD
|
|
Signed 64-bit words.
|
|
.It Dv ELF_T_SYMINFO
|
|
ELF symbol information.
|
|
.It Dv ELF_T_SYM
|
|
ELF symbol table entries.
|
|
.It Dv ELF_T_VDEF
|
|
Symbol version definition records.
|
|
.It Dv ELF_T_VNEED
|
|
Symbol version requirement records.
|
|
.It Dv ELF_T_WORD
|
|
Unsigned 32-bit words.
|
|
.It Dv ELF_T_XWORD
|
|
Unsigned 64-bit words.
|
|
.El
|
|
.Pp
|
|
The symbol
|
|
.Dv ELF_T_NUM
|
|
denotes the number of Elf types known to the library.
|
|
.Pp
|
|
The following table shows the mapping between ELF section types
|
|
defined in
|
|
.Xr elf 5
|
|
and the types supported by the library.
|
|
.Bl -column ".Dv SHT_PREINIT_ARRAY" ".Dv ELF_T_SYMINFO"
|
|
.It Em Section Type Ta Em "Library Type" Ta Em Description
|
|
.It Dv SHT_DYNAMIC Ta Dv ELF_T_DYN Ta Xo
|
|
.Sq .dynamic
|
|
section entries.
|
|
.Xc
|
|
.It Dv SHT_DYNSYM Ta Dv ELF_T_SYM Ta Symbols for dynamic linking.
|
|
.It Dv SHT_FINI_ARRAY Ta Dv ELF_T_ADDR Ta Termination function pointers.
|
|
.It Dv SHT_GROUP Ta Dv ELF_T_WORD Ta Section group marker.
|
|
.It Dv SHT_HASH Ta Dv ELF_T_HASH Ta Symbol hashes.
|
|
.It Dv SHT_INIT_ARRAY Ta Dv ELF_T_ADDR Ta Initialization function pointers.
|
|
.It Dv SHT_NOBITS Ta Dv ELF_T_BYTE Ta Xo
|
|
Empty sections.
|
|
See
|
|
.Xr elf 5 .
|
|
.Xc
|
|
.It Dv SHT_NOTE Ta Dv ELF_T_NOTE Ta ELF note records.
|
|
.It Dv SHT_PREINIT_ARRAY Ta Dv ELF_T_ADDR Ta Pre-initialization function pointers.
|
|
.It Dv SHT_PROGBITS Ta Dv ELF_T_BYTE Ta Machine code.
|
|
.It Dv SHT_REL Ta Dv ELF_T_REL Ta ELF relocation records.
|
|
.It Dv SHT_RELA Ta Dv ELF_T_RELA Ta Relocation records with addends.
|
|
.It Dv SHT_STRTAB Ta Dv ELF_T_BYTE Ta String tables.
|
|
.It Dv SHT_SYMTAB Ta Dv ELF_T_SYM Ta Symbol tables.
|
|
.It Dv SHT_SYMTAB_SHNDX Ta Dv ELF_T_WORD Ta Used with extended section numbering.
|
|
.It Dv SHT_GNU_verdef Ta Dv ELF_T_VDEF Ta Symbol version definitions.
|
|
.It Dv SHT_GNU_verneed Ta Dv ELF_T_VNEED Ta Symbol versioning requirements.
|
|
.It Dv SHT_GNU_versym Ta Dv ELF_T_HALF Ta Version symbols.
|
|
.It Dv SHT_SUNW_move Ta Dv ELF_T_MOVE Ta ELF move records.
|
|
.It Dv SHT_SUNW_syminfo Ta Dv ELF_T_SYMINFO Ta Additional symbol flags.
|
|
.El
|
|
.TE
|
|
.Ss Functional Grouping
|
|
This section contains a brief overview of the available functionality
|
|
in the ELF library.
|
|
Each function listed here is described further in its own manual page.
|
|
.Bl -tag -width indent
|
|
.It "Archive Access"
|
|
.Bl -tag -compact
|
|
.It Fn elf_getarsym
|
|
Retrieve the archive symbol table.
|
|
.It Fn elf_getarhdr
|
|
Retrieve the archive header for an object.
|
|
.It Fn elf_getbase
|
|
Retrieve the offset of a member inside an archive.
|
|
.It Fn elf_next
|
|
Iterate through an
|
|
.Xr ar 1
|
|
archive.
|
|
.It Fn elf_rand
|
|
Random access inside an
|
|
.Xr ar 1
|
|
archive.
|
|
.El
|
|
.It "Data Structures"
|
|
.Bl -tag -compact
|
|
.It Fn elf_getdata
|
|
Retrieve translated data for an ELF section.
|
|
.It Fn elf_getscn
|
|
Retrieve the section descriptor for a named section.
|
|
.It Fn elf_ndxscn
|
|
Retrieve the index for a section.
|
|
.It Fn elf_newdata
|
|
Add a new
|
|
.Vt Elf_Data
|
|
descriptor to an ELF section.
|
|
.It Fn elf_newscn
|
|
Add a new section descriptor to an ELF descriptor.
|
|
.It Fn elf_nextscn
|
|
Iterate through the sections in an ELF object.
|
|
.It Fn elf_rawdata
|
|
Retrieve untranslated data for an ELF sectino.
|
|
.It Fn elf_rawfile
|
|
Return a pointer to the untranslated file contents for an ELF object.
|
|
.It Fn elf32_getehdr , Fn elf64_getehdr
|
|
Retrieve the Executable Header in an ELF object.
|
|
.It Fn elf32_getphdr , Fn elf64_getphdr
|
|
Retrieve the Program Header Table in an ELF object.
|
|
.It Fn elf32_getshdr , Fn elf64_getshdr
|
|
Retrieve the ELF section header associated with an
|
|
.Vt Elf_Scn
|
|
descriptor.
|
|
.It Fn elf32_newehdr , Fn elf64_newehdr
|
|
Allocate an Executable Header in an ELF object.
|
|
.It Fn elf32_newphdr , Fn elf64_newphdr
|
|
Allocate or resize the Program Header Table in an ELF object.
|
|
.El
|
|
.It "Data Translation"
|
|
.Bl -tag -compact
|
|
.It Fn elf32_xlatetof , Fn elf64_xlatetof
|
|
Translate an ELF data structure from its native representation to its
|
|
file representation.
|
|
.It Fn elf32_xlatetom , Fn elf64_xlatetom
|
|
Translate an ELF data structure from its file representation to a
|
|
native representation.
|
|
.El
|
|
.It "Error Reporting"
|
|
.Bl -tag -compact
|
|
.It Fn elf_errno
|
|
Retrieve the current error.
|
|
.It Fn elf_errmsg
|
|
Retrieve a human readable description of the current error.
|
|
.El
|
|
.It "Initialization"
|
|
.Bl -tag -compact
|
|
.It Fn elf_begin
|
|
Opens an
|
|
.Xr ar 1
|
|
archive or ELF object given a file descriptor.
|
|
.It Fn elf_end
|
|
Close an ELF descriptor and release all its resources.
|
|
.It Fn elf_memory
|
|
Opens an
|
|
.Xr ar 1
|
|
archive or ELF object present in a memory arena.
|
|
.It Fn elf_version
|
|
Sets the operating version.
|
|
.El
|
|
.It "IO Control"
|
|
.Bl -tag -width ".Fn elf_setshstrndx" -compact
|
|
.It Fn elf_cntl
|
|
Manage the association between and ELF descriptor and its underlying file.
|
|
.It Fn elf_flagdata
|
|
Mark an
|
|
.Vt Elf_Data
|
|
descriptor as dirty.
|
|
.It Fn elf_flagehdr
|
|
Mark the ELF Executable Header in an ELF descriptor as dirty.
|
|
.It Fn elf_flagphdr
|
|
Mark the ELF Program Header Table in an ELF descriptor as dirty.
|
|
.It Fn elf_flagscn
|
|
Mark an
|
|
.Vt Elf_Scn
|
|
descriptor as dirty.
|
|
.It Fn elf_flagshdr
|
|
Mark an ELF Section Header as dirty.
|
|
.It Fn elf_setshstrndx
|
|
Set the index of the section name string table for the ELF object.
|
|
.It Fn elf_update
|
|
Recompute ELF object layout and optionally write the modified object
|
|
back to the underlying file.
|
|
.El
|
|
.It "Queries"
|
|
.Bl -tag -width ".Fn elf_getshstrndx" -compact
|
|
.It Fn elf32_checksum , Fn elf64_checkum
|
|
Compute checksum of an ELF object.
|
|
.It Fn elf_getident
|
|
Retrieve the identification bytes for an ELF object.
|
|
.It Fn elf_getshnum
|
|
Retrieve the number of sections in an ELF object.
|
|
.It Fn elf_getshstrndx
|
|
Retrieve the section index of the section name string table in
|
|
an ELF object.
|
|
.It Fn elf_hash
|
|
Compute the ELF hash value of a string.
|
|
.It Fn elf_kind
|
|
Query the kind of object associated with an ELF descriptor.
|
|
.It Fn elf32_fsize , Fn elf64_fsize
|
|
Return the size of the file representation of an ELF type.
|
|
.El
|
|
.El
|
|
.Ss Controlling ELF Object Layout
|
|
In the usual mode of operation, library will compute section
|
|
offsets and alignments based on the contents of an ELF descriptor's
|
|
sections without need for further intervention by the
|
|
application.
|
|
.Pp
|
|
However, if the application wishes to take complete charge of the
|
|
layout of the ELF file, it may set the
|
|
.Dv ELF_F_LAYOUT
|
|
flag on an ELF descriptor using
|
|
.Xr elf_flagelf 3 ,
|
|
following which the library will use the data offsets and alignments
|
|
specified by the application when laying out the file.
|
|
Application control of file layout is described further in the
|
|
.Xr elf_update 3
|
|
manual page.
|
|
.Pp
|
|
Gaps in between sections will be filled with the fill character
|
|
set by function
|
|
.Fn elf_fill .
|
|
.Ss Error Handling
|
|
In case an error is encountered, these library functions set an
|
|
internal error number and signal the presence of the error by
|
|
returning an special return value.
|
|
The application can check the
|
|
current error number by calling
|
|
.Xr elf_errno 3 .
|
|
A human readable description of the recorded error is available by
|
|
calling
|
|
.Xr elf_errmsg 3 .
|
|
.Ss Memory Management Rules
|
|
The library keeps track of all
|
|
.Vt Elf_Scn
|
|
and
|
|
.Vt Elf_Data
|
|
descriptors associated with an ELF descriptor and recovers them
|
|
when the descriptor is closed using
|
|
.Xr elf_end 3 .
|
|
Thus the application must not call
|
|
.Xr free 3
|
|
on data structures allocated by the ELF library.
|
|
.Pp
|
|
Conversely the library will not
|
|
free data that it has not allocated.
|
|
As an example, an application may call
|
|
.Xr elf_newdata 3
|
|
to allocate a new
|
|
.Vt Elf_Data
|
|
descriptor and can set the
|
|
.Va d_off
|
|
member of the descriptor to point to a region of memory allocated
|
|
using
|
|
.Xr malloc 3 .
|
|
It is the applications responsibility to free this arena, though the
|
|
library will reclaim the space used by the
|
|
.Vt Elf_Data
|
|
descriptor itself.
|
|
.Sh SEE ALSO
|
|
.Xr gelf 3 ,
|
|
.Xr elf 5
|
|
.Sh HISTORY
|
|
The original ELF(3) API was developed for Unix System V.
|
|
The current implementation of the ELF(3) API appeared in
|
|
.Fx 7.0 .
|
|
.Sh AUTHORS
|
|
The ELF library was written by
|
|
.An "Joseph Koshy"
|
|
.Aq jkoshy@FreeBSD.org .
|