1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--Converted with LaTeX2HTML 2002-2-1 (1.70)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Linkers and Position Independent Code (PIC)</TITLE>
<META NAME="description" CONTENT="Linkers and Position Independent Code (PIC)">
<META NAME="keywords" CONTENT="users_guide">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="users_guide.css">
<LINK REL="next" HREF="node195.html">
<LINK REL="previous" HREF="node193.html">
<LINK REL="up" HREF="node193.html">
<LINK REL="next" HREF="node195.html">
</HEAD>
<BODY >
<DIV CLASS="navigation"><!--Navigation Panel-->
<A NAME="tex2html3623"
HREF="node195.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html3617"
HREF="node193.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html3611"
HREF="node193.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html3619"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html3621"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html3624"
HREF="node195.html">Tracking Down Problems</A>
<B> Up:</B> <A NAME="tex2html3618"
HREF="node193.html">Dynamic vs. Static Linking</A>
<B> Previous:</B> <A NAME="tex2html3612"
HREF="node193.html">Dynamic vs. Static Linking</A>
<B> <A NAME="tex2html3620"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html3622"
HREF="node317.html">Index</A></B>
<BR>
<BR></DIV>
<!--End of Navigation Panel-->
<H2><A NAME="SECTION04131000000000000000"></A><A NAME="ss:pic"></A><A NAME="11190"></A>
<BR>
Linkers and Position Independent Code (PIC)
</H2>
In a static library, the linker simply copies needed compilation units
from the library to the executable. The static library can subsequently
be deleted with no adverse affects to the executable. This also causes
common libraries to be duplicated in every executable that links against
it, and for the resulting executables to be quite large.
<P>
In a shared library, the linker simply inserts in the executable enough
information to find the library and load it when the executable is invoked.
This typically happens before the program ever gets to <TT>main()</TT>.
This keeps executables small and allows commonly used libraries to be
reused without copying, but it also means that the executable can fail
if the library is renamed, moved, deleted, or even if the user's
environment changes sufficiently.
<P>
A necessary (but not sufficient) condition for shared libraries to work is
that all the compilation units (<TT>*.o</TT>)
contained must be explicitly compiled as <SPAN CLASS="textit">position independent code</SPAN>(PIC).
Position independent code has an added level of indirection in critical
areas since details (such as addresses to jump to in subroutine calls)
are not known until runtime. Even though shared libraries are very useful,
PIC causes a small but measurable degradation in performance, making static
linked libraries with non-PIC code a viable option for performance-critical
situations.
<P>
A dynamic-linked library is a shared library with one added feature,
it can be loaded explicitly by the user at runtime by passing the string
name into <TT>dlopen()</TT>. Dynamic-linked libraries (DLL's) also require
compilation as PIC, though many compilers (including GCC) have special
commands for each<A NAME="tex2html48"
HREF="footnode.html#foot11280"><SUP><SPAN CLASS="arabic">15</SPAN>.<SPAN CLASS="arabic">1</SPAN></SUP></A>.
<P>
<DIV CLASS="navigation"><HR>
<!--Navigation Panel-->
<A NAME="tex2html3623"
HREF="node195.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html3617"
HREF="node193.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html3611"
HREF="node193.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html3619"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html3621"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html3624"
HREF="node195.html">Tracking Down Problems</A>
<B> Up:</B> <A NAME="tex2html3618"
HREF="node193.html">Dynamic vs. Static Linking</A>
<B> Previous:</B> <A NAME="tex2html3612"
HREF="node193.html">Dynamic vs. Static Linking</A>
<B> <A NAME="tex2html3620"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html3622"
HREF="node317.html">Index</A></B> </DIV>
<!--End of Navigation Panel-->
<ADDRESS>
<br><br>babel-0.10.2<br>users_guide Last Modified 2005-03-23<br><br><a href="http://www.llnl.gov/CASC/components">http://www.llnl.gov/CASC/components</a><br><a href="mailto:components@llnl.gov">components@llnl.gov</a>
</ADDRESS>
</BODY>
</HTML>
|