Website-Suche

Gemeinsam genutzte Bibliotheken unter Linux verstehen


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) oder Glibc (GNU-Version der Standard-C-Bibliothek) und libcurl (Multiprotokolldatei). Transferbibliothek), libcrypt (Bibliothek für Verschlüsselung, Hashing und Codierung in C) und viele mehr.

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

  • Statische Bibliotheken – werden 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 soname) und ein „Dateiname“ (absoluter Pfad zur Datei, in der der Bibliothekscode gespeichert ist).

Der soname für libc ist beispielsweise libc.so.6: wobei lib das Präfix ist, c ist ein beschreibender Name, bedeutet also Shared Object, und 6 ist 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 von ld.so (oder ld.so.x) und ld-linux.so (oder ld-) geladen. linux.so.x)-Programme, wobei x die Version ist. Unter Linux durchsucht und lädt /lib/ld-linux.so.x 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/lib und /usr/lib64; Systemstartbibliotheken befinden sich in /lib und /lib64. Programmierer können Bibliotheken jedoch an benutzerdefinierten Speicherorten installieren.

Der Bibliothekspfad kann in der Datei /etc/ld.so.conf definiert werden, 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 in /etc/ld.so.conf.d zu laden. Auf diese Weise können Paketbetreuer oder Programmierer ihre benutzerdefinierten Bibliotheksverzeichnisse zur Suchliste hinzufügen.

Wenn Sie in das Verzeichnis /etc/ld.so.conf.d schauen, sehen Sie .conf-Dateien für einige gängige Pakete (Kernel, MySQL und Postgresql in). dieser 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 einen Blick auf die mariadb-x86_64.conf werfen, 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 die Umgebungsvariable LD_LIBRARY_PATH in der Befehlszeile. Wenn Sie die Änderungen dauerhaft beibehalten möchten, fügen Sie diese Zeile in die Shell-Initialisierungsdatei /etc/profile (global) oder ~/.profile (benutzerspezifisch) ein.

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 das ldd-Dienstprogramm verwenden. Die Ausgabe von ldd hat folgende Form:

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 den Befehl ls 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. Hierzu wird ein Caching-Mechanismus eingesetzt, der vom Programm ldconfig durchgeführt wird.

Standardmäßig liest ldconfig den Inhalt von /etc/ld.so.conf, erstellt die entsprechenden symbolischen Links in den dynamischen Linkverzeichnissen und schreibt dann einen Cache in /etc/ld.so.cache, das 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 den Befehl ldconfig ausführen, um die Änderungen wirksam werden zu lassen.

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 den Befehl ldconfig ausführen.

Alternativ können Sie den folgenden Befehl ausführen, um symbolische Links vom soname zum Dateinamen zu erstellen:

ldconfig -n /path/to/your/shared/libraries

Um mit der Erstellung Ihrer eigenen Bibliotheken zu beginnen, lesen Sie diese Anleitung von The Linux Documentation Project (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.