summaryrefslogtreecommitdiff
path: root/man5/elf.5
diff options
context:
space:
mode:
authorMichael Kerrisk <mtk.manpages@gmail.com>2005-12-15 13:04:00 +0000
committerMichael Kerrisk <mtk.manpages@gmail.com>2005-12-15 13:04:00 +0000
commit8d5bf1790f332fdeb97052e74fe1b2fca0e2a34a (patch)
tree3fcce9b51f24eb8f99efa768a2c450986ffe9a03 /man5/elf.5
parent65cb02b92723d3ea2c9b9715cfaaf1e25a4c2d27 (diff)
Undo accidental deletion of many lines!
Diffstat (limited to 'man5/elf.5')
-rw-r--r--man5/elf.51244
1 files changed, 1244 insertions, 0 deletions
diff --git a/man5/elf.5 b/man5/elf.5
index 229de3fd..e82b0517 100644
--- a/man5/elf.5
+++ b/man5/elf.5
@@ -1,3 +1,33 @@
+.\" $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
@@ -103,6 +133,1014 @@ typedef struct {
.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.
@@ -158,6 +1196,89 @@ 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
@@ -197,6 +1318,129 @@ typedef struct {
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 ,