Ich weiß, dass eine .so
Datei eine Art dynamische Bibliothek ist (viele Threads können solche Bibliotheken gemeinsam nutzen, sodass nicht mehr als eine Kopie davon im Speicher vorhanden sein muss). Aber was ist der Unterschied zwischen.a
und .la
? Sind das alles statische Bibliotheken?
Wenn dynamische Bibliotheken große Vorteile gegenüber statischen haben, warum gibt es dann immer noch viele statische Bibliotheken?
Ich möchte auch wissen, welcher Mechanismus zum Laden von Bibliotheken (beide Arten) zugrunde liegt und wie ein Code in einer Bibliothek aufgerufen wird, wenn er irgendwo verwendet wird. Welchen Teil des Kernels soll ich studieren? Und welchen zugehörigen Linux-Befehl / Dienstprogramm sollte ich kennen, um zu wissen, wie ein Prozess ausgeführt wird? (Ich kenne den ld
Befehl nur bis jetzt)
Wann sollte ich versuchen, Code in .so
oder zu integrieren .a
? Welches ist besser?
[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror 932 Sep 2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep 2 23:25 openvpn-plugin-down-root.so
Antworten:
.so
Dateien sind dynamische Bibliotheken . Das Suffix steht für "Shared Object", da alle mit der Bibliothek verknüpften Anwendungen dieselbe Datei verwenden, anstatt eine Kopie in der resultierenden ausführbaren Datei zu erstellen..a
Dateien sind statische Bibliotheken . Das Suffix steht für "Archiv", weil es sich eigentlich nur um ein Archiv handelt (erstellt mit demar
Befehl - einem Vorgänger vontar
, der jetzt nur zum Erstellen von Bibliotheken verwendet wird) der ursprünglichen .o-Objektdateien handelt..la
Dateien sind Textdateien, die vom GNU-Paket "libtools" verwendet werden , um die Dateien zu beschreiben, aus denen die entsprechende Bibliothek besteht. Weitere Informationen dazu finden Sie in der folgenden Frage: Wozu dient die .la-Datei von libtool?Statische und dynamische Bibliotheken haben jeweils Vor- und Nachteile.
Static Pro: Der Benutzer verwendet immer die Version der Bibliothek, die Sie mit Ihrer Anwendung getestet haben, sodass keine überraschenden Kompatibilitätsprobleme auftreten sollten.
Statische Konsequenz: Wenn ein Problem in einer Bibliothek behoben ist, müssen Sie Ihre Anwendung neu verteilen, um sie nutzen zu können. Sofern es sich nicht um eine Bibliothek handelt, die Benutzer wahrscheinlich selbst aktualisieren, müssen Sie dies möglicherweise trotzdem tun.
Dynamic Pro: Der Speicherbedarf Ihres Prozesses ist geringer, da der für die Bibliothek verwendete Speicher auf alle Prozesse verteilt wird, die die Bibliothek verwenden.
Dynamic Pro: Bibliotheken können bei Bedarf zur Laufzeit geladen werden. Dies ist gut für Plugins, sodass Sie nicht die Plugins auswählen müssen, die beim Kompilieren und Installieren der Software verwendet werden sollen. Neue Plugins können im laufenden Betrieb hinzugefügt werden.
Dynamische Con: Die Bibliothek ist möglicherweise nicht auf dem System vorhanden, auf dem jemand versucht, die Anwendung zu installieren, oder es gibt eine Version, die nicht mit der Anwendung kompatibel ist. Um dies zu vermeiden, muss das Anwendungspaket möglicherweise eine Kopie der Bibliothek enthalten, damit es bei Bedarf installiert werden kann. Dies wird auch häufig durch Paketmanager gemildert, die alle erforderlichen Abhängigkeiten herunterladen und installieren können.
Dynamische Bibliotheken sind besonders nützlich für Systembibliotheken wie
libc
. Diese Bibliotheken müssen häufig Code enthalten, der vom jeweiligen Betriebssystem und der jeweiligen Version abhängt, da sich die Kernelschnittstellen geändert haben. Wenn Sie ein Programm mit einer statischen Systembibliothek verknüpfen, wird es nur auf der Version des Betriebssystems ausgeführt, für die diese Bibliotheksversion geschrieben wurde. Wenn Sie jedoch eine dynamische Bibliothek verwenden, wird automatisch die Bibliothek abgerufen, die auf dem System installiert ist, auf dem Sie ausgeführt werden.quelle