An object file contains a symbol table that stores information about symbols in the object file. The linker uses this table when it performs relocation. See Section 3.8.
An object file symbol is a named 32-bit integer value, usually representing
an address. A symbol can represent things like the start address of a function, variable,
section, or an absolute integer (such as the size of the stack).
Symbols are defined in assembly by adding a label or a directive such as .set .equ .bss, or .usect.
Symbols have a binding, which is similar to the C concept of linkage. Both COFF and ELF file formats may contain symbols bound locally and globally. ELF also binds symbols as weak symbols.
- Global symbols are visible to the entire program. The linker does not allow more than one global definition of a particular symbol; it issues a multiple-definition error if a global symbol is defined more than once. (The assembler can provide a similar multiple-definition error for local symbols.) A reference to a global symbol from any object file refers to the one and only allowed global definition of that symbol. Assembly code must explicitly make a symbol global by adding a .def, .ref, or .global directive. (See Section 3.7.1.)
- Local symbols are visible only within one object file; each object file that uses a symbol needs its own local definition. References to local symbols in an object file are entirely unrelated to local symbols of the same name in another object file. By default, a symbol is local. (See Section 3.7.2.)
- Weak symbols (EABI only) are symbols that may be used but not defined in the current module. They may or may not be defined in another module. A weak symbol is intended to be overridden by a strong (non-weak) global symbol definition of the same name in another object file. If a strong definition is available, the weak symbol is replaced by the strong symbol. If no definition is available (that is, if the weak symbol is unresolved), no error is generated, but the weak variable's address is considered to be null (0). For this reason, application code that accesses a weak variable must check that its address is not zero before attempting to access the variable. (See Section 3.7.3.)
Absolute symbols are symbols with a numeric
value. They may be constants. To the linker, such symbols are unsigned, but the integer may
be treated as signed or unsigned depending on how it is used. The range of legal values for
an absolute integer is 0 to 2^32-1 for unsigned treatment and -2^31 to 2^31-1 for signed treatment.
In general, common symbols (see .common directive) are preferred over weak symbols.
See Section 5.9 for information about assembler symbols.