[01669da] | 1 | <sect1 id="ch05-whystatic">
|
---|
| 2 | <title>Why do we use static linking?</title>
|
---|
| 3 | <?dbhtml filename="whystatic.html" dir="chapter05"?>
|
---|
| 4 |
|
---|
[32cee45c] | 5 | <para>(Thanks to Plasmatic for posting the text on which this is mainly
|
---|
| 6 | based to one of the LFS mailing lists.)</para>
|
---|
[01669da] | 7 |
|
---|
| 8 | <para>When making (compiling) a program, rather than having to rewrite all the
|
---|
[76c0b78] | 9 | functions for dealing with the kernel, hardware, files, etc. every time you
|
---|
[01669da] | 10 | write a new program, all these basic functions are instead kept in libraries.
|
---|
[fe57863] | 11 | glibc, which you install later, is one of these major libraries, which
|
---|
| 12 | contains code for all the basic functions programs use, like opening files,
|
---|
| 13 | printing information on the screen, and getting feedback from the user. When
|
---|
| 14 | the program is compiled, these libraries of code are linked together with the
|
---|
| 15 | new program, so that it can use any of the functions that the library
|
---|
[01669da] | 16 | has.</para>
|
---|
| 17 |
|
---|
[762603e] | 18 | <para>However, these libraries can be very large (for example, libc.a
|
---|
[32cee45c] | 19 | can often be around 2.5 MB), so you may not want a separate copy of each
|
---|
[fe57863] | 20 | library attached to the program. Just imagine if you had a simple command
|
---|
[32cee45c] | 21 | like ls with an extra 2.5 MB attached to it! Instead of making the library
|
---|
[415157ef] | 22 | an actual part of the program, or statically linked, the library is stored
|
---|
| 23 | as a separate file, which is loaded only when the program needs it. This
|
---|
| 24 | is what we call dynamically linked, as the library is loaded and unloaded
|
---|
| 25 | dynamically, as the program needs it.</para>
|
---|
| 26 |
|
---|
| 27 | <para>So now we have a 1 KB file and a 2.5 MB file, but we still haven't
|
---|
| 28 | saved any space (except maybe RAM until the library is needed). The
|
---|
| 29 | <emphasis>real</emphasis> advantage of dynamically linked libraries is
|
---|
| 30 | that we only need one copy of the library. If <filename>ls</filename> and
|
---|
| 31 | <filename>rm</filename> both use the same library, then we don't need two
|
---|
| 32 | copies of the library, as they can both get the code from the same file.
|
---|
[a2cd10f] | 33 | Even when in memory, the two programs share the same code, rather than loading
|
---|
[01669da] | 34 | duplicates into memory. So not only are we saving hard disk space, but also
|
---|
| 35 | precious RAM.</para>
|
---|
| 36 |
|
---|
| 37 | <para>If dynamic linking saves so much room, then why are we making everything
|
---|
| 38 | statically linked? Well, that's because when you chroot into your brand new
|
---|
| 39 | (but very incomplete) LFS environment, these dynamic libraries won't be
|
---|
| 40 | available because they are somewhere else in your old directory tree
|
---|
| 41 | (<filename>/usr/lib</filename> for example) which won't be accessible
|
---|
| 42 | from within your LFS root (<filename>$LFS</filename>).</para>
|
---|
| 43 |
|
---|
[415157ef] | 44 | <para>So in order for your new programs to run inside the chroot environment
|
---|
| 45 | you need to make sure that the libraries are statically linked when you build
|
---|
[01669da] | 46 | them, hence the <userinput>--enable-static-link</userinput>,
|
---|
| 47 | <userinput>--disable-shared</userinput>, and
|
---|
| 48 | <userinput>-static</userinput> flags used
|
---|
[26e62aa] | 49 | through Chapter 5. Once in Chapter 6, the first thing we do is build the
|
---|
[01669da] | 50 | main set of system libraries, glibc. Once this is made we start rebuilding
|
---|
[26e62aa] | 51 | all the programs we just did in Chapter 5, but this time dynamically linked,
|
---|
[76c0b78] | 52 | so that we can take advantage of the space saving opportunities.</para>
|
---|
[01669da] | 53 |
|
---|
| 54 | <para>And there you have it, that's why you need to use those weird
|
---|
| 55 | <userinput>-static</userinput> flags. If you try building everything
|
---|
| 56 | without them, you'll see very quickly what
|
---|
| 57 | happens when you chroot into your newly crippled LFS system.</para>
|
---|
| 58 |
|
---|
[415157ef] | 59 | <para>If you want to know more about Dynamically Linked Libraries, consult
|
---|
| 60 | a book or website on programming, especially a Linux-related site.</para>
|
---|
[01669da] | 61 |
|
---|
| 62 | </sect1>
|
---|