Systembibliothek
Eine Systembibliothek (engl. shared library; auch: Dynamische Bibliothek) ist eine Programmbibliothek und wird erst bei Bedarf in den Arbeitsspeicher geladen und durch den sogenannten Loader mit dem ausführbaren Programm verbunden. So muss eine Bibliothek, die von mehreren Programmen genutzt wird, nur einmal im Arbeitsspeicher gehalten werden. Wurde das Programm allerdings für eine bestimmte Version der Bibliothek übersetzt, so funktioniert es möglicherweise nach einem Update nicht mehr. Die Paketverwaltungen berücksichtigen dies aber meist und aktualisieren die betroffenen Programme.
ldd zeigt die von einem Programm benötigten Programmbibliotheken an. Aber auch wenn alle installiert sind, heisst dies noch nicht, dass Linux sie auch findet. Zunächst bestimmt die Datei "/etc/ld.so.conf", wo nach Systembibliotheken gesucht wird. Bei der Installation von Systembibliotheken in ungewöhnlichen Pfaden ist diese Konfigurationsdatei anzupassen. Neuere Distributionen nutzen dazu auvch die Dateien im Verzeichnis "/etc/ld.so.conf.d/". Wurde eine Systembibliothek über die Paketverwaltung installiert, so kümmert sich diese auch um das Anpassen der Datei und um die Neuanlage des Cache. Damit nicht bei jedem Programmstart alle Verzeichnisse durchsucht werden müssen, verwendet Linux nämlich einen Cache, der alle in den angegebenen Verzeichnissen gespeicherten Systembibliotheken aufführt. Der Befehl ldconfig legt diesen Cache neu an und sollte also jedesmal aufgerufen werden, wenn eine Systembibliothek von Hand installiert wird.
Unix | Unter Unix wird für Systembibliotheken üblicherweise die Endung ".so" (shared object) verwendet. Normalerweise folgt dem Bibliotheksnamen eine Versionsnummer und es gibt einen symbolischen Link mit dem Bibliotheksnamen ohne Versionsnummer, der auf die eigentliche Bibliothek verweist. Eine Linux-Standardinstallation enthält hunderte solcher Systembibliotheken.
Die Systembibliotheken liegen meist in den Verzeichnissen "/lib" und "/usr/lib". Wo das System sonst noch suchen soll, ist in der Datei "/etc/ld.so.conf" definiert. Alternativ dazu kann in der Umgebungsvariable "LD_LIBRARY_PATH" analog zur Variable "PATH" eine durch Doppelpunkte getrennte Liste von zu durchsuchenden Pfaden angegeben werden. Da jedes Programm zum Start zahlreiche Bibliotheken benötigt, führt Linux in der Datei "/etc/ld.so.cache" eine kleine Datenbank mit Namen, Version und Ort der einzelnen Bibliotheken. Diese Datenbank wird normalerweise beim Systemstart aktualisiert, lässt sich aber auch im laufenden Betrieb mit dem Befehl ldconfig aktualisieren. Die wichtigste Linux-Bibliothek ist die GNU C Library / Glibc. |
Windows | Unter Windows werden Systembibliotheken auch dynamische Bibliotheken genannt und besitzen die Endung ".dll" (dynamic link library). Sie liegen meist in den Verzeichnissen "C:\Windows\system" und "C:\Windows\system32". Eine Windows-Standardinstallation enthält über tausend solche dynamische Bibliotheken. |
Probleme
Unter Linux gibt es drei typische Problemfälle mit Systembibliotheken:
- Die Bibliothek ist nicht installiert.
- Die Bibliothek ist nicht in der richtigen Version installiert.
- Die Bibliothek wird nicht gefunden, obwohl sie installiert ist.
Die Bibliothek ist nicht installiert
Wenn sich z. B. ein Programm darüber beklagt, dass es die Systembibliothek "libdv.so.4" nicht finden kann, so wird zuerst mit dem Paketmanager der entsprechenden Distribution überprüft, ob sich die Bibliothek auf den Installationsmedien befindet.
SUSE Linux | Zeigt das Hilfsprogramm pin keine Treffer an, so kann die Zahl am Ende des Bibliotheksnamens weggelassen werden - diese Zahl steht für die Versionsnummer; ohne ihre Angabe findet pin auch neuere und ältere Versionen der Bibliothek.
$ pin libdv.so.4 |
Fedora Core | rpm findet nur Pakete, wenn die Versionsnummer angegeben wird und das entsprechende Paket bereits installiert ist.
$ rpm -q --whatprovides libdv.so.4 yum sucht auch in Paketen, die noch nicht installiert sind. Die Versionsnummer darf dabei nicht angegeben werden. $ yum search libdv.so |
Die Bibliothek ist nicht in der richtigen Version installiert
Wenn ein Programm z. B. die Bibliothek "libdv.so.4" benötigt, auf dem lokalen System aber nur die Datei "libdv.so.2" installiert ist, so muss das entsprechende Paket aufgefrischt werden. Dies führt möglicherweise zu einer Kette weiterer Abhängigkeiten, so dass es in einigen Fällen einfacher ist, die gesamte Distribution zu aktualisieren.
Lässt sich das neue Paket ohne weiteres mit dem Paketmanager der Distribution installieren, so ist alles in Ordnung.
Listet das Installationsprogramm dagegen viele unerfüllte Abhängigkeiten auf, dann ist viel zu tun... Womöglich kann aber auch einfach ein Symbolischer Link gesetzt werden. Beispielsweise muss nach einer Aktualisierung der Bibliothek "libdv" auf Version 4.0.2 der Link weiterhin "libdv.so.4" heissen: die Programme merken dann nichts vom Update. Ein Link hilft oft auch bei Abwärtskompatibilität. Sucht z. B. eine Programm auf dem System nach der Datei "libdv.so.2", so wird einfach ein Link mit diesem Namen auf die vorhandene Bibliothek "libdv.so.4.0.1" gelegt. Meist funktioniert das Programm danach wieder tadellos.
# cd /usr/lib $ ln -s libdv.so.4.0.1 libdv.so.2
Die Bibliothek wird nicht gefunden, obwohl sie installiert ist
Manchmal bemängelt ein Programm auch nach der Installation einer Systembibliothek noch ihr Fehlen. In diesem Fall muss die Datenbank aller Systembibliotheken mit ldconfig aufgefrischt werden.
Unter SUSE Linux macht YAST nach der Installation von RPM-Paketen automatisch ein Update des Library Cache. Sichtbar wird dies am Eintrag "Linker-Cache" wird eingerichtet beim Start von Suseconfig).
Wird die gesuchte Bibliothek vom Programm auch nach dem Aufruf von ldconfig nicht gefunden, so sucht es vermutlich am falschen Ort. Wo das System suchen soll ist in der Datei "/etc/ld.so.conf" definiert. Diese Datei enthält Informationen darüber, welche Verzeichnisse ausser "/lib" und "/usr/lib" noch Systembibliotheken enthalten. Wurde z. B. der Multimediaplayer xine nach "/opt" installiert, so muss das Verzeichnis "/opt/lib/xine" in die Datei "/etc/ld.so.conf" eingetragen und anschliessend ldconfig aufgerufen werden.