An object 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
as described below.
A section header table index is a subscript into this array.
The ELF header's e_shoff
member gives the byte offset from the beginning of the
file to the section header table.
e_shnum
normally tells how many entries the section header table contains.
e_shentsize
gives the size in bytes of each entry.
If the number of sections is greater than or equal to
SHN_LORESERVE
(0xff00
), e_shnum
has the value SHN_UNDEF
(0
) and the
actual number of section header table
entries is contained in the sh_size
field of
the section header at index 0
(otherwise, the sh_size
member of the initial entry
contains 0
).
Some section header table indexes are reserved in contexts
where index size is restricted, for example, the st_shndx
member of a symbol table entry and the e_shnum
and
e_shstrndx
members of the ELF header.
In such contexts, the reserved values do not represent actual
sections in the object file. Also in such contexts, an escape
value indicates that the actual section
index is to be found elsewhere, in a larger field.
Name | Value |
---|---|
SHN_UNDEF |
0 |
SHN_LORESERVE |
0xff00 |
SHN_LOPROC |
0xff00 |
SHN_HIPROC |
0xff1f |
SHN_LOOS |
0xff20 |
SHN_HIOS |
0xff3f |
SHN_ABS |
0xfff1 |
SHN_COMMON |
0xfff2 |
SHN_XINDEX |
0xffff |
SHN_HIRESERVE |
0xffff |
SHN_UNDEF
SHN_UNDEF
is an undefined symbol.
e_shnum
member of the ELF header says a file has 6 entries
in the section header table, they have the indexes 0 through 5.
The contents of the initial entry are specified later in this
section.
SHN_LORESERVE
SHN_LOPROC
through SHN_HIPROC
SHN_LOOS
through SHN_HIOS
SHN_ABS
SHN_ABS
have absolute values and are not affected by relocation.
SHN_COMMON
COMMON
or unallocated C external variables.
SHN_XINDEX
SHN_HIRESERVE
SHN_LORESERVE
and SHN_HIRESERVE
,
inclusive; the values do not reference the section header table.
The section header table does not
contain entries for the reserved indexes.
Sections contain all information in an object file except the ELF header, the program header table, and the section header table. Moreover, object files' sections satisfy several conditions.
Figure 4-8: Section Header
typedef struct { Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } Elf32_Shdr; typedef struct { Elf64_Word sh_name; Elf64_Word sh_type; Elf64_Xword sh_flags; Elf64_Addr sh_addr; Elf64_Off sh_offset; Elf64_Xword sh_size; Elf64_Word sh_link; Elf64_Word sh_info; Elf64_Xword sh_addralign; Elf64_Xword sh_entsize; } Elf64_Shdr;
sh_name
sh_type
sh_flags
sh_addr
sh_offset
SHT_NOBITS
described
below,
occupies no space in the file, and its
sh_offset
member locates the conceptual placement in the file.
sh_size
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
sh_info
sh_flags
field for this
section header includes the attribute SHF_INFO_LINK
, then this member represents a section header table index.
sh_addralign
sh_addr
must be congruent to 0, modulo the value of sh_addralign
.
Currently, only 0 and positive integral powers of two are allowed.
Values 0 and 1 mean the section has no alignment constraints.
sh_entsize
A section header's sh_type
member specifies the section's semantics.
sh_type
Name | Value |
---|---|
SHT_NULL |
0 |
SHT_PROGBITS |
1 |
SHT_SYMTAB |
2 |
SHT_STRTAB |
3 |
SHT_RELA |
4 |
SHT_HASH |
5 |
SHT_DYNAMIC |
6 |
SHT_NOTE |
7 |
SHT_NOBITS |
8 |
SHT_REL |
9 |
SHT_SHLIB |
10 |
SHT_DYNSYM |
11 |
SHT_INIT_ARRAY |
14 |
SHT_FINI_ARRAY |
15 |
SHT_PREINIT_ARRAY |
16 |
SHT_GROUP |
17 |
SHT_SYMTAB_SHNDX |
18 |
SHT_LOOS |
0x60000000 |
SHT_HIOS |
0x6fffffff |
SHT_LOPROC |
0x70000000 |
SHT_HIPROC |
0x7fffffff |
SHT_LOUSER |
0x80000000 |
SHT_HIUSER |
0xffffffff |
SHT_NULL
SHT_PROGBITS
SHT_SYMTAB
and SHT_DYNSYM
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.
Consequently, an object file may also contain a SHT_DYNSYM
section, which holds a minimal set of dynamic linking symbols,
to save space.
See ``Symbol Table'' below
for details.
SHT_STRTAB
SHT_RELA
Elf32_Rela
for the 32-bit class of object files
or type Elf64_Rela
for the 64-bit class of object files.
An object file may have multiple relocation sections.
``Relocation''
below for details.
SHT_HASH
SHT_DYNAMIC
SHT_NOTE
SHT_NOBITS
SHT_PROGBITS
.
Although this section contains no bytes, the sh_offset
member contains the conceptual file offset.
SHT_REL
Elf32_Rel
for the 32-bit class of object files or
type Elf64_Rel
for the 64-bit class of object files.
An object file may have multiple relocation sections.
See ``Relocation''
below for details.
SHT_SHLIB
SHT_INIT_ARRAY
SHT_FINI_ARRAY
SHT_PREINIT_ARRAY
SHT_GROUP
SHT_GROUP
may appear only
in relocatable objects (objects with the ELF header e_type
member set to ET_REL
). The section header table entry
for a group section must appear in the section header table
before the entries for any of the sections that are members of
the group.
SHT_SYMTAB_SHNDX
SHN_XINDEX
.
The section is an array of Elf32_Word
values.
Each value corresponds one to one with a symbol table entry
and appear in the same order as those entries.
The values represent the section header indexes against which
the symbol table entries are defined.
Only if the corresponding symbol table entry's st_shndx
field
contains the escape value SHN_XINDEX
will the matching Elf32_Word
hold the actual section header index;
otherwise, the entry must be SHN_UNDEF
(0
).
SHT_LOOS
through SHT_HIOS
SHT_LOPROC
through SHT_HIPROC
SHT_LOUSER
SHT_HIUSER
SHT_LOUSER
and
SHT_HIUSER
may be used by the application, without conflicting with
current or future system-defined section types.
Other section type values are reserved.
As mentioned before, the section header for index 0 (SHN_UNDEF
)
exists, even though the index marks undefined section references.
This entry holds the following.
Name | Value | Note |
---|---|---|
sh_name |
0 |
No name |
sh_type |
SHT_NULL |
Inactive |
sh_flags |
0 |
No flags |
sh_addr |
0 |
No address |
sh_offset |
0 |
No offset |
sh_size |
Unspecified | If non-zero, the actual number of section header entries |
sh_link |
Unspecified | If non-zero, the index of the section header string table section |
sh_info |
0 |
No auxiliary information |
sh_addralign |
0 |
No alignment |
sh_entsize |
0 |
No entries |
A section header's
sh_flags
member holds 1-bit flags that describe the section's attributes.
Defined values appear in the following table;
other values are reserved.
Figure 4-11: Section Attribute Flags
Name | Value |
---|---|
SHF_WRITE |
0x1 |
SHF_ALLOC |
0x2 |
SHF_EXECINSTR |
0x4 |
SHF_MERGE |
0x10 |
SHF_STRINGS |
0x20 |
SHF_INFO_LINK |
0x40 |
SHF_LINK_ORDER |
0x80 |
SHF_OS_NONCONFORMING |
0x100 |
SHF_GROUP |
0x200 |
SHF_TLS |
0x400 |
SHF_COMPRESSED |
0x800 |
SHF_MASKOS |
0x0ff00000 |
SHF_MASKPROC |
0xf0000000 |
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
SHF_ALLOC
SHF_EXECINSTR
SHF_MERGE
SHF_STRINGS
flag is also set,
the data elements in the section are of a uniform size.
The size of each element is specified in the section
header's sh_entsize
field.
If the SHF_STRINGS
flag is also set,
the data elements consist of null-terminated character strings.
The size of each character is specified in the section
header's sh_entsize
field.
Each element in the section is compared against other elements in sections with the same name, type and flags. Elements that would have identical values at program run-time may be merged. Relocations referencing elements of such sections must be resolved to the merged locations of the referenced values. Note that any relocatable values, including values that would result in run-time relocations, must be analyzed to determine whether the run-time values would actually be identical. An ABI-conforming object file may not depend on specific elements being merged, and an ABI-conforming link editor may choose not to merge specific elements.
SHF_STRINGS
sh_entsize
field.
SHF_INFO_LINK
sh_info
field of this section header holds a section
header table index.
SHF_LINK_ORDER
sh_link
field of this section's header references
another section (the linked-to section).
If this section is combined with other
sections in the output file, it must appear in the same
relative order with respect to those sections, as the linked-to section
appears with respect to sections the linked-to section is combined with.
SHF_OS_NONCONFORMING
sh_type
value
or contains sh_flags
bits in the OS-specific ranges for
those fields, and a link editor processing this section does not
recognize those values, then the link editor should reject
the object file containing this section with an error.
SHF_GROUP
SHT_GROUP
.
The SHF_GROUP
flag may be set only for sections contained
in relocatable objects (objects with the ELF header e_type
member set to ET_REL
).
See below for further details.
SHF_TLS
SHF_COMPRESSED
All relocations to a compressed section specifiy offsets to the uncompressed section data. It is therefore necessary to decompress the section data before relocations can be applied. Each compressed section specifies the algorithm independently. It is permissible for different sections in a given ELF object to employ different compression algorithms.
Compressed sections begin with a compression header structure that identifies the compression algorithm.
Figure 4-12: Compression Header
typedef struct { Elf32_Word ch_type; Elf32_Word ch_size; Elf32_Word ch_addralign; } Elf32_Chdr; typedef struct { Elf64_Word ch_type; Elf64_Word ch_reserved; Elf64_Xword ch_size; Elf64_Xword ch_addralign; } Elf64_Chdr;
ch_type
ch_size
sh_size
.
ch_addralign
sh_addralign
.
The sh_size
and sh_addralign
fields of the section
header for a compressed section reflect the requirements of the
compressed section. The ch_size
and ch_addralign
fields in the compression header provide the corresponding values for the
uncompressed data, thereby supplying the values that sh_size
and
sh_addralign
would have had if the section had not been
compressed.
The layout and interpretation of the data that follows the compression header
is specific to each algorithm, and is defined below for each value of
ch_type
. This area may contain algorithm specific parameters
and alignment padding in addition to compressed data bytes.
A compression header's ch_type
member specifies the
compression algoritm employed, as shown in the following table.
ch_type
Name | Value |
---|---|
ELFCOMPRESS_ZLIB |
1 |
ELFCOMPRESS_LOOS |
0x60000000 |
ELFCOMPRESS_HIOS |
0x6fffffff |
ELFCOMPRESS_LOPROC |
0x70000000 |
ELFCOMPRESS_HIPROC |
0x7fffffff |
ELFCOMPRESS_ZLIB
ELFCOMPRESS_LOOS - ELFCOMPRESS_HIOS
ELFCOMPRESS_LOPROC - ELF_COMPRESS_HIPROC
SHF_MASKOS
SHF_MASKPROC
Two members in the section header,
sh_link
and sh_info
,
hold special information, depending on section type.
sh_link
and sh_info
Interpretation
sh_type |
sh_link |
sh_info |
---|---|---|
SHT_DYNAMIC |
The section header index of the string table used by entries in the section. | 0 |
SHT_HASH |
The section header index of the symbol table to which the hash table applies. | 0 |
SHT_REL SHT_RELA |
The section header index of the associated symbol table. | The section header index of the section to which the relocation applies. |
SHT_SYMTAB SHT_DYNSYM |
The section header index of the associated string table. | One greater than the symbol table index of the last local
symbol (binding STB_LOCAL ). |
SHT_GROUP |
The section header index of the associated symbol table. | The symbol table index of an entry in the associated symbol table. The name of the specified symbol table entry provides a signature for the section group. | SHT_SYMTAB_SHNDX |
The section header index of the associated symbol table section. | 0 |
sh_type
or sh_flags
fields, the link editor should combine those
sections as described below.
If the section's sh_flags
bits include the attribute
SHF_OS_NONCONFORMING
, then the section requires
special knowledge to be correctly processed, and the link editor should
reject the object containing the section with an error.
Unrecognized sections that do not have the
SHF_OS_NONCONFORMING
attribute, are combined in a two-phase
process. As the link editor combines sections using this process,
it must honor the alignment constraints of the
input sections (asserted by the sh_addralign
field),
padding between sections with zero bytes, if necessary, and producing
a combination with the maximum alignment constraint of its
component input sections.
SHF_MERGE
and SHF_LINK_ORDER
). When not otherwise constrained,
sections should be emitted in input order.
Non OS-specific processing (e.g. relocation) should be applied to unrecognized section types. An output section header table, if present, should contain entries for unknown sections. Any unrecognized section attribute flags should be removed.
A section of type SHT_GROUP
defines such a grouping
of sections. The name of a symbol from one of the containing
object's symbol tables provides a signature for the section group.
The section header of the SHT_GROUP
section specifies
the identifying symbol entry, as described above:
the sh_link
member contains the section header index
of the symbol table section that contains the entry.
The sh_info
member contains the symbol table index of
the identifying entry. The sh_flags
member of the section header contains 0
.
The name of the section (sh_name
) is not specified.
The referenced signature symbol is not restricted. Its containing symbol table section need not be a member of the group, for example.
The section data of a SHT_GROUP
section is an array
of Elf32_Word
entries. The first entry is a flag word.
The remaining entries are a sequence of section header indices.
The following flags are currently defined:
Name | Value |
---|---|
GRP_COMDAT |
0x1 |
GRP_MASKOS |
0x0ff00000 |
GRP_MASKPROC |
0xf0000000 |
GRP_COMDAT
GRP_MASKOS
GRP_MASKPROC
The section header indices in the SHT_GROUP
section
identify the sections that make up the group. Each such section
must have the SHF_GROUP
flag set in its sh_flags
section header member. If the linker decides to remove the section
group, it must remove all members of the group.
To facilitate removing a group without leaving dangling references and with only minimal processing of the symbol table, the following rules must be followed:
STB_GLOBAL
or STB_WEAK
binding that is defined relative to one of a group's sections,
and that is contained in a symbol table section
that is not part of the group,
must be converted to an undefined symbol
(its section index must be changed to SHN_UNDEF
)
if the group members are discarded.
References to this symbol table entry from outside the group are allowed.
STB_LOCAL
binding
that is defined relative to one of a group's sections,
and that is contained in a symbol table section
that is not part of the group,
must be discarded if the group members are discarded.
References to this symbol table entry from outside the group are not allowed.
sh_link
or
sh_info
member.
The following table shows sections that are used by the system and have the indicated types and attributes.
Name | Type | Attributes |
---|---|---|
.bss |
SHT_NOBITS |
SHF_ALLOC+SHF_WRITE |
.comment |
SHT_PROGBITS |
none |
.data |
SHT_PROGBITS |
SHF_ALLOC+SHF_WRITE |
.data1 |
SHT_PROGBITS |
SHF_ALLOC+SHF_WRITE |
.debug |
SHT_PROGBITS |
none |
.dynamic |
SHT_DYNAMIC |
see below |
.dynstr |
SHT_STRTAB |
SHF_ALLOC |
.dynsym |
SHT_DYNSYM |
SHF_ALLOC |
.fini |
SHT_PROGBITS |
SHF_ALLOC+SHF_EXECINSTR |
.fini_array |
SHT_FINI_ARRAY |
SHF_ALLOC+SHF_WRITE |
.got |
SHT_PROGBITS |
see below |
.hash |
SHT_HASH |
SHF_ALLOC |
.init |
SHT_PROGBITS |
SHF_ALLOC+SHF_EXECINSTR |
.init_array |
SHT_INIT_ARRAY |
SHF_ALLOC+SHF_WRITE |
.interp |
SHT_PROGBITS |
see below |
.line |
SHT_PROGBITS |
none |
.note |
SHT_NOTE |
none |
.plt |
SHT_PROGBITS |
see below |
.preinit_array |
SHT_PREINIT_ARRAY |
SHF_ALLOC+SHF_WRITE |
.rel name |
SHT_REL |
see below |
.rela name |
SHT_RELA |
see below |
.rodata |
SHT_PROGBITS |
SHF_ALLOC |
.rodata1 |
SHT_PROGBITS |
SHF_ALLOC |
.shstrtab |
SHT_STRTAB |
none |
.strtab |
SHT_STRTAB |
see below |
.symtab |
SHT_SYMTAB |
see below |
.symtab_shndx |
SHT_SYMTAB_SHNDX |
see below |
.tbss |
SHT_NOBITS |
SHF_ALLOC+SHF_WRITE+SHF_TLS |
.tdata |
SHT_PROGBITS |
SHF_ALLOC+SHF_WRITE+SHF_TLS |
.tdata1 |
SHT_PROGBITS |
SHF_ALLOC+SHF_WRITE+SHF_TLS |
.text |
SHT_PROGBITS |
SHF_ALLOC+SHF_EXECINSTR |
.bss
SHT_NOBITS
.
.comment
.data
and .data1
.debug
.debug
are reserved for future use in the
ABI.
.dynamic
SHF_ALLOC
bit.
Whether the SHF_WRITE
bit is set is processor specific.
See Chapter 5 for more information.
.dynstr
.dynsym
.fini
.fini_array
.got
.hash
.init
main
for C programs).
.init_array
.interp
SHF_ALLOC
bit; otherwise, that bit will be off.
See Chapter 5 for more information.
.line
.note
.plt
.preinit_array
.rel
name and .rela
nameSHF_ALLOC
bit; otherwise, that bit will be off.
Conventionally, name
is supplied by the section to which the relocations apply.
Thus a relocation section for .text
normally would have the name .rel.text
or .rela.text
.
.rodata
and .rodata1
.shstrtab
.strtab
SHF_ALLOC
bit; otherwise, that bit will be off.
.symtab
SHF_ALLOC
bit; otherwise, that bit will be off.
.symtab_shndx
SHF_ALLOC
bit if the associated symbol table
section does; otherwise that bit will be off.
.tbss
SHT_NOBITS
.
Implementations need not support thread-local storage.
.tdata
.text
Section names with a dot (.
) prefix
are reserved for the system,
although applications may use these sections
if their existing meanings are satisfactory.
Applications may use names without the prefix to
avoid conflicts with system sections.
The object file format lets one define sections not
shown in the previous list.
An object file may have more than one section
with the same name.
Section names reserved for a processor architecture
are formed by placing an abbreviation of the architecture
name ahead of the section name.
The name should be taken from the
architecture names used for e_machine
.
For instance .
FOO.psect
is the psect
section defined by the FOO architecture.
Existing extensions are called by their historical names.
.sdata |
.tdesc |
.sbss |
.lit4 |
.lit8 |
.reginfo |
.gptab |
.liblist |
.conflict |