|
10.2.1 Position Independent Code
On most architectures, when you compile source code to object code, you
need to specify whether the object code should be position
independent or not. There are occasional architectures which don't
make the distinction, usually because all object code is position
independent by virtue of the ABI(15), or less often because the load
address of the object is fixed at compile time (which implies that
shared libraries are not supported by such a platform).
If an object is compiled as position independent code (PIC), then
the operating system can load the object at any address in
preparation for execution. This involves a time overhead, in replacing
direct address references with relative addresses at compile time, and a
space overhead, in maintaining information to help the runtime loader
fill in the unresolved addresses at runtime. Consequently, PIC
objects are usually slightly larger and slower at runtime than the
equivalent non-PIC object. The advantage of sharing library code
on disk and in memory outweigh these problems as soon as the PIC
object code in shared libraries is reused.
PIC compilation is exactly what is required for objects which will
become part of a shared library. Consequently, libtool builds
PIC objects for use in shared libraries and non-PIC objects
for use in static libraries. Whenever libtool instructs the
compiler to generate a PIC object, it also defines the preprocessor
symbol, `PIC', so that assembly code can be aware of whether it
will reside in a PIC object or not.
Typically, as libtool is compiling sources, it will generate a
`.lo' object, as PIC, and a `.o' object, as non-PIC,
and then it will use the appropriate one of the pair when linking
executables and libraries of various sorts. On architectures where
there is no distinction, the `.lo' file is just a soft link to the
`.o' file.
In practice, you can link PIC objects into a static archive for a
small overhead in execution and load speed, and often you can similarly
link non-PIC objects into shared archives. If you find that you
need to do this, libtool provides several ways to override the
default behavior (see section 10.1 Creating libtool ).
|