ELF(5) BSD File Formats Manual ELF(5)
NAME
|
elf − format of ELF executable binary files |
SYNOPSIS
|
#include <elf.h> |
DESCRIPTION
|
The header file 〈elf.h〉 defines the format of ELF executable binary files. Amongst these files are normal executable files, relocatable object files, core files and shared libraries. An executable file using the ELF file format consists of an ELF header, followed by a program header table or a section header table, or both. The ELF header is always at offset zero of the file. The program header table and the section header table’s offset in the file are defined in the ELF header. The two tables describe the rest of the particularities of the file. This header file describes the above mentioned headers as C structures and also includes structures for dynamic sections, relocation sections and symbol tables. The following types are used for N-bit architectures (N=32,64, ElfN stands for Elf32 or Elf64, uintN_t stands for uint32_t or uint64_t): |
|
Unsigned program address, uintN_t |
||||
|
Unsigned file offset, uintN_t |
||||
|
Unsigned section index, uint16_t |
||||
|
Unsigned version symbol information, uint16_t |
||||
|
unsigned char |
||||
|
uint16_t |
||||
|
int32_t |
||||
|
uint32_t |
||||
|
int64_t |
||||
|
uint64_t |
|
(Note: The *BSD terminology is a bit different. There Elf64_Half is twice as large as Elf32_Half, and Elf64Quarter is used for uint16_t. In order to avoid confusion these types are replaced by explicit ones in the below.) All data structures that the file format defines follow the ‘‘natural’’ size and alignment guidelines for the relevant class. If necessary, data structures contain explicit padding to ensure 4-byte alignment for 4-byte objects, to force structure sizes to a multiple of 4, etc. The ELF header is described by the type Elf32_Ehdr or Elf64_Ehdr: #define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
ElfN_Addr e_entry;
ElfN_Off e_phoff;
ElfN_Off e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} ElfN_Ehdr;
The fields have the following meanings: |
e_ident’ This array of bytes specifies to interpretthe file, independent of the processor or the file’sremaining contents. Within this array everything isnamed by macros, which start with the prefix EI_ andmay contain values which start with the prefix ELF.The following macros are defined:
|
EI_MAG0’ The first byte of the magic number. It must be filled with ELFMAG0. (0: 0x7f) EI_MAG1’ The second byte of the magic number. It must be filled with ELFMAG1. (1: ’E’) EI_MAG2’ The third byte of the magic number. It must be filled with ELFMAG2. (2: ’L’) EI_MAG3’ The fourth byte of the magic number. It must be filled with ELFMAG3. (3: ’F’) EI_CLASS’ The fifth byte identifies the architecture for this binary: ELFCLASSNONE EI_DATA’ The sixth byte specifies the data encoding of the processor-specific data in the file. Currently these encodings are supported: ELFDATANONE EI_VERSION EV_NONE’ Invalid version. EI_OSABI’ This byte identifies the operating system and ABI to which the object is targeted. Some fields in other ELF structures have flags and values that have platform specific meanings; the interpretation of those fields is determined by the value of this byte. E.g.: ELFOSABI_SYSV’ UNIX System V ABI. EI_ABIVERSION EI_PAD’ Start of padding. These bytes are reserved and set to zero. Programs which read them should ignore them. The value for EI_PAD will change in the future if currently unused bytes are given meanings. EI_BRAND’ Start of architecture identification. EI_NIDENT e_type’ This member of the structure identifies the object file type: ET_NONE e_machine’ This member specifies the required architecture for an individual file. E.g.: EM_NONE’ An unknown machine. e_version’ This member identifies the file version: EV_NONE’ Invalid version. e_entry’ This member gives the virtual address to which the system first transfers control, thus starting the process. If the file has no associated entry point, this member holds zero. e_phoff’ This member holds the program header table’s file offset in bytes. If the file has no program header table, this member holds zero. e_shoff’ This member holds the section header table’s file offset in bytes. If the file has no section header table this member holds zero. e_flags’ This member holds processor-specific flags associated with the file. Flag names take the form EF_‘machine_flag’. Currently no flags have been defined. e_ehsize’ This member holds the ELF header’s size in bytes. e_phentsize e_phnum’ This member holds the number of entries in the program header table. Thus the product of e_phentsize and e_phnum gives the table’s size in bytes. If a file has no program header, e_phnum holds the value zero. e_shentsize e_shnum’ This member holds the number of entries in the section header table. Thus the product of e_shentsize and e_shnum gives the section header table’s size in bytes. If a file has no section header table, e_shnum holds the value of zero. e_shstrndx SHN_UNDEF’ This value marks an undefined, missing, irrelevant, or otherwise meaningless section reference. For example, a symbol ‘‘defined’’ relative to section number SHN_UNDEF is an undefined symbol. SHN_LORESERVE SHN_LOPROC’ Values greater than or equal to SHN_HIPROC are reserved for processor-specific semantics. SHN_HIPROC’ Values less than or equal to SHN_LOPROC are reserved for processor-specific semantics. SHN_ABS’ This value specifies absolute values for the corresponding reference. For example, symbols defined relative to section number SHN_ABS have absolute values and are not affected by relocation. SHN_COMMON’ Symbols defined relative to this section are common symbols, such as Fortran COMMON or unallocated C external variables. SHN_HIRESERVE An executable or shared object file’s program header table is an array of structures, each describing a segment or other information the system needs to prepare the program for execution. An object file segment contains one or more sections. Program headers are meaningful only for executable and shared object files. A file specifies its own program header size with the ELF header’s e_phentsize and e_phnum members. The ELF program header is described by the type Elf32_Phdr or Elf64_Phdr depending on the architecture: typedef struct { typedef struct {
uint32_t p_type;
uint32_t p_flags;
Elf64_Off p_offset;
Elf64_Addr p_vaddr;
Elf64_Addr p_paddr;
uint64_t p_filesz;
uint64_t p_memsz;
uint64_t p_align;
} Elf64_Phdr;
The main difference between the 32-bit and the 64-bit program header lies in the location of the p_flags member in the total struct. |
p_type’ This member of the Phdr struct tells what kind ofsegment this array element describes or how to interpretthe array element’s information.
|
PT_NULL’ The array element is unused and the other members’ values are undefined. This lets the program header have ignored entries. PT_LOAD’ The array element specifies a loadable segment, described by p_filesz and p_memsz. The bytes from the file are mapped to the beginning of the memory segment. If the segment’s memory size (p_memsz) is larger than the file size (p_filesz), the ‘‘extra’’ bytes are defined to hold the value 0 and to follow the segment’s initialized area. The file size may not be larger than the memory size. Loadable segment entries in the program header table appear in ascending order, sorted on the p_vaddr member. PT_DYNAMIC PT_INTERP PT_NOTE’ The array element specifies the location and size for auxiliary information. PT_SHLIB’ This segment type is reserved but has unspecified semantics. Programs that contain an array element of this type do not conform to the ABI. PT_PHDR’ The array element, if present, specifies the location and size of the program header table itself, both in the file and in the memory image of the program. This segment type may not occur more than once in a file. Moreover, it may only occur if the program header table is part of the memory image of the program. If it is present, it must precede any loadable segment entry. PT_LOPROC PT_HIPROC p_offset p_vaddr p_paddr p_filesz p_memsz p_flags PF_X A text segment commonly has the flags PF_X and PF_R. A data segment commonly has PF_X, PF_W and PF_R. p_align A file’s section header table lets one locate all the file’s sections. The section header table is an array of Elf32_Shdr or Elf64_Shdr structures. The ELF header’s e_shoff member gives the byte offset from the beginning of the file to the section header table. e_shnum holds the number of entries the section header table contains. e_shentsize holds the size in bytes of each entry. A section header table index is a subscript into this array. Some section header table indices are reserved. An object file does not have sections for these special indices: SHN_UNDEF’ This value marks an undefined, missing, irrelevant or otherwise meaningless section reference. SHN_LORESERVE SHN_LOPROC’ Values greater than or equal to SHN_HIPROC are reserved for processor-specific semantics. SHN_HIPROC’ Values less than or equal to SHN_LOPROC are reserved for processor-specific semantics. SHN_ABS’ This value specifies the absolute value for the corresponding reference. For example, a symbol defined relative to section number SHN_ABS has an absolute value and is not affected by relocation. SHN_COMMON’ Symbols defined relative to this section are common symbols, such as FORTRAN COMMON or unallocated C external variables. SHN_HIRESERVE The section header has the following structure: typedef struct { |
|
uint32_t sh_name; |
||
|
uint32_t sh_type; |
||
|
uint32_t sh_flags; |
||
|
Elf32_Addr sh_addr; |
||
|
Elf32_Off sh_offset; |
||
|
uint32_t sh_size; |
||
|
uint32_t sh_link; |
||
|
uint32_t sh_info; |
||
|
uint32_t sh_addralign; |
||
|
uint32_t sh_entsize; |
|
} Elf32_Shdr; typedef struct {
|
|
uint32_t sh_name; |
||
|
uint32_t sh_type; |
||
|
uint64_t sh_flags; |
||
|
Elf64_Addr sh_addr; |
||
|
Elf64_Off sh_offset; |
||
|
uint64_t sh_size; |
||
|
uint32_t sh_link; |
||
|
uint32_t sh_info; |
||
|
uint64_t sh_addralign; |
||
|
uint64_t sh_entsize; |
|
} Elf64_Shdr; |
sh_name’ This member specifies the name of the section.Its value is an index into the section header string tablesection, giving the location of a null-terminated string.
|
sh_type’ This member categorizes the section’s contents and semantics. SHT_NULL’ This value marks the section header as inactive. It does not have an associated section. Other members of the section header have undefined values. SHT_PROGBITS SHT_SYMTAB’ This section holds a symbol table. Typically, SHT_SYMTAB provides symbols for link editing, though it may also be used for dynamic linking. As a complete symbol table, it may contain many symbols unnecessary for dynamic linking. An object file can also contain a SHN_DYNSYM section. SHT_STRTAB’ This section holds a string table. An object file may have multiple string table sections. SHT_RELA’ This section holds relocation entries with explicit addends, such as type Elf32_Rela for the 32-bit class of object files. An object may have multiple relocation sections. SHT_HASH’ This section holds a symbol hash table. An object participating in dynamic linking must contain a symbol hash table. An object file may have only one hash table. SHT_DYNAMIC SHT_NOTE’ This section holds information that marks the file in some way. SHT_NOBITS’ A section of this type occupies no space in the file but otherwise resembles SHN_PROGBITS. Although this section contains no bytes, the sh_offset member contains the conceptual file offset. SHT_REL’ This section holds relocation offsets without explicit addends, such as type Elf32_Rel for the 32-bit class of object files. An object file may have multiple relocation sections. SHT_SHLIB’ This section is reserved but has unspecified semantics. SHT_DYNSYM’ This section holds a minimal set of dynamic linking symbols. An object file can also contain a SHN_SYMTAB section. SHT_LOPROC’ This value up to and including SHT_HIPROC is reserved for processor-specific semantics. SHT_HIPROC’ This value down to and including SHT_LOPROC is reserved for processor-specific semantics. SHT_LOUSER’ This value specifies the lower bound of the range of indices reserved for application programs. SHT_HIUSER’ This value specifies the upper bound of the range of indices reserved for application programs. Section types between SHT_LOUSER and SHT_HIUSER may be used by the application, without conflicting with current or future system-defined section types. sh_flags’ Sections support one-bit flags that describe miscellaneous attributes. If a flag bit is set in sh_flags, the attribute is ‘‘on’’ for the section. Otherwise, the attribute is ‘‘off’’ or does not apply. Undefined attributes are set to zero. SHF_WRITE’ This section contains data that should
be writable during process execution. sh_addr’ If this section appears in the memory image of a process, this member holds the address at which the section’s first byte should reside. Otherwise, the member contains zero. sh_offset’ This member’s value holds the byte offset from the beginning of the file to the first byte in the section. One section type, SHT_NOBITS, occupies no space in the file, and its sh_offset member locates the conceptual placement in the file. sh_size’ This member holds the section’s size in bytes. Unless the section type is SHT_NOBITS, the section occupies sh_size bytes in the file. A section of type SHT_NOBITS may have a non-zero size, but it occupies no space in the file. sh_link’ This member holds a section header table index link, whose interpretation depends on the section type. sh_info’ This member holds extra information, whose interpretation depends on the section type. sh_addralign sh_entsize’ Some sections hold a table of fixed-sized entries, such as a symbol table. For such a section, this member gives the size in bytes for each entry. This member contains zero if the section does not hold a table of fixed-size entries. Various sections hold program and control information: .bss’ This section holds uninitialized data that contributes to the program’s memory image. By definition, the system initializes the data with zeros when the program begins to run. This section is of type SHT_NOBITS. The attribute types are SHF_ALLOC and SHF_WRITE. .comment .ctors’ This section holds initialized pointers to the C++ constructor functions. This section is of type SHT_PROGBITS. The attribute types are SHF_ALLOC and SHF_WRITE. .data’ This section holds initialized data that contribute to the program’s memory image. This section is of type SHT_PROGBITS. The attribute types are SHF_ALLOC and SHF_WRITE. .data1’ This section holds initialized data that contribute to the program’s memory image. This section is of type SHT_PROGBITS. The attribute types are SHF_ALLOC and SHF_WRITE. .debug’ This section holds information for symbolic debugging. The contents are unspecified. This section is of type SHT_PROGBITS. No attribute types are used. .dtors’ This section holds initialized pointers to the C++ destructor functions. This section is of type SHT_PROGBITS. The attribute types are SHF_ALLOC and SHF_WRITE. .dynamic .dynstr’ This section holds strings needed for dynamic linking, most commonly the strings that represent the names associated with symbol table entries. This section is of type SHT_STRTAB. The attribute type used is SHF_ALLOC. .dynsym’ This section holds the dynamic linking symbol table. This section is of type SHT_DYNSYM. The attribute used is SHF_ALLOC. .fini’ This section holds executable instructions that contribute to the process termination code. When a program exits normally the system arranges to execute the code in this section. This section is of type SHT_PROGBITS. The attributes used are SHF_ALLOC and SHF_EXECINSTR. .got’ This section holds the global offset table. This section is of type SHT_PROGBITS. The attributes are processor-specific. .hash’ This section holds a symbol hash table. This section is of type SHT_HASH. The attribute used is SHF_ALLOC. .init’ This section holds executable instructions that contribute to the process initialization code. When a program starts to run the system arranges to execute the code in this section before calling the main program entry point. This section is of type SHT_PROGBITS. The attributes used are SHF_ALLOC and SHF_EXECINSTR. .interp’ This section holds the pathname of a program interpreter. If the file has a loadable segment that includes the section, the section’s attributes will include the SHF_ALLOC bit. Otherwise, that bit will be off. This section is of type SHT_PROGBITS. .line’ This section holds line number information for symbolic debugging, which describes the correspondence between the program source and the machine code. The contents are unspecified. This section is of type SHT_PROGBITS. No attribute types are used. .note’ This section holds information in the ‘‘Note Section’’ format described below. This section is of type SHT_NOTE. No attribute types are used. OpenBSD native executables usually contain a .note.openbsd.ident section to identify themselves, for the kernel to bypass any compatibility ELF binary emulation tests when loading the file. .plt’ This section holds the procedure linkage table. This section is of type SHT_PROGBITS. The attributes are processor-specific. .relNAME .relaNAME .rodata’ This section holds read-only data that typically contributes to a non-writable segment in the process image. This section is of type SHT_PROGBITS. The attribute used is SHF_ALLOC. .rodata1 .shstrtab .strtab’ This section holds strings, most commonly the strings that represent the names associated with symbol table entries. If the file has a loadable segment that includes the symbol string table, the section’s attributes will include the SHF_ALLOC bit. Otherwise the bit will be off. This section is of type SHT_STRTAB. .symtab’ This section holds a symbol table. If the file has a loadable segment that includes the symbol table, the section’s attributes will include the SHF_ALLOC bit. Otherwise the bit will be off. This section is of type SHT_SYMTAB. .text’ This section holds the ‘‘text’’, or executable instructions, of a program. This section is of type SHT_PROGBITS. The attributes used are SHF_ALLOC and SHF_EXECINSTR. String table sections hold null-terminated character sequences, commonly called strings. The object file uses these strings to represent symbol and section names. One references a string as an index into the string table section. The first byte, which is index zero, is defined to hold a null character. Similarly, a string table’s last byte is defined to hold a null character, ensuring null termination for all strings. An object file’s symbol table holds information needed to locate and relocate a program’s symbolic definitions and references. A symbol table index is a subscript into this array. typedef struct { |
|
uint32_t st_name; |
||
|
Elf32_Addr st_value; |
||
|
uint32_t st_size; |
||
|
unsigned char st_info; |
||
|
unsigned char st_other; |
||
|
uint16_t st_shndx; |
|
} Elf32_Sym; typedef struct {
|
|
uint32_t st_name; |
||
|
unsigned char st_info; |
||
|
unsigned char st_other; |
||
|
uint16_t st_shndx; |
||
|
Elf64_Addr st_value; |
||
|
uint64_t st_size; |
|
} Elf64_Sym; |
st_name
|
This member holds an index into the object file’s symbol string table, which holds character representations of the symbol names. If the value is non-zero, it represents a string table index that gives the symbol name. Otherwise, the symbol table has no name. st_value st_size st_info STT_NOTYPE STT_OBJECT STT_FUNC’ The symbol is associated with a function or other executable code. STT_SECTION STT_FILE’ By convention, the symbol’s name gives the name of the source file associated with the object file. A file symbol has STB_LOCAL bindings, its section index is SHN_ABS, and it precedes the other STB_LOCAL symbols of the file, if it is present. STT_LOPROC STT_HIPROC STB_LOCAL STB_GLOBAL STB_WEAK’ Weak symbols resemble global symbols, but their definitions have lower precedence. STB_LOPROC STB_HIPROC There are macros for packing and unpacking the binding and type fields: ELF32_ST_BIND(info)’ or
ELF64_ST_BIND(info) extract a binding from an
st_info value. st_other st_shndx Relocation is the process of connecting symbolic references with symbolic definitions. Relocatable files must have information that describes how to modify their section contents, thus allowing executable and shared object files to hold the right information for a process’ program image. Relocation entries are these data. Relocation structures that do not need an addend: typedef struct { |
|
Elf32_Addr r_offset; |
||
|
uint32_t r_info; |
|
} Elf32_Rel; typedef struct {
|
|
Elf64_Addr r_offset; |
||
|
uint64_t r_info; |
|
} Elf64_Rel; Relocation structures that need an addend: typedef struct {
|
|
Elf32_Addr r_offset; |
||
|
uint32_t r_info; |
||
|
int32_t r_addend; |
|
} Elf32_Rela; typedef struct {
|
|
Elf64_Addr r_offset; |
||
|
uint64_t r_info; |
||
|
int64_t r_addend; |
|
} Elf64_Rela; |
r_offset
|
This member gives the location at which to apply the relocation action. For a relocatable file, the value is the byte offset from the beginning of the section to the storage unit affected by the relocation. For an executable file or shared object, the value is the virtual address of the storage unit affected by the relocation. r_info’ This member gives both the symbol table index with respect to which the relocation must be made and the type of relocation to apply. Relocation types are processor-specific. When the text refers to a relocation entry’s relocation type or symbol table index, it means the result of applying ELF_[32|64]_R_TYPE or ELF[32|64]_R_SYM, respectively, to the entry’s r_info member. r_addend SEE ALSO |
|
as(1), gdb(1), ld(1), objdump(1), execve(2), core(5) |
Hewlett-Packard, Elf-64 Object File Format.
Santa Cruz Operation, System V Application Binary Interface.
Unix System Laboratories, " Object Files", Executable and LinkingFormat (ELF).
HISTORY
|
OpenBSD ELF support first appeared in OpenBSD 1.2, although not all supported platforms use it as the native binary file format. ELF in itself first appeared in AT&T System V UNIX. The ELF format is an adopted standard. |
AUTHORS
|
The original version of this manual page was written by Jeroen Ruigrok van der Werven 〈asmodai@FreeBSD.org〉 with inspiration from BSDi’s BSD/OS elf manpage. BSD July 31, 1999 BSD |
....................................................................................................................................
About ~
Privacy Statement ~
Terms of Use ~
~
All Linux-Documentation.com