Developer's Topics
Chapter 8, ELF object files

Section header

Section header

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 structures as described in Table 8-3, ``Special section indexes''. 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 tells how many entries the section header table contains. e_shentsize gives the size in bytes of each entry.

Some section header table indexes are reserved; an object file will not have sections for these special indexes. 

Table 8-3 Special section indexes

 -------------------------------------------------------
 Name            Value
 -------------------------------------------------------
 SHN_UNDEF       0
 SHN_LORESERVE   0xff00
 SHN_LOPROC      0xff00
 SHN_HIPROC      0xff1f
 SHN_ABS         0xfff1
 SHN_COMMON      0xfff2
 SHN_HIRESERVE   0xffff

SHN_UNDEF
This value marks an undefined, missing, irrelevant, or otherwise meaningless section reference. For example, a symbol ``defined'' relative to section number SHN_UNDEF is an undefined symbol.


NOTE: Although index 0 is reserved as the undefined value, the section header table contains an entry for index 0. If the 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.

SHN_LORESERVE
This value specifies the lower bound of the range of reserved indexes.

SHN_LOPROC through SHN_HIPROC
Values in this inclusive range are reserved for processor-specific semantics.

SHN_ABS
This value specifies absolute values for the corresponding reference. For example, symbols defined relative to section number SHN_ABS have absolute values and are not affected by relocation.

SHN_COMMON
Symbols defined relative to this section are common symbols, such as FORTRAN, COMMON or unallocated C external variables.

SHN_HIRESERVE
This value specifies the upper bound of the range of reserved indexes. The system reserves indexes between 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.
A section header has the following structure.
   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;

Figure 8-4 Section header

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.


NOTE: See ``String table'' for more information.

sh_type
This member categorizes the section's contents and semantics. Section types and their descriptions appear in Table 8-4, ``Section types, sh_type''.

sh_flags
Sections support 1-bit flags that describe miscellaneous attributes. Flag definitions appear in Table 8-4, ``Section types, sh_type''.

sh_addr
If the section will appear in the memory image of a process, this member gives the address at which the section's first byte should reside. Otherwise, the member contains 0.

sh_offset
This member's value gives the byte offset from the beginning of the file to the first byte in the section. One section type, SHT_NOBITS, described in Table 8-4, occupies no space in the file, and its sh_offset member locates the conceptual placement in the file.

sh_size
This member gives the section's size in bytes. Unless the section type is SHT_NOBITS, the section occupies sh_size bytes in the file. A section of type SHT_NOBITS may have a non-zero size, but it occupies no space in the file.

sh_link
This member holds a section header table index link, whose interpretation depends on the section type. Table 8-4, ``Section types, sh_type'' describes the values.

sh_info
This member holds extra information, whose interpretation depends on the section type. Table 8-4, ``Section types, sh_type'' describes the values.

sh_addralign
Some sections have address alignment constraints. For example, if a section holds a doubleword, the system must ensure doubleword alignment for the entire section. The value of 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
Some sections hold a table of fixed-size entries, such as a symbol table. For such a section, this member gives the size in bytes of each entry. The member contains 0 if the section does not hold a table of fixed-size entries.
A section header's sh_type member specifies the section's semantics. 

Table 8-4 Section types, 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_LOPROC                   0x70000000
 SHT_HIPROC                   0x7fffffff
 SHT_LOUSER                   0x80000000
 SHT_HIUSER                   0xffffffff

SHT_NULL
This value marks the section header as inactive; it does not have an associated section. Other members of the section header have undefined values.

SHT_PROGBITS
The section holds information defined by the program, whose format and meaning are determined solely by the program.

SHT_SYMTAB and SHT_DYNSYM
These sections hold a symbol table. Currently, an object file may have only one section of each type, but this restriction may be relaxed in the future. Typically, SHT_SYMTAB provides symbols for link editing, though it may also be used for dynamic linking. As a complete symbol table, it may contain many symbols unnecessary for dynamic linking. Consequently, an object file may also contain a SHT_DYNSYM section, which holds a minimal set of dynamic linking symbols, to save space.


NOTE: See ``Symbol table'' for details.

SHT_STRTAB
The section holds a string table. An object file may have multiple string table sections.


NOTE: See ``String table'' for details.

SHT_RELA
The section holds relocation entries with explicit addends, such as type Elf32_Rela for the 32-bit class of object files. An object file may have multiple relocation sections.


NOTE: See ``Relocation'' for details.

SHT_HASH
The section holds a symbol hash table. Currently, an object file may have only one hash table, but this restriction may be relaxed in the future. See ``Hash table'' in the second part of this chapter for details.

SHT_DYNAMIC
The section holds information for dynamic linking. Currently, an object file may have only one dynamic section, but this restriction may be relaxed in the future. See ``Dynamic section'' in the second part of this chapter for details.

SHT_NOTE
The section holds information that marks the file in some way. See ``Note section'' in the second part of this chapter for details.

SHT_NOBITS
A section of this type occupies no space in the file but otherwise resembles SHT_PROGBITS. Although this section contains no bytes, the sh_offset member contains the conceptual file offset.

SHT_REL
The section holds relocation entries without explicit addends, such as type Elf32_Rel for the 32-bit class of object files. An object file may have multiple relocation sections.


NOTE: See ``Relocation'' for details.

SHT_SHLIB
This section type is reserved but has unspecified semantics.

SHT_LOPROC through SHT_HIPROC
Values in this inclusive range are reserved for processor-specific semantics.

SHT_LOUSER
This value specifies the lower bound of the range of indexes reserved for application programs.

SHT_HIUSER
This value specifies the upper bound of the range of indexes reserved for application programs. Section types between SHT_LOUSER and SHT_HIUSER may be used by the application, without conflicting with current or future system-defined section types.
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.

Table 8-5 Section header table entry: index 0

 ---------------------------------------------------------------------
 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 file offset
 sh_size         0               No size
 sh_link         SHN_UNDEF       No link information
 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 Table 8-6, ``Section attribute flags, sh_flags''; other values are reserved. 

Table 8-6 Section attribute flags, sh_flags

 ---------------------------------------------------------------------
 Name            Value
 ---------------------------------------------------------------------
 SHF_WRITE       0x1
 SHF_ALLOC       0x2
 SHF_EXECINSTR   0x4
 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
The section contains data that should be writable during process execution.

SHF_ALLOC
The 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.

SHF_EXECINSTR
The section contains executable machine instructions.

SHF_MASKPROC
All bits included in this mask are reserved for processor-specific semantics.
Two members in the section header, sh_link and sh_info, hold special information, depending on section type.

Table 8-7 sh_link and sh_info interpretation

 ---------------------------------------------------------------------
 sh_type         sh_link                     sh_info
 ---------------------------------------------------------------------
 SHT_DYNAMIC     The section header index    0
                 of the string table used
                 by entries in the
                 section.
 ---------------------------------------------------------------------
 SHT_HASH        The section header index    0
                 of the symbol table to
                 which the hash table
                 applies.
 ---------------------------------------------------------------------
 SHT_REL         The section header index    The section header index
 SHT_RELA        of the associated symbol    of the section to which
                 table.                      the relocation applies.
 ---------------------------------------------------------------------
 SHT_SYMTAB      The section header index    One greater than the
 SHT_DYNSYM      of the associated string    symbol table index of the
                 table.                      last local symbol
                                             (binding STB_LOCAL).
 ---------------------------------------------------------------------
 other           SHN_UNDEF                   0