| .\" $OpenBSD: elf.5,v 1.12 2003/10/27 20:23:58 jmc Exp $ |
| .\"Copyright (c) 1999 Jeroen Ruigrok van der Werven |
| .\"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 THE AUTHOR AND CONTRIBUTORS ``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 THE AUTHOR OR CONTRIBUTORS 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. |
| .\" |
| .\" $FreeBSD: src/share/man/man5/elf.5,v 1.21 2001/10/01 16:09:23 ru Exp $ |
| .\" |
| .\" Slightly adapted - aeb, 2004-01-01 |
| .\" 2005-07-15, Mike Frysinger <vapier@gentoo.org>, various fixes |
| .\" |
| .Dd July 31, 1999 |
| .Dt ELF 5 |
| .Os |
| .Sh NAME |
| .Nm elf |
| .Nd format of Executable and Linking Format (ELF) files |
| .Sh SYNOPSIS |
| .\" .Fd #include <elf_abi.h> |
| .Fd #include <elf.h> |
| .Sh DESCRIPTION |
| The header file |
| .\" .Aq Pa elf_abi.h |
| .Aq Pa 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. |
| .Pp |
| 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. |
| .Pp |
| .\" Applications which wish to process ELF binary files for their native |
| .\" architecture only should include |
| .\" .Aq Pa elf_abi.h |
| .\" in their source code. |
| .\" These applications should need to refer to |
| .\" all the types and structures by their generic names |
| .\" .Dq Elf_xxx |
| .\" and to the macros by |
| .\" .Dq ELF_xxx . |
| .\" Applications written this way can be compiled on any architecture, |
| .\" regardless of whether the host is 32-bit or 64-bit. |
| .\" .Pp |
| .\" Should an application need to process ELF files of an unknown |
| .\" architecture, then the application needs to explicitly use either |
| .\" .Dq Elf32_xxx |
| .\" or |
| .\" .Dq Elf64_xxx |
| .\" type and structure names. |
| .\" Likewise, the macros need to be identified by |
| .\" .Dq ELF32_xxx |
| .\" or |
| .\" .Dq ELF64_xxx . |
| .\" .Pp |
| This header file describes the above mentioned headers as C structures |
| and also includes structures for dynamic sections, relocation sections and |
| symbol tables. |
| .Pp |
| 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): |
| .Bd -literal -offset indent |
| ElfN_Addr Unsigned program address, uintN_t |
| ElfN_Off Unsigned file offset, uintN_t |
| ElfN_Section Unsigned section index, uint16_t |
| ElfN_Versym Unsigned version symbol information, uint16_t |
| Elf_Byte unsigned char |
| ElfN_Half uint16_t |
| ElfN_Sword int32_t |
| ElfN_Word uint32_t |
| ElfN_Sxword int64_t |
| ElfN_Xword uint64_t |
| .\" Elf32_Size Unsigned object size |
| .Ed |
| .Pp |
| (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.) |
| .Pp |
| All data structures that the file format defines follow the |
| .Dq 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. |
| .Pp |
| The ELF header is described by the type Elf32_Ehdr or Elf64_Ehdr: |
| .Bd -literal -offset indent |
| #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; |
| .Ed |
| .Pp |
| The fields have the following meanings: |
| .Bl -tag -width "e_phentsize" -offset indent |
| .It Dv e_ident |
| This array of bytes specifies to interpret the file, |
| independent of the processor or the file's remaining contents. |
| Within this array everything is named by macros, which start with |
| the prefix |
| .Sy EI_ |
| and may contain values which start with the prefix |
| .Sy ELF . |
| The following macros are defined: |
| .Bl -tag -width "EI_VERSION" \" EI_ABIVERSION |
| .It Dv EI_MAG0 |
| The first byte of the magic number. |
| It must be filled with |
| .Sy ELFMAG0 . |
| (0: 0x7f) |
| .It Dv EI_MAG1 |
| The second byte of the magic number. |
| It must be filled with |
| .Sy ELFMAG1 . |
| (1: 'E') |
| .It Dv EI_MAG2 |
| The third byte of the magic number. |
| It must be filled with |
| .Sy ELFMAG2 . |
| (2: 'L') |
| .It Dv EI_MAG3 |
| The fourth byte of the magic number. |
| It must be filled with |
| .Sy ELFMAG3 . |
| (3: 'F') |
| .It Dv EI_CLASS |
| The fifth byte identifies the architecture for this binary: |
| .Pp |
| .Bl -tag -width "ELFCLASSNONE" -compact |
| .It Dv ELFCLASSNONE |
| This class is invalid. |
| .It Dv ELFCLASS32 |
| This defines the 32-bit architecture. |
| It supports machines with files |
| and virtual address spaces up to 4 Gigabytes. |
| .It Dv ELFCLASS64 |
| This defines the 64-bit architecture. |
| .El |
| .It Dv EI_DATA |
| The sixth byte specifies the data encoding of the processor-specific |
| data in the file. |
| Currently these encodings are supported: |
| .Pp |
| .Bl -tag -width "ELFDATA2LSB" -compact |
| .It Dv ELFDATANONE |
| Unknown data format. |
| .It Dv ELFDATA2LSB |
| Two's complement, little-endian. |
| .It Dv ELFDATA2MSB |
| Two's complement, big-endian. |
| .El |
| .It Dv EI_VERSION |
| The version number of the ELF specification: |
| .Pp |
| .Bl -tag -width "EV_CURRENT" -compact |
| .It Dv EV_NONE |
| Invalid version. |
| .It Dv EV_CURRENT |
| Current version. |
| .El |
| .It Dv 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.: |
| .Pp |
| .Bl -tag -width "ELFOSABI_STANDALONE" -compact |
| .It Dv ELFOSABI_NONE |
| Same as ELFOSABI_SYSV |
| .\" 0 |
| .It Dv ELFOSABI_SYSV |
| UNIX System V ABI. |
| .\" 0 |
| .\" synonym: ELFOSABI_NONE |
| .It Dv ELFOSABI_HPUX |
| HP-UX ABI. |
| .\" 1 |
| .It Dv ELFOSABI_NETBSD |
| NetBSD ABI. |
| .\" 2 |
| .It Dv ELFOSABI_LINUX |
| Linux ABI. |
| .\" 3 |
| .\" .It Dv ELFOSABI_HURD |
| .\" Hurd ABI. |
| .\" 4 |
| .\" .It Dv ELFOSABI_86OPEN |
| .\" 86Open Common IA32 ABI. |
| .\" 5 |
| .It Dv ELFOSABI_SOLARIS |
| Solaris ABI. |
| .\" 6 |
| .\" .It Dv ELFOSABI_MONTEREY |
| .\" Monterey project ABI. Now replaced by |
| .\" ELFOSABI_AIX |
| .\" 7 |
| .It Dv ELFOSABI_IRIX |
| IRIX ABI. |
| .\" 8 |
| .It Dv ELFOSABI_FREEBSD |
| FreeBSD ABI. |
| .\" 9 |
| .It Dv ELFOSABI_TRU64 |
| TRU64 UNIX ABI. |
| .\" 10 |
| .\" ELFOSABI_MODESTO |
| .\" 11 |
| .\" ELFOSABI_OPENBSD |
| .\" 12 |
| .It Dv ELFOSABI_ARM |
| ARM architecture ABI. |
| .\" 97 |
| .It Dv ELFOSABI_STANDALONE |
| Stand-alone (embedded) ABI. |
| .\" 255 |
| .El |
| .It Dv EI_ABIVERSION |
| This byte identifies the version of the ABI |
| to which the object is targeted. |
| This field is used to distinguish among incompatible versions of an ABI. |
| The interpretation of this version number |
| is dependent on the ABI identified by the EI_OSABI field. |
| Applications conforming to this specification use the value 0. |
| .It Dv 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. |
| .It Dv EI_BRAND |
| Start of architecture identification. |
| .It Dv EI_NIDENT |
| The size of the e_ident array. |
| .El |
| .Pp |
| .It Dv e_type |
| This member of the structure identifies the object file type: |
| .Pp |
| .Bl -tag -width "ET_NONE" -compact |
| .It Dv ET_NONE |
| An unknown type. |
| .It Dv ET_REL |
| A relocatable file. |
| .It Dv ET_EXEC |
| An executable file. |
| .It Dv ET_DYN |
| A shared object. |
| .It Dv ET_CORE |
| A core file. |
| .El |
| .Pp |
| .It Dv e_machine |
| This member specifies the required architecture for an individual file. |
| E.g.: |
| .Pp |
| .Bl -tag -width "EM_MIPS_RS4_BE" -compact |
| .It Dv EM_NONE |
| An unknown machine. |
| .\" 0 |
| .It Dv EM_M32 |
| AT&T WE 32100. |
| .\" 1 |
| .It Dv EM_SPARC |
| Sun Microsystems SPARC. |
| .\" 2 |
| .It Dv EM_386 |
| Intel 80386. |
| .\" 3 |
| .It Dv EM_68K |
| Motorola 68000. |
| .\" 4 |
| .It Dv EM_88K |
| Motorola 88000. |
| .\" 5 |
| .\" .It Dv EM_486 |
| .\" Intel 80486. |
| .\" 6 |
| .It Dv EM_860 |
| Intel 80860. |
| .\" 7 |
| .It Dv EM_MIPS |
| MIPS RS3000 (big-endian only). |
| .\" 8 |
| .\" EM_S370 |
| .\" 9 |
| .\" .It Dv EM_MIPS_RS4_BE |
| .\" MIPS RS4000 (big-endian only). Deprecated. |
| .\" 10 |
| .\" EM_MIPS_RS3_LE (MIPS R3000 little-endian) |
| .\" 10 |
| .It Dv EM_PARISC |
| HP/PA. |
| .\" 15 |
| .It Dv EM_SPARC32PLUS |
| SPARC with enhanced instruction set. |
| .\" 18 |
| .It Dv EM_PPC |
| PowerPC. |
| .\" 20 |
| .It Dv EM_PPC64 |
| PowerPC 64-bit. |
| .\" 21 |
| .It Dv EM_S390 |
| IBM S/390 |
| .\" 22 |
| .It Dv EM_ARM |
| Advanced RISC Machines |
| .\" 40 |
| .It Dv EM_SH |
| Renesas SuperH |
| .\" 42 |
| .It Dv EM_SPARCV9 |
| SPARC v9 64-bit. |
| .\" 43 |
| .It Dv EM_IA_64 |
| Intel Itanium |
| .\" 50 |
| .It Dv EM_X86_64 |
| AMD x86-64 |
| .\" 62 |
| .It Dv EM_VAX |
| DEC Vax. |
| .\" 75 |
| .\" EM_CRIS |
| .\" 76 |
| .\" .It Dv EM_ALPHA |
| .\" Compaq [DEC] Alpha. |
| .\" .It Dv EM_ALPHA_EXP |
| .\" Compaq [DEC] Alpha with enhanced instruction set. |
| .El |
| .Pp |
| .It Dv e_version |
| This member identifies the file version: |
| .Pp |
| .Bl -tag -width "EV_CURRENT" -compact |
| .It Dv EV_NONE |
| Invalid version. |
| .It Dv EV_CURRENT |
| Current version. |
| .El |
| .It Dv 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. |
| .It Dv 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. |
| .It Dv 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. |
| .It Dv 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. |
| .It Dv e_ehsize |
| This member holds the ELF header's size in bytes. |
| .It Dv e_phentsize |
| This member holds the size in bytes of one entry in the file's program header |
| table; all entries are the same size. |
| .It Dv e_phnum |
| This member holds the number of entries in the program header |
| table. |
| Thus the product of |
| .Sy e_phentsize |
| and |
| .Sy e_phnum |
| gives the table's size |
| in bytes. |
| If a file has no program header, |
| .Sy e_phnum |
| holds the value zero. |
| .It Dv e_shentsize |
| This member holds a sections header's size in bytes. |
| A section header is one |
| entry in the section header table; all entries are the same size. |
| .It Dv e_shnum |
| This member holds the number of entries in the section header table. |
| Thus |
| the product of |
| .Sy e_shentsize |
| and |
| .Sy e_shnum |
| gives the section header table's size in bytes. |
| If a file has no section |
| header table, |
| .Sy e_shnum |
| holds the value of zero. |
| .It Dv e_shstrndx |
| This member holds the section header table index of the entry associated |
| with the section name string table. |
| If the file has no section name string |
| table, this member holds the value |
| .Sy SHN_UNDEF . |
| .Bl -tag -width "SHN_LORESERVE" |
| .It Dv SHN_UNDEF |
| This value marks an undefined, missing, irrelevant, or otherwise meaningless |
| section reference. |
| For example, a symbol |
| .Dq defined |
| relative to section number |
| .Sy SHN_UNDEF |
| is an undefined symbol. |
| .It Dv SHN_LORESERVE |
| This value specifies the lower bound of the range of reserved indices. |
| .It Dv SHN_LOPROC |
| Values greater than or equal to |
| .Sy SHN_HIPROC |
| are reserved for processor-specific semantics. |
| .It Dv SHN_HIPROC |
| Values less than or equal to |
| .Sy SHN_LOPROC |
| are reserved for processor-specific semantics. |
| .It Dv SHN_ABS |
| This value specifies absolute values for the corresponding reference. |
| For |
| example, symbols defined relative to section number |
| .Sy SHN_ABS |
| have absolute values and are not affected by relocation. |
| .It Dv SHN_COMMON |
| Symbols defined relative to this section are common symbols, such as Fortran |
| COMMON or unallocated C external variables. |
| .It Dv SHN_HIRESERVE |
| This value specifies the upper bound of the range of reserved |
| indices between |
| .Sy SHN_LORESERVE |
| and |
| .Sy SHN_HIRESERVE , |
| inclusive; the values do |
| not reference the section header table. |
| That is, the section header table |
| does |
| .Em not |
| contain entries for the reserved indices. |
| .El |
| .El |
| .Pp |
| 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 |
| .Em segment |
| contains one or more |
| .Em 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 |
| .Sy e_phentsize |
| and |
| .Sy e_phnum |
| members. |
| The ELF program header is described by the type Elf32_Phdr or Elf64_Phdr |
| depending on the architecture: |
| .Bd -literal -offset indent |
| typedef struct { |
| uint32_t p_type; |
| Elf32_Off p_offset; |
| Elf32_Addr p_vaddr; |
| Elf32_Addr p_paddr; |
| uint32_t p_filesz; |
| uint32_t p_memsz; |
| uint32_t p_flags; |
| uint32_t p_align; |
| } Elf32_Phdr; |
| .Ed |
| .Bd -literal -offset indent |
| 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; |
| .Ed |
| .Pp |
| The main difference between the 32-bit and the 64-bit program header lies |
| in the location of the |
| .Sy p_flags |
| member in the total struct. |
| .Bl -tag -width "p_offset" -offset indent |
| .It Dv p_type |
| This member of the Phdr struct tells what kind of segment this array |
| element describes or how to interpret the array element's information. |
| .Bl -tag -width "PT_DYNAMIC" |
| .It Dv PT_NULL |
| The array element is unused and the other members' values are undefined. |
| This lets the program header have ignored entries. |
| .It Dv PT_LOAD |
| The array element specifies a loadable segment, described by |
| .Sy p_filesz |
| and |
| .Sy p_memsz . |
| The bytes from the file are mapped to the beginning of the memory |
| segment. |
| If the segment's memory size |
| .Pq Sy p_memsz |
| is larger than the file size |
| .Pq Sy p_filesz , |
| the |
| .Dq 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 |
| .Sy p_vaddr |
| member. |
| .It Dv PT_DYNAMIC |
| The array element specifies dynamic linking information. |
| .It Dv PT_INTERP |
| The array element specifies the location and size of a null-terminated |
| path name to invoke as an interpreter. |
| This segment type is meaningful |
| only for executable files (though it may occur for shared objects). |
| However it may not occur more than once in a file. |
| If it is present, it must precede any loadable segment entry. |
| .It Dv PT_NOTE |
| The array element specifies the location and size for auxiliary information. |
| .It Dv 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. |
| .It Dv 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. |
| .It Dv PT_LOPROC |
| Values greater than or equal to |
| .Sy PT_HIPROC |
| are reserved for processor-specific semantics. |
| .It Dv PT_HIPROC |
| Values less than or equal to |
| .Sy PT_LOPROC |
| are reserved for processor-specific semantics. |
| .El |
| .Pp |
| .It Dv p_offset |
| This member holds the offset from the beginning of the file at which |
| the first byte of the segment resides. |
| .It Dv p_vaddr |
| This member holds the virtual address at which the first byte of the |
| segment resides in memory. |
| .It Dv p_paddr |
| On systems for which physical addressing is relevant, this member is |
| reserved for the segment's physical address. |
| Under |
| .Bx |
| this member is |
| not used and must be zero. |
| .It Dv p_filesz |
| This member holds the number of bytes in the file image of the segment. |
| It may be zero. |
| .It Dv p_memsz |
| This member holds the number of bytes in the memory image of the segment. |
| It may be zero. |
| .It Dv p_flags |
| This member holds flags relevant to the segment: |
| .Pp |
| .Bl -tag -width "PF_X" -compact |
| .It Dv PF_X |
| An executable segment. |
| .It Dv PF_W |
| A writable segment. |
| .It Dv PF_R |
| A readable segment. |
| .El |
| .Pp |
| A text segment commonly has the flags |
| .Sy PF_X |
| and |
| .Sy PF_R . |
| A data segment commonly has |
| .Sy PF_X , |
| .Sy PF_W |
| and |
| .Sy PF_R . |
| .It Dv p_align |
| This member holds the value to which the segments are aligned in memory |
| and in the file. |
| Loadable process segments must have congruent values for |
| .Sy p_vaddr |
| and |
| .Sy p_offset , |
| modulo the page size. |
| Values of zero and one mean no alignment is required. |
| Otherwise, |
| .Sy p_align |
| should be a positive, integral power of two, and |
| .Sy p_vaddr |
| should equal |
| .Sy p_offset , |
| modulo |
| .Sy p_align . |
| .El |
| .Pp |
| 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 |
| .Sy e_shoff |
| member gives the byte offset from the beginning of the file to the section |
| header table. |
| .Sy e_shnum |
| holds the number of entries the section header table contains. |
| .Sy e_shentsize |
| holds the size in bytes of each entry. |
| .Pp |
| 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: |
| .Bl -tag -width "SHN_LORESERVE" |
| .It Dv SHN_UNDEF |
| This value marks an undefined, missing, irrelevant or otherwise meaningless |
| section reference. |
| .It Dv SHN_LORESERVE |
| This value specifies the lower bound of the range of reserved indices. |
| .It Dv SHN_LOPROC |
| Values greater than or equal to |
| .Sy SHN_HIPROC |
| are reserved for processor-specific semantics. |
| .It Dv SHN_HIPROC |
| Values less than or equal to |
| .Sy SHN_LOPROC |
| are reserved for processor-specific semantics. |
| .It Dv SHN_ABS |
| This value specifies the absolute value for the corresponding reference. |
| For |
| example, a symbol defined relative to section number |
| .Sy SHN_ABS |
| has an absolute value and is not affected by relocation. |
| .It Dv SHN_COMMON |
| Symbols defined relative to this section are common symbols, such as FORTRAN |
| COMMON or unallocated C external variables. |
| .It Dv SHN_HIRESERVE |
| This value specifies the upper bound of the range of reserved indices. |
| The |
| system reserves indices between |
| .Sy SHN_LORESERVE |
| and |
| .Sy SHN_HIRESERVE , |
| inclusive. |
| The section header table does not contain entries for the |
| reserved indices. |
| .El |
| .Pp |
| The section header has the following structure: |
| .Bd -literal -offset indent |
| 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; |
| .Ed |
| .Bd -literal -offset indent |
| 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; |
| .Ed |
| .Pp |
| No real differences exist between the 32-bit and 64-bit section headers. |
| .Bl -tag -width "sh_addralign" -offset indent |
| .It Dv sh_name |
| This member specifies the name of the section. |
| Its value is an index |
| into the section header string table section, giving the location of |
| a null-terminated string. |
| .It Dv sh_type |
| This member categorizes the section's contents and semantics. |
| .Bl -tag -width "SHT_PROGBITS" |
| .It Dv 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. |
| .It Dv SHT_PROGBITS |
| This section holds information defined by the program, whose |
| format and meaning are determined solely by the program. |
| .It Dv SHT_SYMTAB |
| This section holds a symbol table. |
| Typically, |
| .Sy 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 |
| .Sy SHT_DYNSYM |
| section. |
| .It Dv SHT_STRTAB |
| This section holds a string table. |
| An object file may have multiple |
| string table sections. |
| .It Dv SHT_RELA |
| This section holds relocation entries with explicit addends, such |
| as type |
| .Sy Elf32_Rela |
| for the 32-bit class of object files. |
| An object may have multiple |
| relocation sections. |
| .It Dv 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. |
| .It Dv SHT_DYNAMIC |
| This section holds information for dynamic linking. |
| An object file may |
| have only one dynamic section. |
| .It Dv SHT_NOTE |
| This section holds information that marks the file in some way. |
| .It Dv SHT_NOBITS |
| A section of this type occupies no space in the file but otherwise |
| resembles |
| .Sy SHT_PROGBITS . |
| Although this section contains no bytes, the |
| .Sy sh_offset |
| member contains the conceptual file offset. |
| .It Dv SHT_REL |
| This section holds relocation offsets without explicit addends, such |
| as type |
| .Sy Elf32_Rel |
| for the 32-bit class of object files. |
| An object file may have multiple |
| relocation sections. |
| .It Dv SHT_SHLIB |
| This section is reserved but has unspecified semantics. |
| .It Dv SHT_DYNSYM |
| This section holds a minimal set of dynamic linking symbols. |
| An |
| object file can also contain a |
| .Sy SHT_SYMTAB |
| section. |
| .It Dv SHT_LOPROC |
| This value up to and including |
| .Sy SHT_HIPROC |
| is reserved for processor-specific semantics. |
| .It Dv SHT_HIPROC |
| This value down to and including |
| .Sy SHT_LOPROC |
| is reserved for processor-specific semantics. |
| .It Dv SHT_LOUSER |
| This value specifies the lower bound of the range of indices reserved for |
| application programs. |
| .It Dv SHT_HIUSER |
| This value specifies the upper bound of the range of indices reserved for |
| application programs. |
| Section types between |
| .Sy SHT_LOUSER |
| and |
| .Sy SHT_HIUSER |
| may be used by the application, without conflicting with current or future |
| system-defined section types. |
| .El |
| .Pp |
| .It Dv sh_flags |
| Sections support one-bit flags that describe miscellaneous attributes. |
| If a flag bit is set in |
| .Sy sh_flags , |
| the attribute is |
| .Dq on |
| for the section. |
| Otherwise, the attribute is |
| .Dq off |
| or does not apply. |
| Undefined attributes are set to zero. |
| .Pp |
| .Bl -tag -width "SHF_EXECINSTR" -compact |
| .It Dv SHF_WRITE |
| This section contains data that should be writable during process |
| execution. |
| .It Dv SHF_ALLOC |
| This section occupies memory during process execution. |
| Some control |
| sections do not reside in the memory image of an object file. |
| This |
| attribute is off for those sections. |
| .It Dv SHF_EXECINSTR |
| This section contains executable machine instructions. |
| .It Dv SHF_MASKPROC |
| All bits included in this mask are reserved for processor-specific |
| semantics. |
| .El |
| .Pp |
| .It Dv 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. |
| .It Dv 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, |
| .Sy SHT_NOBITS , |
| occupies no space in the file, and its |
| .Sy sh_offset |
| member locates the conceptual placement in the file. |
| .It Dv sh_size |
| This member holds the section's size in bytes. |
| Unless the section type |
| is |
| .Sy SHT_NOBITS , |
| the section occupies |
| .Sy sh_size |
| bytes in the file. |
| A section of type |
| .Sy SHT_NOBITS |
| may have a non-zero size, but it occupies no space in the file. |
| .It Dv sh_link |
| This member holds a section header table index link, whose interpretation |
| depends on the section type. |
| .It Dv sh_info |
| This member holds extra information, whose interpretation depends on the |
| section type. |
| .It Dv sh_addralign |
| Some sections have address alignment constraints. |
| If a section holds a |
| doubleword, the system must ensure doubleword alignment for the entire |
| section. |
| That is, the value of |
| .Sy sh_addr |
| must be congruent to zero, modulo the value of |
| .Sy sh_addralign . |
| Only zero and positive integral powers of two are allowed. |
| Values of zero |
| or one mean the section has no alignment constraints. |
| .It Dv 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. |
| .El |
| .Pp |
| Various sections hold program and control information: |
| .Bl -tag -width ".shstrtab" -offset indent |
| .It .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 |
| .Sy SHT_NOBITS . |
| The attribute types are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_WRITE . |
| .It .comment |
| This section holds version control information. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| No attribute types are used. |
| .It .ctors |
| This section holds initialized pointers to the C++ constructor functions. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attribute types are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_WRITE . |
| .It .data |
| This section holds initialized data that contribute to the program's |
| memory image. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attribute types are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_WRITE . |
| .It .data1 |
| This section holds initialized data that contribute to the program's |
| memory image. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attribute types are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_WRITE . |
| .It .debug |
| This section holds information for symbolic debugging. |
| The contents |
| are unspecified. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| No attribute types are used. |
| .It .dtors |
| This section holds initialized pointers to the C++ destructor functions. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attribute types are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_WRITE . |
| .It .dynamic |
| This section holds dynamic linking information. |
| The section's attributes |
| will include the |
| .Sy SHF_ALLOC |
| bit. |
| Whether the |
| .Sy SHF_WRITE |
| bit is set is processor-specific. |
| This section is of type |
| .Sy SHT_DYNAMIC . |
| See the attributes above. |
| .It .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 |
| .Sy SHT_STRTAB . |
| The attribute type used is |
| .Sy SHF_ALLOC . |
| .It .dynsym |
| This section holds the dynamic linking symbol table. |
| This section is of type |
| .Sy SHT_DYNSYM . |
| The attribute used is |
| .Sy SHF_ALLOC . |
| .It .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 |
| .Sy SHT_PROGBITS . |
| The attributes used are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_EXECINSTR . |
| .It .got |
| This section holds the global offset table. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attributes are processor-specific. |
| .It .hash |
| This section holds a symbol hash table. |
| This section is of type |
| .Sy SHT_HASH . |
| The attribute used is |
| .Sy SHF_ALLOC . |
| .It .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 |
| .Sy SHT_PROGBITS . |
| The attributes used are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_EXECINSTR . |
| .It .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 |
| .Sy SHF_ALLOC |
| bit. |
| Otherwise, that bit will be off. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| .It .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 |
| .Sy SHT_PROGBITS . |
| No attribute types are used. |
| .It .note |
| This section holds information in the |
| .Dq Note Section |
| format described below. |
| This section is of type |
| .Sy SHT_NOTE . |
| No attribute types are used. |
| .Ox |
| native executables usually contain a |
| .Sy .note.openbsd.ident |
| section to identify themselves, for the kernel to bypass any compatibility |
| ELF binary emulation tests when loading the file. |
| .It .plt |
| This section holds the procedure linkage table. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attributes are processor-specific. |
| .It .relNAME |
| This section holds relocation information as described below. |
| If the file |
| has a loadable segment that includes relocation, the section's attributes |
| will include the |
| .Sy SHF_ALLOC |
| bit. |
| Otherwise the bit will be off. |
| By convention, |
| .Dq NAME |
| is supplied by the section to which the relocations apply. |
| Thus a relocation |
| section for |
| .Sy .text |
| normally would have the name |
| .Sy .rel.text . |
| This section is of type |
| .Sy SHT_REL . |
| .It .relaNAME |
| This section holds relocation information as described below. |
| If the file |
| has a loadable segment that includes relocation, the section's attributes |
| will include the |
| .Sy SHF_ALLOC |
| bit. |
| Otherwise the bit will be off. |
| By convention, |
| .Dq NAME |
| is supplied by the section to which the relocations apply. |
| Thus a relocation |
| section for |
| .Sy .text |
| normally would have the name |
| .Sy .rela.text . |
| This section is of type |
| .Sy SHT_RELA . |
| .It .rodata |
| This section holds read-only data that typically contributes to a |
| non-writable segment in the process image. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attribute used is |
| .Sy SHF_ALLOC . |
| .It .rodata1 |
| This section holds read-only data that typically contributes to a |
| non-writable segment in the process image. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attribute used is |
| .Sy SHF_ALLOC . |
| .It .shstrtab |
| This section holds section names. |
| This section is of type |
| .Sy SHT_STRTAB . |
| No attribute types are used. |
| .It .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 |
| .Sy SHF_ALLOC |
| bit. |
| Otherwise the bit will be off. |
| This section is of type |
| .Sy SHT_STRTAB . |
| .It .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 |
| .Sy SHF_ALLOC |
| bit. |
| Otherwise the bit will be off. |
| This section is of type |
| .Sy SHT_SYMTAB . |
| .It .text |
| This section holds the |
| .Dq text , |
| or executable instructions, of a program. |
| This section is of type |
| .Sy SHT_PROGBITS . |
| The attributes used are |
| .Sy SHF_ALLOC |
| and |
| .Sy SHF_EXECINSTR . |
| .El |
| .Pp |
| 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 byte ('\\0'). |
| Similarly, a string table's last byte is defined to |
| hold a null byte, ensuring null termination for all strings. |
| .Pp |
| 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. |
| .Bd -literal -offset indent |
| 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; |
| .Ed |
| .Bd -literal -offset indent |
| 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; |
| .Ed |
| .Pp |
| The 32-bit and 64-bit versions have the same members, just in a different |
| order. |
| .Bl -tag -width "st_value" -offset indent |
| .It Dv 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. |
| .It Dv st_value |
| This member gives the value of the associated symbol. |
| .It Dv st_size |
| Many symbols have associated sizes. |
| This member holds zero if the symbol |
| has no size or an unknown size. |
| .It Dv st_info |
| This member specifies the symbol's type and binding attributes: |
| .Bl -tag -width "STT_SECTION" |
| .It Dv STT_NOTYPE |
| The symbol's type is not defined. |
| .It Dv STT_OBJECT |
| The symbol is associated with a data object. |
| .It Dv STT_FUNC |
| The symbol is associated with a function or other executable code. |
| .It Dv STT_SECTION |
| The symbol is associated with a section. |
| Symbol table entries of |
| this type exist primarily for relocation and normally have |
| .Sy STB_LOCAL |
| bindings. |
| .It Dv STT_FILE |
| By convention, the symbol's name gives the name of the source file |
| associated with the object file. |
| A file symbol has |
| .Sy STB_LOCAL |
| bindings, its section index is |
| .Sy SHN_ABS , |
| and it precedes the other |
| .Sy STB_LOCAL |
| symbols of the file, if it is present. |
| .It Dv STT_LOPROC |
| This value up to and including |
| .Sy STT_HIPROC |
| is reserved for processor-specific semantics. |
| .It Dv STT_HIPROC |
| This value down to and including |
| .Sy STT_LOPROC |
| is reserved for processor-specific semantics. |
| .El |
| .Bl -tag -width "STB_GLOBAL" |
| .It Dv STB_LOCAL |
| Local symbols are not visible outside the object file containing their |
| definition. |
| Local symbols of the same name may exist in multiple files |
| without interfering with each other. |
| .It Dv STB_GLOBAL |
| Global symbols are visible to all object files being combined. |
| One file's |
| definition of a global symbol will satisfy another file's undefined |
| reference to the same symbol. |
| .It Dv STB_WEAK |
| Weak symbols resemble global symbols, but their definitions have lower |
| precedence. |
| .It Dv STB_LOPROC |
| This value up to and including |
| .Sy STB_HIPROC |
| is reserved for processor-specific semantics. |
| .It Dv STB_HIPROC |
| This value down to and including |
| .Sy STB_LOPROC |
| is reserved for processor-specific semantics. |
| .Pp |
| There are macros for packing and unpacking the binding and type fields: |
| .Pp |
| .Fn ELF32_ST_BIND info |
| or |
| .Fn ELF64_ST_BIND info |
| extract a binding from an st_info value. |
| .Pp |
| .Fn ELF32_ST_TYPE info |
| or |
| .Fn ELF64_ST_TYPE info |
| .br |
| extract a type from an st_info value. |
| .Pp |
| .Fn ELF32_ST_INFO bind type |
| or |
| .Fn ELF64_ST_INFO bind type |
| .br |
| convert a binding and a type into an st_info value. |
| .El |
| .Pp |
| .It Dv st_other |
| This member currently holds zero and has no defined meaning. |
| .It Dv st_shndx |
| Every symbol table entry is |
| .Dq defined |
| in relation to some section. |
| This member holds the relevant section |
| header table index. |
| .El |
| .Pp |
| 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. |
| .Pp |
| Relocation structures that do not need an addend: |
| .Bd -literal -offset indent |
| typedef struct { |
| Elf32_Addr r_offset; |
| uint32_t r_info; |
| } Elf32_Rel; |
| .Ed |
| .Bd -literal -offset indent |
| typedef struct { |
| Elf64_Addr r_offset; |
| uint64_t r_info; |
| } Elf64_Rel; |
| .Ed |
| .Pp |
| Relocation structures that need an addend: |
| .Bd -literal -offset indent |
| typedef struct { |
| Elf32_Addr r_offset; |
| uint32_t r_info; |
| int32_t r_addend; |
| } Elf32_Rela; |
| .Ed |
| .Bd -literal -offset indent |
| typedef struct { |
| Elf64_Addr r_offset; |
| uint64_t r_info; |
| int64_t r_addend; |
| } Elf64_Rela; |
| .Ed |
| .Bl -tag -width "r_offset" -offset indent |
| .It Dv 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. |
| .It Dv 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 |
| .Sy ELF_[32|64]_R_TYPE |
| or |
| .Sy ELF[32|64]_R_SYM , |
| respectively, to the entry's |
| .Sy r_info |
| member. |
| .It Dv r_addend |
| This member specifies a constant addend used to compute the value to be |
| stored into the relocatable field. |
| .El |
| .Pp |
| The .dynamic section contains a series of structures that hold relevant |
| dynamic linking information. The d_tag member controls the interpretation |
| of d_un. |
| .Bd -literal -offset indent |
| typedef struct { |
| Elf32_Sword d_tag; |
| union { |
| Elf32_Word d_val; |
| Elf32_Addr d_ptr; |
| } d_un; |
| } Elf32_Dyn; |
| extern Elf32_Dyn _DYNAMIC[]; |
| .Ed |
| .Bd -literal -offset indent |
| typedef struct { |
| Elf64_Sxword d_tag; |
| union { |
| Elf64_Xword d_val; |
| Elf64_Addr d_ptr; |
| } d_un; |
| } Elf64_Dyn; |
| extern Elf64_Dyn _DYNAMIC[]; |
| .Ed |
| .Bl -tag -width "d_tag" -offset indent |
| .It Dv d_tag |
| This member may have any of the following values: |
| .Bl -tag -width "DT_SYMBOLIC" |
| .It Dv DT_NULL |
| Marks end of dynamic section |
| .It Dv DT_NEEDED |
| String table offset to name of a needed library |
| .It Dv DT_PLTRELSZ |
| Size in bytes of PLT relocs |
| .It Dv DT_PLTGOT |
| Address of PLT and/or GOT |
| .It Dv DT_HASH |
| Address of symbol hash table |
| .It Dv DT_STRTAB |
| Address of string table |
| .It Dv DT_SYMTAB |
| Address of symbol table |
| .It Dv DT_RELA |
| Address of Rela relocs table |
| .It Dv DT_RELASZ |
| Size in bytes of Rela table |
| .It Dv DT_RELAENT |
| Size in bytes of a Rela table entry |
| .It Dv DT_STRSZ |
| Size in bytes of string table |
| .It Dv DT_SYMENT |
| Size in bytes of a symbol table entry |
| .It Dv DT_INIT |
| Address of the initialization function |
| .It Dv DT_FINI |
| Address of the termination function |
| .It Dv DT_SONAME |
| String table offset to name of shared object |
| .It Dv DT_RPATH |
| String table offset to library search path (deprecated) |
| .It Dv DT_SYMBOLIC |
| Alert linker to search this shared object before the executable for symbols |
| .It Dv DT_REL |
| Address of Rel relocs table |
| .It Dv DT_RELSZ |
| Size in bytes of Rel table |
| .It Dv DT_RELENT |
| Size in bytes of a Rel table entry |
| .It Dv DT_PLTREL |
| Type of reloc the PLT refers (Rela or Rel) |
| .It Dv DT_DEBUG |
| Undefined use for debugging |
| .It Dv DT_TEXTREL |
| Absence of this indicates no relocs should apply to a non-writable segment |
| .It Dv DT_JMPREL |
| Address of reloc entries solely for the PLT |
| .It Dv DT_BIND_NOW |
| Instruct dynamic linker to process all relocs before transferring control to |
| the executable |
| .It Dv DT_RUNPATH |
| String table offset to library search path |
| .It Dv DT_LOPROC |
| Start of processor-specific semantics |
| .It Dv DT_HIPROC |
| End of processor-specific semantics |
| .El |
| .It Dv d_val |
| This member represents integer values with various interpretations. |
| .It Dv d_ptr |
| This member represents program virtual addresses. When interpreting |
| these addresses, the actual address should be computed based on the |
| original file value and memory base address. Files do not contain |
| relocation entries to fixup these addresses. |
| .It Dv _DYNAMIC |
| Array containing all the dynamic structures in the .dynamic section. |
| This is automatically populated by the linker. |
| .El |
| .Sh SEE ALSO |
| .Xr as 1 , |
| .Xr gdb 1 , |
| .Xr ld 1 , |
| .Xr objdump 1 , |
| .Xr execve 2 , |
| .Xr core 5 |
| .Rs |
| .%A Hewlett-Packard |
| .%B Elf-64 Object File Format |
| .Re |
| .Rs |
| .%A Santa Cruz Operation |
| .%B System V Application Binary Interface |
| .Re |
| .Rs |
| .%A Unix System Laboratories |
| .%T Object Files |
| .%B "Executable and Linking Format (ELF)" |
| .Re |
| .Sh HISTORY |
| .Ox |
| ELF support first appeared in |
| .Ox 1.2 , |
| although not all supported platforms use it as the native |
| binary file format. |
| ELF in itself first appeared in |
| .At V . |
| The ELF format is an adopted standard. |
| .Sh AUTHORS |
| The original version of this manual page was written by |
| .An Jeroen Ruigrok van der Werven |
| .Aq asmodai@FreeBSD.org |
| with inspiration from BSDi's |
| .Bsx |
| .Nm elf |
| manpage. |