Linux-Grundlagen: Statische Bibliotheken vs. dynamische Bibliotheken

Erika Caoili

Folgen

Dez 17, 2019 · 4 min Lesezeit

Foto von Edwin Andrade auf Unsplash

Was ist eine Bibliothek unter Linux?

Warum verwenden wir Bibliotheken?

Wie erstelle ich eine statische und dynamische Bibliothek?

Wie und warum verwenden wir sie?

Eine Bibliothek unter Linux

Eine Bibliothek ist eine Sammlung vorkompilierter Codeteile, die als Funktionen bezeichnet werden. Die Bibliothek enthält gemeinsame Funktionen und zusammen bilden sie ein Paket namens – a library. Funktionen sind Codeblöcke, die im gesamten Programm wiederverwendet werden. Die erneute Verwendung der Codeteile in einem Programm spart Zeit. Es hält den Programmierer davon ab, den Code mehrmals neu zu schreiben. Für Programmierer stellen Bibliotheken wiederverwendbare Funktionen, Datenstrukturen, Klassen usw. bereit.

“ 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.“ („Verständnis von gemeinsam genutzten Bibliotheken in Linux“)

Eine Bibliothek ist nicht ausführbar und das ist ein wesentlicher Unterschied zu Prozessen und Anwendungen. Bibliotheken spielen ihre Rolle zur Laufzeit oder Kompilierzeit. In der Programmiersprache C gibt es zwei Arten von Bibliotheken: dynamische Bibliotheken und statische Bibliotheken.

Bibliotheken haben Objektdateien, die von "-c" gcc flag erstellt wurden und per Konvention in ".o" enden. Sie sind das Ergebnis der Ausgabe des Compilers und enthalten Funktionsdefinitionen in binärer Form.

Unterschiede zwischen dynamischen und statischen Bibliotheken

Dynamische Bibliotheken haben eine „*.so“ -Namenskonvention und statische Bibliotheken haben ein „* .ein“.

Dynamische oder gemeinsam genutzte Bibliotheken treten als separate Dateien außerhalb der ausführbaren Dateien auf. Daher benötigt es zur Laufzeit nur eine Kopie der Bibliotheksdateien. Zur Kompilierungszeit bleiben statische Bibliotheken in einem Programm gesperrt. Es enthält die Programme der Datei, die zur Kompilierungszeit eine Kopie der Bibliotheksdateien enthalten.

Bei Verwendung einer dynamischen Bibliothek verweist der Programmierer bei Bedarf zur Laufzeit auf diese Bibliothek. Um beispielsweise über standard input/output header file auf die String—Längenfunktion zuzugreifen, können Sie dynamisch darauf zugreifen. Aufgrund des dynamischen Laders wird die Bibliotheksreferenz des Programms zur Laufzeit gefunden. Anschließend wird diese Zeichenfolgenlängenfunktion in den Speicher geladen. Daher muss die dynamische Bibliothek Zugänglichkeit leicht verfügbar sein, oder es wird machtlos.

Vor- und Nachteile dynamischer Bibliotheken

  1. Zur Laufzeit wird nur eine Kopie benötigt. Es hängt davon ab, dass die Anwendung und die Bibliothek eng miteinander verbunden sind.
  2. Mehrere laufende Anwendungen verwenden dieselbe Bibliothek, ohne dass jede Datei eine eigene Kopie haben muss.
  3. Was ist jedoch, wenn die dynamische Bibliothek beschädigt wird? Die ausführbare Datei funktioniert möglicherweise nicht, da sie sich außerhalb der ausführbaren Datei befindet und anfällig für Fehler ist.
  4. Sie enthalten kleinere Dateien.
  5. Dynamische Bibliotheken werden zur Laufzeit verknüpft. Es erfordert keine Neukompilierung und Neuverknüpfung, wenn der Programmierer eine Änderung vornimmt.

Zur Kompilierungszeit verwenden Anwendungen statische Bibliotheken. Alle Kopien der Funktionen werden in die Anwendungsdatei eingefügt, da sie zum Ausführen des Prozesses benötigt werden.

Vor- und Nachteile statischer Bibliotheken

  1. Statische Bibliotheken sind anfällig, da sie sich in der ausführbaren Datei befinden.
  2. Die Geschwindigkeit zur Laufzeit tritt schneller auf, da sich der Objektcode (binär) in der ausführbaren Datei befindet. Somit werden Aufrufe der Funktionen schneller ausgeführt. Denken Sie daran, dass sich die dynamische Bibliothek außerhalb der ausführbaren Datei befindet, sodass Aufrufe von außerhalb der ausführbaren Datei erfolgen.
  3. Änderungen an den Dateien und dem Programm erfordern eine erneute Verknüpfung und Neukompilierung.
  4. Dateigröße ist viel größer.

Wie erstellt man eine statische und dynamische Bibliothek?

Für beide Bibliotheken sollte Ihr Programm eine prototype für jede der in Ihrer Bibliothek vorhandenen Funktionen enthalten. Wenn Sie eine Header-Datei verwenden, vergessen Sie nicht, header filename .

#include "<header file name>"

Dynamische Bibliotheken

Um eine dynamische Bibliothek zu erstellen, schreiben Sie den folgenden Befehl:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

Mit dem "*.c" — es werden alle C-Quelldateien im aktuellen Verzeichnis verwendet und eine gemeinsam genutzte Bibliothek mit dem Namen "liball.so." erstellt. Mit dem Flag -fPIC kann der folgende Code zur Laufzeit an einer beliebigen virtuellen Adresse referenziert werden. Es steht für Position Independent Code.Die Bibliothek speichert keine Daten an festen Adressen, da sich ihre Position im Speicher zwischen den Programmen ändert. Objektdateien werden mit -shared flag kompiliert. Der compiler identifiziert später eine Bibliothek, indem er nach Dateien sucht, die mit "lib" beginnen und mit der Namenskonvention enden, .so

Das Programm benötigt den Pfad, um nach den Bibliotheksdateien zu suchen. Sie müssen also den folgenden Befehl eingeben, um diesen Speicherort der Umgebungsvariablen hinzuzufügen LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Wenn Sie die dynamische Bibliothek verwenden, geben Sie den folgenden Befehl ein:

gcc -g -wall -o app app.c liball.so

Statische Bibliotheken

Um eine statische Bibliothek zu erstellen, müssen wir den folgenden Befehl verwenden:

ar rc liball.a dog.o cat.o bird.o

Das "ar" steht für archive und wird zum Erstellen der statischen Bibliothek verwendet. Alle Dateien, die auf ".o" enden, werden zu liball.a library hinzugefügt und sind in diesem Fall die Objektdateien.

Die -rc flag wird zwei Dinge tun: Ersetzen und erstellen Sie eine neue Bibliothek, wenn sie noch nicht existiert. Der nächste Schritt ist die Indizierung, dazu geben wir ein:

ranlib liball.a

Wenn Sie die statische Bibliothek verwenden, geben Sie den folgenden Befehl ein:

gcc main.c -L -l<filename>

Die -L flag greift auf die linker zu, sodass die Bibliotheken im angegebenen Verzeichnis gefunden werden können. Außerdem wird nach anderen Speicherorten gesucht, an denen der Compiler nach Systembibliotheken sucht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.