Program Header
The program header table of a dynamic object is an array of structures. Each structure describes a segment or other information that the system needs to prepare the program for execution. An object file segment contains one or more sections, as described in Segment Contents.
Program headers are meaningful only for dynamic objects. A file
specifies its own program header size with the ELF header's
e_phentsize
and e_phnum
members.
Program headers can have names associated to them. These names are assigned
by the link editor, or are specified by mapfiles
that create
mapped segments. See Program Header Name Section.
A program header has the following structure. See
sys/elf.h
.
typedef struct { Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr; typedef struct { Elf64_Word p_type; Elf64_Word p_flags; Elf64_Off p_offset; Elf64_Addr p_vaddr; Elf64_Addr p_paddr; Elf64_Xword p_filesz; Elf64_Xword p_memsz; Elf64_Xword p_align; } Elf64_Phdr;
-
p_type
-
The kind of segment this array element describes or how to interpret the array element's information. Type values and their meanings are specified in Table 15-1.
-
p_offset
-
The offset from the beginning of the file at which the first byte of the segment resides.
-
p_vaddr
-
The virtual address at which the first byte of the segment resides in memory.
-
p_paddr
-
The segment's physical address for systems in which physical addressing is relevant. Because the system ignores physical addressing for application programs, this member has unspecified contents for dynamic objects.
-
p_filesz
-
The number of bytes in the file image of the segment, which can be zero.
-
p_memsz
-
The number of bytes in the memory image of the segment, which can be zero.
-
p_flags
-
Flags that are relevant to the segment. Type values and their meanings are specified in ELF Segment Flags.
-
p_align
-
Loadable process segments must have congruent values for
p_vaddr
andp_offset
, modulo the page size. This member gives the value to which the segments are aligned in memory and in the file. Values0
and1
mean no alignment is required. Otherwise,p_align
should be a positive, integral power of2
, andp_vaddr
should equalp_offset
, modulop_align
. See Program Loading (Processor-Specific).
Some entries describe process segments. Other entries give supplementary information and do not contribute to the process image. Segment entries can appear in any order, except as explicitly noted. Defined type values are listed in the following table.
Table 15-1 ELF Segment Types
Name | Value |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
PT_NULL
-
Unused. Member values are undefined. This type enables the program header table to contain ignored entries.
-
PT_LOAD
-
Specifies a loadable segment, described by
p_filesz
andp_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 value0
. These bytes follow the initialized area of the segment. The file size can not be larger than the memory size. Loadable segment entries in the program header table appear in ascending order, and are sorted on thep_vaddr
member. -
PT_DYNAMIC
-
Specifies dynamic linking information. See Dynamic Section.
-
PT_INTERP
-
Specifies the location and size of a null-terminated path name to invoke as an interpreter. This type is mandatory for executables. This type can occur in shared objects. This type cannot occur more than once in an executable. This type, if present, must precede any loadable segment entries. See Program Interpreter for details.
-
PT_NOTE
-
Specifies the location and size of auxiliary information. See Note Section for details.
-
PT_SHLIB
-
Reserved but has unspecified semantics.
-
PT_PHDR
-
Specifies the location and size of the program header table, both in the file and in the memory image of the program. This segment type cannot occur more than once in a file. Moreover, this segment can occur only if the program header table is part of the memory image of the program. This type, if present, must precede any loadable segment entry. See Program Interpreter for details.
-
PT_TLS
-
Specifies a thread-local storage template. See Thread-Local Storage Section for details.
-
PT_LOOS
-PT_HIOS
-
Values in this inclusive range are reserved for OS-specific semantics.
-
PT_SUNW_UNWIND
-
This segment contains the stack unwind tables.
-
PT_SUNW_EH_FRAME
-
This segment contains the stack unwind table.
PT_SUNW_EH_FRAME
is equivalent toPT_SUNW_EH_UNWIND
. -
PT_LOSUNW
-PT_HISUNW
-
Values in this inclusive range are reserved for Sun-specific semantics.
-
PT_SUNW_SYSSTAT_ZONE
-
Reserved for internal use.
-
PT_SUNW_SYSSTAT
-
Reserved for internal use.
-
PT_SUNW_RESERVE
-
Memory reservation.
-
PT_SUNW_BSS
-
The same attributes as a
PT_LOAD
element and used to describe a.SUNW_bss
section. -
PT_SUNW_STACK
-
Describes a process stack. Only one
PT_SUNW_STACK
element can exist. Only access permissions, as defined in thep_flags
field, are meaningful. -
PT_SUNW_DTRACE
-
Reserved for internal use by
dtrace
(8). -
PT_SUNW_CAP
-
Specifies capability requirements. See Capabilities Section for details.
-
PT_LOPROC
-PT_HIPROC
-
Values in this inclusive range are reserved for processor-specific semantics.
Note:
Unless specifically required elsewhere, all program header segment types are optional. A file's program header table can contain only those elements that are relevant to its contents.