source: introduction/important/libraries.xml@ ccded7e

11.0 11.1 11.2 11.3 12.0 12.1 kea ken/TL2024 ken/inkscape-core-mods ken/tuningfonts lazarus lxqt plabs/newcss plabs/python-mods python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition trunk upgradedb xry111/intltool xry111/llvm18 xry111/soup3 xry111/test-20220226 xry111/xf86-video-removal
Last change on this file since ccded7e was 0d7900a, checked in by Randy McMurchy <randy@…>, 11 years ago

Removed extraneous spaces from blank lines and at the end of lines in the .xml

git-svn-id: svn://svn.linuxfromscratch.org/BLFS/trunk/BOOK@11015 af4574ff-66df-0310-9fd7-8a98e5e911e0

  • Property mode set to 100644
File size: 6.4 KB
RevLine 
[6ed5123]1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="libraries" xreflabel="libraries">
9 <?dbhtml filename="libraries.html"?>
10
11 <sect1info>
12 <othername>$LastChangedBy$</othername>
13 <date>$Date$</date>
14 </sect1info>
15
[ec43904]16 <title>Libraries: Static or shared?</title>
[6ed5123]17
18 <!-- section g : 'Others' in longindex.html -->
19 <indexterm zone="libraries">
20 <primary sortas="g-libraries">libraries: static or shared</primary>
21 </indexterm>
22
23 <sect2 role="package">
[ec43904]24 <title>Libraries: Static or shared?</title>
[6ed5123]25
[ec43904]26 <para>The original libraries were simply an archive of routines from which
[6ed5123]27 the required routines were extracted and linked into the executable program.
28 These are described as static libraries (libfoo.a). On some old operating
29 systems they are the only type available.</para>
30
[0d7900a]31 <para>On almost all Linux platforms there are also shared libraries
32 (libfoo.so) - one copy of the library is loaded into virtual memory, and
33 shared by all the programs which call any of its functions. This is space
[ec43904]34 efficient.</para>
[6ed5123]35
36 <para>In the past, essential programs such as a shell were often linked
37 statically so that some form of minimal recovery system would exist even if
[ec43904]38 shared libraries, such as libc.so, became damaged (e.g. moved to
[6ed5123]39 <filename class="directory">lost+found</filename> after fsck following an
[ec43904]40 unclean shutdown). Nowadays, most people use an alternative system install
41 or a Live CD if they have to recover. Journaling filesystems also reduce
[6ed5123]42 the likelihood of this sort of problem.</para>
43
44 <para>Developers, at least while they are developing, often prefer to use
45 static versions of the libraries which their code links to.</para>
46
47 <para>Within the book, there are various places where configure switches
48 such as <command>--disable-static</command> are employed, and other places
49 where the possibility of using system versions of libraries instead of the
50 versions included within another package is discussed. The main reason for
51 this is to simplify updates of libraries.</para>
52
53 <para>If a package is linked to a dynamic library, updating to a newer
54 library version is automatic once the newer library is installed and the
55 program is (re)started (provided the library major version is unchanged,
[ec43904]56 e.g. going from libfoo.so.2.0 to libfoo.so.2.1. Going to libfoo.so.3
[0d7900a]57 will require recompilation - <command>ldd</command> can be used to find
58 which programs use the old version). If a program is linked to a static
59 library, the program always has to be recompiled. If you know which
60 programs are linked to a particular static library, this is merely an
61 annoyance. But usually you will <emphasis>not</emphasis> know which
[ec43904]62 programs to recompile.</para>
63
64 <para>Most libraries are shared, but if you do something unusual, such as
65 moving a shared library to <filename class="directory">/lib</filename>
66 accidentally breaking the <literal>.so</literal> symlink in
[0d7900a]67 <filename class="directory">/usr/lib</filename> while keeping the static
68 library in <filename class="directory">/lib</filename>, the static library
[ec43904]69 will be silently linked into the programs which need it.</para>
70
71 <para>One way to identify when a static library is used, is to deal with it
[6ed5123]72 at the end of the installation of every package. Write a script to find all
[ec43904]73 the static libraries in <filename class="directory">/usr/lib</filename> or
[0d7900a]74 wherever you are installing to, and either move them to another directory so
75 that they are no longer found by the linker, or rename them so that libfoo.a
76 becomes e.g. libfoo.a.hidden. The static library can then be temporarily
77 restored if it is ever needed, and the package needing it can be
78 identified. You may choose to exclude some of the static libraries from
[ec43904]79 glibc if you do this (<filename>libc_nonshared.a, libg.a, libieee.a, libm.a,
[0d7900a]80 libpthread_nonshared.a, librpcsvc.a, libsupc++.a</filename>) to simplify
[ec43904]81 compilation.</para>
[6ed5123]82
83<!-- versions hardcoded in this para, it's a comment on those versions -->
[0d7900a]84 <para>If you use this approach, you may discover that more packages than
[ec43904]85 you were expecting use a static library. That was the case with
[0d7900a]86 <application>nettle-2.4</application> in its default static-only
[ec43904]87 configuration: It was required by <application>GnuTLS-3.0.19</application>,
[0d7900a]88 but also linked into package(s) which used
89 <application>GnuTLS</application>, such as
[6ed5123]90 <application>glib-networking-2.32.3</application>.</para>
91
92 <para>Many packages put some of their common functions into a static
[ec43904]93 library which is only used by the programs within the package and,
[0d7900a]94 crucially, the library is <emphasis>not</emphasis> installed as a
95 standalone library. These internal libraries are not a problem - if the
96 package has to be rebuilt to fix a bug or vulnerability, nothing else is
[ec43904]97 linked to them.</para>
98
[0d7900a]99 <para>When BLFS mentions system libraries, it means shared versions of
100 libraries. Some packages such as <xref linkend="firefox"/> and
101 <xref linkend="gs"/> include many other libraries. When they link to them,
102 they link statically so this also makes the programs bigger. The version
103 they ship is often older than the version used in the system, so it may
104 contain bugs - sometimes developers go to the trouble of fixing bugs in
[ec43904]105 their included libraries, other times they do not.</para>
[6ed5123]106
107 <para>Sometimes, deciding to use system libraries is an easy decision. Other
108 times it may require you to alter the system version (e.g. for
109 <xref linkend="libpng"/> if used for <xref linkend="firefox"/>).
[ec43904]110 Occasionally, a package ships an old library and can no longer link to
[0d7900a]111 the current version, but can link to an older version. In this case, BLFS
112 will usually just use the shipped version. Sometimes the included library
113 is no longer developed separately, or its upstream is now the same as the
114 package&apos;s upstream and you have no other packages which will use it.
[ec43904]115 In those cases, you might decide to use the included static library even if
116 you usually prefer to use system libraries.</para>
[6ed5123]117
118 <para condition="html" role="usernotes">User Notes:
119 <ulink url="&blfs-wiki;/libraries"/></para>
120
121 </sect2>
122
123</sect1>
Note: See TracBrowser for help on using the repository browser.