Title: 1.102.3 - Verwaltung von Shared Libraries
Course: LPIC-1 101

1.102.3 - Verwaltung von Shared Libraries

Quelle: F. Kahlhammer, LPI Study-Guide, 2001

Sie sollten in der Lage sein, Shared Libraries, die von ausführbaren Programmen benötigt werden, zu bestimmen und nötigenfalls zu installieren. Sie sollten ebenfalls fähig sein, anzugeben wo sich die Systembibliotheken befinden.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- ldd
- ldconfig
- /etc/ld.so.conf
- LD_LIBRARY_PATH

Die Technik der Shared Libraries

Shared Libraries sind Funktionsbibliotheken, die von mehreren Programmen benutzt werden können und die so nur einmal in den Speicher geladen werden müssen, anstatt für jedes Programm extra Platz zu verschwenden. Normalerweise würde ein Programm beim Linkvorgang (dem Vorgang, bei dem alle Objektdateien und die Systemlibraries zur ausführbaren Datei zusammengefügt werden) mit allen Libraries, aus denen das Programm Funktionen benötigt, statisch gelinkt. Das würde aber bedeuten, daß Programme, die gleichzeitig laufen, diese Funktionsbibliotheken - jedes Programm für sich - in den Speicher laden müsste. Die shared library Technik verhindert das. Ein Programm, das geladen wird, überprüft, ob die notwendigen Libraries schon im Arbeitsspeicher liegen. Tun sie das, so läd sich das Programm in den Arbeitsspeicher und benutzt einfach die schon geladenen Libraries. Liegen die benötigten Libraries noch nicht im Arbeitsspeicher, so werden sie zunächst geladen und erst dann läd sich das Programm.

So wird jede benötigte Library nur einmal in den Speicher geladen, was gerade in einem System, das viele Programme gleichzeitig geladen hält eine enorme Speichereinsparung bewirkt.

Wenn ein Programm geladen wird, dann muß es eine Instanz geben, die den geschilderten Vorgang startet. Denn das Programm selbst kann das nicht tun, es wird ja erst geladen, wenn die nötigen Libraries auch schon geladen sind. Diese Instanz ist sozusagen der Programmlader oder der sogenannte dynamische Linker und Lader. Der Name dieses Programms ist ld.so.

ld.so läd die shared libraries, die ein Programm benötigt, bereitet dann das Programm entsprechend vor und läd es selbst. Die shared libraries, die das zu ladende Programm benötigt, werden in der folgenden Reihenfolge gesucht:

- Alle Pfade, die in der Umgebungsvariable LD_LIBRARY_PATH eingetragen sind, werden nach den Libraries durchsucht. LD_LIBRARY_PATH ist eine Shellvariable, die eine durch Doppelpunkte getrennte Liste von Verzeichnissen enthält.
- Die Datei /etc/ld.so.cache enthält eine binäre Liste aller Librarie-Kandidaten, die schon vorher in den genannten Verzeichnissen gefunden wurden. (siehe weiter unten bei ldconfig.)
- Die Verzeichnisse /usr/lib und /lib werden durchsucht.

Ein Linux-Programm wird also von einem speziellen Programmlader (ld.so) geladen, der die notwendigen Libraries gleich mitläd. Aus diesem Grund ist es nötig, daß jedes Programm, das installiert wird, auch die entsprechenden Libraries mitinstalliert bzw. überprüft, ob sie schon installiert sind. Die Verwaltung dieser Libraries obliegt der Systemverwaltung.

Welches Programm braucht welche Library?

Um herauszufinden, welche Shared Libraries ein bestimmtes Programm benutzt, gibt es das kleine Programm ldd. Dieses Programm gibt eine Liste aller Libraries zurück, die das Programm benötigt, daß als Parameter ldd mitgegeben wurde. Um z.B. herauszubekommen, welche Libraries das Programm ls benötigt, schreiben wir

 ldd /bin/ls


Das zu untersuchende Programm muß mit vollem Pfad angegeben werden. Die Ausgabe wäre für unser Beispiel dann etwas in der Art:

 librt.so.1 => /lib/librt.so.1 (0x40022000)
 libc.so.6 => /lib/libc.so.6 (0x40033000)
 libpthread.so.0 => /lib/libpthread.so.0 (0x4014e000)
 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


Daraus geht hervor, daß das Programm ls vom Linker/Loader /lib/ld-linux.so.2 gestartet werden will und die Libraries librt.so.1, libc.so.6 und libpthread.so.0 benötigt. In der rechten Spalte sind die Fundorte der Libraries im Dateisystem zu lesen.

Wenn ein Programm neu installiert wird, so kann mit Hilfe dieses Befehls herausgefunden werden, ob alle Libraries für das Programm existieren oder ob einige nachinstalliert werden müssen.

Libraries installieren und aktualisieren

Wenn neue Libraries installiert werden sollen, dann stellt sich die Frage, wohin. Zunächst einmal bieten sich die Verzeichnisse /lib, /usr/lib und /usr/local/lib an. Sollen aber neue Verzeichnisse angelegt werden, die Libraries enthalten, dann muß das der internen Verwaltung der Libraries mitgeteilt werden.

Die interne Verwaltung der Libraries wird durch den Aufruf des Programms ldconfig vollzogen. Dieses Programm wartet den Library Cache und erstellt automatisch die notwendigen symbolischen Links auf Libraries. Der Librarie-Cache liegt in der Datei /etc/ld.so.cache und enthält eine binär codierte Liste aller dem System bekannten Libraries.

Damit ldconfig diese Datei erstellen kann und auch neu hinzugekommene Libraries dort aufgenommen werden, muß ldconfig wissen, welche Verzeichnisse nach Libraries durchsucht werden sollen. ldconfig durchsucht zunächst die beiden Verzeichnisse /usr/lib und /lib, danach alle Verzeichnisse, die in der Datei /etc/ld.so.conf aufgelistet sind.

Wenn also ein neues Programm foo installiert wird, das seine Shared Libraries im Verzeichnis /usr/local/foo/lib ablegt, so müssen wir nur dieses Verzeichnis in die Datei /etc/ld.so.conf aufnehmen. Nach der Installation neuer Libraries und/oder der Neuaufnahme von Pfaden in der Datei /etc/ld.so.conf muß das Programm ldconfig ausgeführt werden, bevor die neuen Libraries verwendet werden können. Erst nach dem Aufruf von ldconfig stehen sie ja in der Datei /etc/ld.so.cache und sind somit dem Linker/Loader bekannt.