Kenwood HP 9000 Personal Computer User Manual


 
262 Chapter 7
Position-Independent Code
What Is Position-Independent Code?
What Is Position-Independent Code?
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.