Relocation Processing
After locating and loading any objects, the runtime linker must
process each object and perform any necessary relocations. Any
objects that are brought into the process's address space with
dlopen
(3C) must also be relocated in the same
manner.
For simple applications this process is straightforward. However, for
users who have more complex applications with many
dlopen
(3C) calls involving many objects,
possibly with common dependencies, this process can be quite
important.
Relocations can be categorized according to when they occur. The default behavior of the runtime linker is to process all immediate reference relocations at initialization and all lazy references during process execution, a mechanism commonly referred to as lazy binding.
This same mechanism is applied to any objects added with
dlopen
(3C) when the mode is defined as
RTLD_LAZY
. An alternative is to require
all relocations of an object to be performed immediately when the
object is added. You can use a mode of RTLD_NOW
,
or record this requirement in the object when it is built using the
link-editor's -z now
option. This relocation
requirement is propagated to any dependencies of the object being
opened.
Relocations can also be categorized into non-symbolic and symbolic. The remainder of this section covers issues regarding symbolic relocations, regardless of when these relocations occur, with a focus on some of the subtleties of symbol lookup.