Verständnis gemeinsamer Bibliotheken in Linux

Verständnis gemeinsamer Bibliotheken in Linux

In der Programmierung ist eine Bibliothek eine Auswahl von vorkompilierten Codestücken, die in einem Programm wiederverwendet werden können. Bibliotheken vereinfachen das Leben für Programmierer, indem sie wiederverwendbare Funktionen, Routinen, Klassen, Datenstrukturen usw. bieten (geschrieben von einem anderen Programmierer), den 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 Mathematikfunktion erstellen. Sie können einfach vorhandene Funktionen in Bibliotheken für diese Programmiersprache verwenden.

Beispiele für Bibliotheken in Linux umfassen libc (die Standard -C -Bibliothek) oder Glibc (GNU -Version der Standard -C -Bibliothek), libcurl (Multiprotocol -Dateiübertragungsbibliothek), libcrypt (Bibliothek für Verschlüsselung, Hashing und Codierung in C) und vieles mehr.

Linux unterstützt zwei Klassen von Bibliotheken, nämlich:

  • Statische Bibliotheken - sind an ein Programm statisch zur Kompilierungszeit gebunden.
  • Dynamische oder gemeinsame Bibliotheken - werden geladen, wenn ein Programm gestartet und in den Speicher geladen wird, und die Bindung erfolgt zur Laufzeit.

Dynamische oder gemeinsame Bibliotheken können weiter kategorisiert werden in:

  • Dynamisch verknüpfte Bibliotheken - Hier ist ein Programm mit der freigegebenen Bibliothek verknüpft und der Kernel lädt die Bibliothek (falls sie nicht im Speicher ist) bei der Ausführung.
  • Dynamisch geladene Bibliotheken - Das Programm übernimmt die volle Kontrolle, indem sie Funktionen mit der Bibliothek aufruft.

Gemeinsame Bibliotheksnamenkonventionen

Freigegebene Bibliotheken werden auf zwei Arten benannt: der Bibliotheksname (a.k.A Soname) und ein „Dateiname“ (absoluter Pfad zur Datei, der Bibliothekscode speichert).

Zum Beispiel die Soname für libc Ist libc.So.6: Wo lib ist das Präfix, C ist ein beschreibender Name, so bedeutet das gemeinsame Objekt, und 6 ist die Version. Und sein Dateiname lautet: /lib64/libc.So.6. Beachten Sie, dass der Soname tatsächlich ein symbolischer Link zum Dateinamen ist.

Suchen Sie gemeinsame Bibliotheken in Linux

Gemeinsame Bibliotheken werden von geladen ld.So (oder ld.So.X) Und ld-linux.So (oder ld-linux.So.X) Programme, wo X ist die Version. Unter Linux, /lib/ld-linux.So.X Suchen und lädt alle gemeinsam genutzten Bibliotheken, die von einem Programm verwendet werden.

Ein Programm kann eine Bibliothek mit dem Namen des Bibliotheks oder des Dateinamens anrufen, und ein Bibliothekspfad speichert Verzeichnisse, in denen Bibliotheken im Dateisystem gefunden werden können. Standardmäßig befinden sich Bibliotheken in /usr/local/lib, /usr/local/lib64, /usr/lib Und /usr/lib64; Systemstart -Bibliotheken sind in /lib Und /lib64. Programmierer können jedoch Bibliotheken an benutzerdefinierten Stellen installieren.

Der Bibliotheksweg kann in definiert werden /etc/ld.So.Conf Datei, die Sie mit einem Befehlszeileneditor bearbeiten können.

# vi /etc /ld.So.Conf 

Die Zeile in dieser Datei weist den Kernel an, die Datei in zu laden /etc/ld.So.Conf.D. Auf diese Weise können Paketwarter oder Programmierer der Suchliste ihre benutzerdefinierten Bibliotheksverzeichnisse hinzufügen.

Wenn Sie in die schauen /etc/ld.So.Conf.D Verzeichnis werden Sie sehen .Conf Dateien für einige gängige Pakete (Kernel, MySQL und PostgreSQL in diesem Fall):

# 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 den Mariadb-X86_64 ansehen.Conf, Sie sehen einen absoluten Weg, um Bibliotheken zu verpacken.

# Cat Mariadb-X86_64.Conf /usr/lib64/mysql 

Die obige Methode legt den Bibliotheksweg dauerhaft fest. Verwenden Sie die vorübergehende Einstellung, um das vorübergehend zu verwenden Ld_library_path Umgebungsvariable in der Befehlszeile. Wenn Sie die Änderungen dauerhaft halten möchten, fügen Sie diese Zeile in die Shell -Initialisierungsdatei hinzu /etc/Profil (global) oder ~/.Profil (Benutzerspezifisch).

# Exportieren Sie ld_library_path =/path/to/bibliothek/Datei 

Verwalten gemeinsamer Bibliotheken in Linux

Sehen wir uns nun an, wie man mit gemeinsamen Bibliotheken umgeht. Um eine Liste aller freigegebenen Bibliotheksabhängigkeiten für eine Binärdatei zu erhalten, können Sie die verwenden LDD -Dienstprogramm. Die Ausgabe von LDD ist in der Form:

Bibliotheksname => Dateiname (ein hexadezimaler Wert) oder Dateiname (ein hexadezimaler Wert) #Diese wird angezeigt, wenn der Name der Bibliothek nicht gelesen werden kann 

Dieser Befehl zeigt alle gemeinsam genutzten Bibliotheksabhängigkeiten für den Befehl ls.

# ldd/usr/bin/ls oder # ldd/bin/ls 
Probenausgabe
 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 gemeinsame Bibliotheken in vielen verschiedenen Verzeichnissen existieren können, wäre es sehr ineffizient, all diese Verzeichnisse zu durchsuchen, wenn ein Programm gestartet wird: Dies ist eine der wahrscheinlichen Nachteile dynamischer Bibliotheken. Daher wird ein Mechanismus des Zwischenspeichers verwendet, der vom Programm durchgeführt wird ldconfig.

Standardmäßig, ldconfig liest den Inhalt von /etc/ld.So.Conf, erstellt die entsprechenden symbolischen Links in den dynamischen Linkverzeichnissen und schreibt dann einen Cache an /etc/ld.So.Zwischenspeicher was dann leicht von anderen Programmen verwendet werden kann.

Dies ist sehr wichtig, insbesondere wenn Sie gerade neue gemeinsam genutzte Bibliotheken installiert oder Ihre eigenen erstellt oder neue Bibliotheksverzeichnisse erstellt haben. Sie müssen die ausführen ldconfig Befehl, um die Änderungen zu bewirken.

# ldconfig oder # ldconfig -v #shows Dateien und Verzeichnisse, mit denen es funktioniert 

Nachdem Sie Ihre gemeinsame Bibliothek erstellt haben, müssen Sie sie installieren. Sie können es entweder in eine der oben genannten Standardverzeichnisse verschieben und die ausführen ldconfig Befehl.

Führen Sie alternativ den folgenden Befehl aus, um symbolische Links aus dem zu erstellen Soname zum Dateinamen:

# ldconfig -n/path/to/your/Shared/Bibliotheken 

Um mit dem Erstellen Ihrer eigenen Bibliotheken zu beginnen, lesen Sie diesen Leitfaden aus dem Linux -Dokumentationsprojekt (TLDP).

Das ist alles fürs Erste! In diesem Artikel haben wir Ihnen eine Einführung in Bibliotheken gegeben und gemeinsam genutzte Bibliotheken erläutert und wie man sie unter Linux verwaltet. Wenn Sie Fragen oder zusätzliche Ideen zum Teilen haben, verwenden Sie das folgende Kommentarformular.