Position-independent code (PIC)
is a form of absolute object code that does not
contain any absolute addresses and therefore does not depend on
where it is loaded in the process's virtual address space. This
is an important property for building shared libraries.
In order for the object code in a shared library to be fully
shareable, it must not depend on its position in the virtual address
space of any particular process. The object code in a shared library
may be attached at different points in different processes, so it
must work independent of being located at any particular position,
hence the term position-independent code.
Position independence is achieved by two mechanisms: First,
PC-relative addressing is used wherever possible
for branches within modules. Second, indirect addressing
through a per-process linkage table is used
for all accesses to global variables, or for inter-module procedure
calls and other branches and literal accesses where PC-relative
addressing cannot be used. Global variables must be accessed indirectly
since they may be allocated in the main program's address space,
and even the relative position of the global variables may vary
from one process to another.
The HP-UX dynamic loader (see dld.sl(5))
and the virtual memory management system work together to find free
space at which to attach position-independent code within a process's
address space. The dynamic loader also resolves any virtual addresses
that might exist in the library.
Calls to PIC routines are accomplished through a procedure
linkage table (PLT), which is
built by the linker. Similarly, references to data are accomplished
through a data linkage table (DLT).
Both tables reside in a process's data segment. The dynamic loader
fills in these tables with the absolute virtual addresses of the
routines and data in a shared library at run time (known as binding).
Because of this, PIC can be loaded and executed anywhere that a
process has free space.
On compilers that support PIC generation, the +z
and +Z options
cause the compiler to create PIC relocatable object code.