Symbol Resolution
Symbol resolution runs the entire spectrum, from simple and intuitive to complex and perplexing. Most resolutions are carried out silently by the link-editor. However, some relocations can be accompanied by warning diagnostics, while others can result in a fatal error condition.
The most common simple resolutions involve binding symbol references from one object to symbol definitions within another object. This binding can occur between two relocatable objects, or between a relocatable object and the first definition found in a shared object dependency. Complex resolutions typically occur between two or more relocatable objects.
The resolution of two symbols depends on their attributes, the type of file that provides the symbol, and the type of file being generated. For a complete description of symbol attributes, see Symbol Table Section. For the following discussions, however, three basic symbol types are identified.
-
Undefined – Symbols that have been referenced in a file but have not been assigned a storage address.
-
Tentative – Symbols that have been created within a file but have not yet been sized, or allocated in storage. These symbols appear as uninitialized C symbols, or
FORTRAN
COMMON
blocks within the file. -
Defined – Symbols that have been created, and assigned storage addresses and space within the file.
In its simplest form, symbol resolution involves the use of a precedence relationship. This relationship has defined symbols dominate tentative symbols, which in turn dominate undefined symbols.
The following example of C code shows how these symbol types can be
generated. Undefined symbols are prefixed with
u_
. Tentative symbols are prefixed with
t_
. Defined symbols are prefixed with
d_
.
$ cat main.c extern int u_bar; extern int u_foo(); int t_bar; int d_bar = 1; int d_foo() { return (u_foo(u_bar, t_bar, d_bar)); } $ cc -o main.o -c main.c $ elfdump -s main.o Symbol Table Section: .symtab index value size type bind oth ver shndx name .... [7] 0 0 FUNC GLOB D 0 UNDEF u_foo [8] 0x10 0x40 FUNC GLOB D 0 .text d_foo [9] 0x4 0x4 OBJT GLOB D 0 COMMON t_bar [10] 0 0x4 NOTY GLOB D 0 UNDEF u_bar [11] 0 0x4 OBJT GLOB D 0 .data d_bar