# 1.102.4

# Verwaltung von Shared Libraries

Beschreibung: Prüfungskandidaten 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. Zun 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.