Mir ist bekannt, dass freigegebene Objekte unter Linux "so numbers" verwenden, dh dass verschiedene Versionen eines freigegebenen Objekts unterschiedliche Erweiterungen erhalten, zum Beispiel:
example.so.1
example.so.2
Ich verstehe die Idee ist, zwei verschiedene Dateien zu haben, so dass zwei Versionen einer Bibliothek auf einem System existieren können (im Gegensatz zu "DLL Hell" unter Windows). Ich möchte wissen, wie das in der Praxis funktioniert? Oft sehe ich , dass example.so
in der Tat ist ein symbolischer Link auf , example.so.2
wo .2
ist die neueste Version. Wie erkennt dann eine Anwendung, die von einer älteren Version example.so
abhängt, diese richtig? Gibt es Regeln, welche Zahlen man verwenden muss? Oder ist das einfach Konvention? Ist es der Fall, dass im Gegensatz zu Windows, in dem Software-Binärdateien zwischen Systemen übertragen werden, ein System, das über eine neuere Version eines freigegebenen Objekts verfügt, beim Kompilieren aus dem Quellcode automatisch mit der älteren Version verknüpft wird?
Ich vermute, das hängt damit zusammen, ldconfig
aber ich bin mir nicht sicher, wie.
quelle
ldd
der vollständige Pfad zur ausführbaren Datei erforderlich ist.=ls
tut das in zsh, aber ich habe es geändert, da nicht jeder diese Shell benutztDie Nummern in den gemeinsam genutzten Bibliotheken werden in Linux üblicherweise verwendet, um die API einer Bibliothek zu identifizieren. Normalerweise lautet das Format:
Und wie Sie normalerweise bemerkt haben, gibt es eine symbolische Verknüpfung von libFOO.so zu libFOO.so.MAJOR.MINOR. ldconfig ist dafür verantwortlich, diesen Link auf die neueste Version zu aktualisieren.
Die MAJOR wird normalerweise erhöht, wenn sich die API ändert (neue Einstiegspunkte werden entfernt oder die Parameter oder Typen geändert). Das MINOR wird in der Regel für Fehlerkorrekturversionen oder bei der Einführung neuer APIs erhöht, ohne dass vorhandene APIs beschädigt werden.
Eine ausführlichere Diskussion finden Sie hier: Zerlegen von gemeinsam genutzten Bibliotheken
quelle
libFOO.so.MAJOR.MINOR
(also nicht am Ende)Freigegebene Bibliotheken sollten nach folgendem Schema versioniert werden:
wo
Normalerweise wird nur die erste Ziffer angezeigt,
hello.so.1
da nur die erste Ziffer zur Identifizierung der "Version" der Bibliothek erforderlich ist, da alle anderen Ziffern abwärtskompatibel sind.ldconfig
verwaltet eine Tabelle, welche gemeinsam genutzten Bibliotheken auf einem System verfügbar sind und wo sich der Pfad zu dieser Bibliothek befindet. Sie können dies überprüfen, indem Sie Folgendes ausführen:Wenn ein Paket für etwas wie Red Hat erstellt wird, werden die gemeinsam genutzten Bibliotheken, die in der Binärdatei aufgerufen werden, als Abhängigkeiten des Pakets zum Zeitpunkt der RPM-Erstellung gesucht und hinzugefügt. Wenn Sie das Paket installieren, prüft das Installationsprogramm daher, ob
hello.so.1
es auf dem System installiert istldconfig
.Sie können die Abhängigkeiten eines Pakets folgendermaßen anzeigen:
Dieses System (im Gegensatz zu Windows) ermöglicht
hello.so
die Installation mehrerer Versionen von auf einem System und die gleichzeitige Verwendung durch verschiedene Anwendungen.quelle
libNAME.so ist der Dateiname, der vom Compiler / Linker verwendet wird, wenn zum ersten Mal nach einer durch -lNAME angegebenen Bibliothek gesucht wird. In einer gemeinsam genutzten Bibliotheksdatei befindet sich ein Feld namens SONAME. Dieses Feld wird festgelegt, wenn die Bibliothek selbst durch den Erstellungsprozess zum ersten Mal mit einem gemeinsam genutzten Objekt verknüpft wird. Dieser SONAME ist tatsächlich das, was ein Linker in einer ausführbaren Datei speichert, abhängig davon, welches gemeinsam genutzte Objekt mit ihm verknüpft ist. Normalerweise hat der SONAME die Form libNAME.so.MAJOR und wird jedes Mal geändert, wenn die Bibliothek mit vorhandenen, damit verknüpften ausführbaren Dateien inkompatibel wird. Beide Hauptversionen der Bibliothek können nach Bedarf installiert bleiben (es wird jedoch nur auf eine Version für die Entwicklung verwiesen) als libNAME.so) Um ein einfaches Upgrade zwischen Nebenversionen einer Bibliothek zu unterstützen, ist libNAME.so.MAJOR normalerweise ein Link zu einer Datei wie libNAME.so.MAJOR.MINOR. Eine neue Unterversion kann installiert werden, und sobald der Link zur alten Unterversion fertiggestellt ist, wird er gestoßen, um auf die neue Unterversion zu verweisen, die alle neuen Ausführungen sofort aktualisiert, um die aktualisierte Bibliothek zu verwenden. Siehe auch meine Antwort aufLinux, GNU GCC, ld, Versionsskripte und das ELF-Binärformat - Wie funktioniert es?
quelle