Symbol Table Section
An object file's symbol table holds information needed to locate and relocate a
program's symbolic definitions and symbolic references. A symbol table index is a subscript
into this array. Index 0 both designates the first entry in the table and
serves as the undefined symbol index. See **INTERNAL XREF ERROR**.
A symbol table entry has the following format. See sys/elf.h.
typedef struct {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;
typedef struct {
Elf64_Word st_name;
unsigned char st_info;
unsigned char st_other;
Elf64_Half st_shndx;
Elf64_Addr st_value;
Elf64_Xword st_size;
} Elf64_Sym;-
st_name -
An index into the object file's symbol string table, which holds the character representations of the symbol names. If the value is nonzero, the value represents a string table index that gives the symbol name. Otherwise, the symbol table entry has no name.
-
st_value -
The value of the associated symbol. The value can be an absolute value or an address, depending on the context. See Symbol Values.
-
st_size -
Many symbols have associated sizes. For example, a data object's size is the number of bytes that are contained in the object. This member holds the value zero if the symbol has no size or an unknown size.
-
st_info -
The symbol's type and binding attributes. A list of the values and meanings appears in **INTERNAL XREF ERROR**. The following code shows how to manipulate the values. See
sys/elf.h.#define ELF32_ST_BIND(info) ((info) >> 4) #define ELF32_ST_TYPE(info) ((info) & 0xf) #define ELF32_ST_INFO(bind, type) (((bind)<<4)+((type)&0xf)) #define ELF64_ST_BIND(info) ((info) >> 4) #define ELF64_ST_TYPE(info) ((info) & 0xf) #define ELF64_ST_INFO(bind, type) (((bind)<<4)+((type)&0xf))
-
st_other -
A symbol's visibility. A list of the values and meanings appears in **INTERNAL XREF ERROR**. The following code shows how to manipulate the values for both 32-bit objects and 64-bit objects. Other bits are set to zero, and have no defined meaning.
#define ELF32_ST_VISIBILITY(o) ((o)&0x3) #define ELF64_ST_VISIBILITY(o) ((o)&0x3)
-
st_shndx -
Every symbol table entry is defined in relation to some section. This member holds the relevant section header table index. Some section indexes indicate special meanings. See ELF Special Section Indexes.
If this member contains
SHN_XINDEX, then the actual section header index is too large to fit in this field. The actual value is contained in the associated section of typeSHT_SYMTAB_SHNDX. See Extended Section Header.
A symbol's binding, determined from its st_info field,
determines the linkage visibility and behavior.
Table 14-21
ELF Symbol Binding, ELF32_ST_BIND and
ELF64_ST_BIND
| Name | Value |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
STB_LOCAL -
Local symbol. These symbols are not visible outside the object file containing their definition. Local symbols of the same name can exist in multiple files without interfering with each other.
-
STB_GLOBAL -
Global symbols. These symbols are visible to all object files being combined. One file's definition of a global symbol satisfies another file's undefined reference to the same global symbol.
-
STB_WEAK -
Weak symbols. These symbols resemble global symbols, but their definitions have lower precedence.
-
STB_LOOS-STB_HIOS -
Values in this inclusive range are reserved for operating system-specific semantics.
-
STB_LOPROC-STB_HIPROC -
Values in this inclusive range are reserved for processor-specific semantics.
Global symbols and weak symbols differ in two major ways.
-
When the link-editor combines several relocatable object files, multiple definitions of
STB_GLOBALsymbols with the same name are not allowed. However, if a defined global symbol exists, the appearance of a weak symbol with the same name does not cause an error. The link-editor honors the global definition and ignores the weak definitions.Similarly, if a common symbol exists, the appearance of a weak symbol with the same name does not cause an error. The link-editor uses the common definition and ignores the weak definition. A common symbol has the
st_shndxfield holdingSHN_COMMON. See Symbol Resolution. -
When the link-editor searches archive libraries, archive members that contain definitions of undefined or tentative global symbols are extracted. The member's definition can be either a global or a weak symbol.
The link-editor, by default, does not extract archive members to resolve undefined weak symbols. Unresolved weak symbols have a zero value. The use of
-z weakextractoverrides this default behavior. This options enables weak references to cause the extraction of archive members.
Note:
Weak symbols are intended primarily for use in system software. Their use in application programs is discouraged.In each symbol table, all symbols with STB_LOCAL binding precede the
weak symbols and global symbols. As Section Headers describes, a
symbol table section's sh_info section header member holds the
symbol table index for the first non-local symbol.
A symbol's type, as determined from its st_info field,
provides a general classification for the associated entity.
Table 14-22
ELF Symbol Types, ELF32_ST_TYPE and
ELF64_ST_TYPE
| Name | Value |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
STT_NOTYPE -
The symbol type is not specified.
-
STT_OBJECT -
This symbol is associated with a data object, such as a variable, an array, and so forth.
-
STT_FUNC -
This symbol is associated with a function or other executable code.
-
STT_SECTION -
This symbol is associated with a section. Symbol table entries of this type exist primarily for relocation and normally have
STB_LOCALbinding. -
STT_FILE -
Conventionally, the symbol's name gives the name of the source file that is associated with the object file. A file symbol has
STB_LOCALbinding and a section index ofSHN_ABS. This symbol, if present, precedes the otherSTB_LOCALsymbols for the file.Symbol index 1 of the
SHT_SYMTABis anSTT_FILEsymbol representing the object file. Conventionally, this symbol is followed by the filesSTT_SECTIONsymbols. These section symbols are then followed by any global symbols that have been reduced to locals. -
STT_COMMON -
This symbol labels an uninitialized common block. This symbol is treated exactly the same as
STT_OBJECT. -
STT_TLS -
The symbol specifies a thread-local storage entity. When defined, this symbol gives the assigned offset for the symbol, not the actual address.
For allocable sections, symbols of type
STT_TLScan be referenced only by special thread-local storage relocations. Thread-local storage relocations can reference only symbols of typeSTT_TLS, or symbols of typeSTT_SECTIONwhere the referenced section has theSHF_TLSflag. See Thread-Local Storage for details. A reference to a symbol of typeSTT_TLSfrom a non-allocatable section does not have this restriction. -
STT_LOOS-STT_HIOS -
Values in this inclusive range are reserved for operating system-specific semantics.
-
STT_LOPROC-STT_HIPROC -
Values in this inclusive range are reserved for processor-specific semantics.
A symbol's visibility is determined from its st_other
field. This visibility can be specified in a relocatable object. This visibility defines how
that symbol can be accessed once the symbol has become part of a dynamic
object.
Table 14-23 ELF Symbol Visibility
| Name | Value |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
STV_DEFAULT -
The visibility of symbols with the
STV_DEFAULTattribute is as specified by the symbol's binding type. Global symbols and weak symbols are visible outside of their defining dynamic object. Local symbols are hidden. Global symbols and weak symbols can also be preempted. These symbols can by interposed by definitions of the same name in another component. -
STV_PROTECTED -
A symbol that is defined in the current component is protected if the symbol is visible in other components, but cannot be preempted. Any reference to such a symbol from within the defining component must be resolved to the definition in that component. This resolution must occur, even if a symbol definition exists in another component that would interpose by the default rules. A symbol with
STB_LOCALbinding will not haveSTV_PROTECTEDvisibility. -
STV_HIDDEN -
A symbol that is defined in the current component is hidden if its name is not visible to other components. Such a symbol is necessarily protected. This attribute is used to control the external interface of a component. An object named by such a symbol can still be referenced from another component if its address is passed outside.
A hidden symbol contained in a relocatable object is either removed or converted to
STB_LOCALbinding when the object is included in a dynamic object. -
STV_INTERNAL -
This visibility attribute is interpreted the same as
STV_HIDDEN. -
STV_EXPORTED -
This visibility attribute ensures that a symbol remains global. This visibility can not be demoted, or eliminated by any other symbol visibility technique. A symbol with
STB_LOCALbinding will not haveSTV_EXPORTEDvisibility. -
STV_SINGLETON -
This visibility attribute ensures that a symbol remains global, and that a single instance of the symbol definition is bound to by all references within a process. This visibility can not be demoted, or eliminated by any other symbol visibility technique. A symbol with
STB_LOCALbinding will not haveSTV_SINGLETONvisibility. ASTV_SINGLETONcan not be directly bound to. -
STV_ELIMINATE -
This visibility attribute extends
STV_HIDDEN. A symbol that is defined in the current component as eliminate is not visible to other components. The symbol is not written to any symbol table of a dynamic object from which the component is used.
The STV_SINGLETON visibility attribute can affect the resolution of
symbols within an executable or shared object during link-editing. Only one instance of a
singleton can be bound to from any reference within a process.
A STV_SINGLETON can be combined with a STV_DEFAULT
visibility attribute, with the STV_SINGLETON taking precedence. A
STV_EXPORT can be combined with a STV_DEFAULT
visibility attribute, with the STV_EXPORT taking precedence. A
STV_SINGLETON or STV_EXPORT visibility can not be
combined with any other visibility attribute. Such an event is deemed fatal to the
link-edit.
Other visibility attributes do not affect the resolution of symbols within a dynamic object during link-editing. Such resolution is controlled by the binding type. Once the link-editor has chosen its resolution, these attributes impose two requirements. Both requirements are based on the fact that references in the code being linked might have been optimized to take advantage of the attributes.
-
All of the non-default visibility attributes, when applied to a symbol reference, imply that a definition to satisfy that reference must be provided within the object being linked. If this type of symbol reference has no definition within the object being linked, then the reference must have
STB_WEAKbinding. In this case, the reference is resolved to zero. -
If any reference to a name, or definition of a name is a symbol with a non-default visibility attribute, the visibility attribute is propagated to the resolving symbol in the object being linked. If different visibility attributes are specified for distinct instances of a symbol, the most constraining visibility attribute is propagated to the resolving symbol in the object being linked. The attributes, ordered from least to most constraining, are
STV_PROTECTED,STV_HIDDENandSTV_INTERNAL.
If a symbol's value refers to a specific location within a section, the symbol's section
index member, st_shndx, holds an index into the section header
table. As the section moves during relocation, the symbol's value changes as well. References
to the symbol continue to point to the same location in the program. Some special section
index values give other semantics.
-
SHN_ABS -
This symbol has an absolute value that does not change because of relocation.
-
SHN_COMMON, andSHN_AMD64_LCOMMON -
This symbol labels a common block that has not yet been allocated. The symbol's value gives alignment constraints, similar to a section's
sh_addralignmember. The link-editor allocates the storage for the symbol at an address that is a multiple ofst_value. The symbol's size tells how many bytes are required. -
SHN_UNDEF -
This section table index indicates that the symbol is undefined. When the link-editor combines this object file with another object that defines the indicated symbol, this file's references to the symbol is bound to the definition.
As mentioned previously, the symbol table entry for index 0
(STN_UNDEF) is reserved. This entry holds the values listed in the
following table.
Table 14-24
ELF Symbol Table Entry: Index 0
| Name | Value | Note |
|---|---|---|
|
|
|
No name |
|
|
|
Zero value |
|
|
|
No size |
|
|
|
No type, local binding |
|
|
|
|
|
|
|
No section |