In der Programmierung ist eine Bibliothek eine Sammlung vorkompilierter Codeteile, die in einem Programm wiederverwendet werden können. Bibliotheken erleichtern Programmierern das Leben, indem sie wiederverwendbare Funktionen, Routinen, Klassen, Datenstrukturen usw. (von einem anderen Programmierer geschrieben) bereitstellen, die sie in ihren Programmen verwenden können.
Wenn Sie beispielsweise eine Anwendung erstellen, die mathematische Operationen ausführen muss, müssen Sie dafür keine neue mathematische Funktion erstellen, sondern können einfach vorhandene Funktionen in Bibliotheken für diese Programmiersprache verwenden.
Beispiele für Bibliotheken unter Linux sind:libc(die Standard-C-Bibliothek) oderGlibc(GNU-Version der Standard-C-Bibliothek),libcurl(Multiprotokoll-Dateiübertragungsbibliothek),libcrypt(Bibliothek für Verschlüsselung, Hashing und Kodierung in C) und viele mehr.
Linux unterstützt zwei Klassen von Bibliotheken, nämlich:
- Statische Bibliotheken– sind zur Kompilierungszeit statisch an ein Programm gebunden.
- Dynamische oder gemeinsam genutzte Bibliotheken– werden geladen, wenn ein Programm gestartet und in den Speicher geladen wird, und die Bindung erfolgt zur Laufzeit.
Dynamische oder gemeinsam genutzte Bibliotheken können weiter kategorisiert werden in:
- Dynamisch verknüpfte Bibliotheken– Hier wird ein Programm mit der gemeinsam genutzten Bibliothek verknüpft und der Kernel lädt die Bibliothek (falls sie sich nicht im Speicher befindet) bei der Ausführung.
- Dynamisch geladene Bibliotheken– Das Programm übernimmt die volle Kontrolle, indem es Funktionen mit der Bibliothek aufruft.
Benennungskonventionen für gemeinsam genutzte Bibliotheken
Freigegebene Bibliotheken werden auf zwei Arten benannt: der Bibliotheksname (auch bekannt als „Shared Libraries“)soname) und einen „Dateinamen“ (absoluter Pfad zur Datei, in der der Bibliothekscode gespeichert ist).
Zum Beispiel diesonamefürlibcIstlibc.so.6: Wolibist das Präfix,Cist ein beschreibender Name, bedeutet also „gemeinsames Objekt“ und6ist die Version. Und sein Dateiname ist:/lib64/libc.so.6. Beachten Sie, dass der Soname tatsächlich ein symbolischer Link zum Dateinamen ist.
Auffinden gemeinsam genutzter Bibliotheken unter Linux
Gemeinsam genutzte Bibliotheken werden geladen vonld.so(oderld.so.x) Undld-linux.so(oderld-linux.so.x) Programme, woXist die Version. Unter Linux,/lib/ld-linux.so.xDurchsucht und lädt alle gemeinsam genutzten Bibliotheken, die von einem Programm verwendet werden.
Ein Programm kann eine Bibliothek über ihren Bibliotheksnamen oder Dateinamen aufrufen, und ein Bibliothekspfad speichert Verzeichnisse, in denen Bibliotheken im Dateisystem zu finden sind. Standardmäßig befinden sich Bibliotheken in/usr/local/lib,/usr/local/lib64,/usr/libUnd/usr/lib64; Systemstartbibliotheken sind vorhanden/libUnd/lib64. Programmierer können Bibliotheken jedoch an benutzerdefinierten Speicherorten installieren.
Der Bibliothekspfad kann in definiert werden/etc/ld.so.confDatei, die Sie mit einem Befehlszeileneditor bearbeiten können.
# vi /etc/ld.so.conf
Die Zeile(n) in dieser Datei weisen den Kernel an, die Datei zu laden/etc/ld.so.conf.d. Auf diese Weise können Paketbetreuer oder Programmierer ihre benutzerdefinierten Bibliotheksverzeichnisse zur Suchliste hinzufügen.
Wenn man sich das anschaut/etc/ld.so.conf.dVerzeichnis, Sie werden sehen.confDateien für einige gängige Pakete (in diesem Fall Kernel, MySQL und Postgresql):
# ls /etc/ld.so.conf.d kernel-2.6.32-358.18.1.el6.x86_64.conf kernel-2.6.32-696.1.1.el6.x86_64.conf mariadb-x86_64.conf kernel-2.6.32-642.6.2.el6.x86_64.conf kernel-2.6.32-696.6.3.el6.x86_64.conf postgresql-pgdg-libs.conf
Wenn Sie sich die mariadb-x86_64.conf ansehen, sehen Sie einen absoluten Pfad zu Paketbibliotheken.
# cat mariadb-x86_64.conf /usr/lib64/mysql
Die obige Methode legt den Bibliothekspfad dauerhaft fest. Um es vorübergehend festzulegen, verwenden Sie dieLD_LIBRARY_PATHUmgebungsvariable in der Befehlszeile. Wenn Sie die Änderungen dauerhaft behalten möchten, fügen Sie diese Zeile in die Shell-Initialisierungsdatei ein/etc/profile(global) oder~/.profile(benutzerspezifisch).
# export LD_LIBRARY_PATH=/path/to/library/file
Gemeinsam genutzte Bibliotheken unter Linux verwalten
Schauen wir uns nun an, wie man mit gemeinsam genutzten Bibliotheken umgeht. Um eine Liste aller gemeinsam genutzten Bibliotheksabhängigkeiten für eine Binärdatei zu erhalten, können Sie die verwendenldd-Dienstprogramm. Die Ausgabe vonldliegt in der Form vor:
library name => filename (some hexadecimal value) OR filename (some hexadecimal value) #this is shown when library name can’t be read
Dieser Befehl zeigt alle Abhängigkeiten der gemeinsam genutzten Bibliothek für an.
# ldd /usr/bin/ls OR # ldd /bin/ls
Beispielausgabe
linux-vdso.so.1 => (0x00007ffebf9c2000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000) librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000) libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000) libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000) /lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000) libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000) libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)
Da gemeinsam genutzte Bibliotheken in vielen verschiedenen Verzeichnissen vorhanden sein können, wäre das Durchsuchen aller dieser Verzeichnisse beim Starten eines Programms äußerst ineffizient: Dies ist einer der wahrscheinlichen Nachteile dynamischer Bibliotheken. Daher wird ein Caching-Mechanismus eingesetzt, der vom Programm ausgeführt wirdldconfig.
Standardmäßig istldconfigliest den Inhalt von/etc/ld.so.conf, erstellt die entsprechenden symbolischen Links in den dynamischen Linkverzeichnissen und schreibt dann einen Cache hinein/etc/ld.so.cachedie dann problemlos von anderen Programmen verwendet werden kann.
Dies ist insbesondere dann sehr wichtig, wenn Sie gerade neue gemeinsam genutzte Bibliotheken installiert oder Ihre eigenen erstellt oder neue Bibliotheksverzeichnisse erstellt haben. Sie müssen das ausführenldconfigBefehl, um die Änderungen auszuführen.
# ldconfig OR # ldconfig -v #shows files and directories it works with
Nachdem Sie Ihre gemeinsam genutzte Bibliothek erstellt haben, müssen Sie sie installieren. Sie können es entweder in eines der oben genannten Standardverzeichnisse verschieben und ausführenldconfigBefehl.
Alternativ können Sie den folgenden Befehl ausführen, um symbolische Links aus dem zu erstellensonamezum Dateinamen:
# ldconfig -n /path/to/your/shared/libraries
Um mit der Erstellung Ihrer eigenen Bibliotheken zu beginnen, lesen Sie diese Anleitung vonDas Linux-Dokumentationsprojekt (TLDP).
Das ist alles für jetzt! In diesem Artikel haben wir Ihnen eine Einführung in Bibliotheken gegeben und gemeinsam genutzte Bibliotheken sowie deren Verwaltung unter Linux erklärt. Wenn Sie Fragen haben oder weitere Ideen mitteilen möchten, verwenden Sie das Kommentarformular unten.