Ich verstehe, wie definiert wird, dass gemeinsame Objekte beim Verknüpfen/Kompilieren eingeschlossen werden. Ich frage mich jedoch immer noch, wie ausführbare Dateien für das gemeinsam genutzte Objekt aussehen (*.so
Bibliotheken) zur Ausführungszeit.
Zum Beispiel meine App a.out
ruft Funktionen auf, die in der lib.so
definiert sind Bücherei. Nach dem Kompilieren verschiebe ich lib.so
in ein neues Verzeichnis in meinem $HOME
.
Wie kann ich a.out
mitteilen dort suchen gehen?
Akzeptierte Antwort:
Das Shared-Library-HOWTO erklärt die meisten beteiligten Mechanismen, und das Handbuch zum dynamischen Ladeprogramm geht detaillierter darauf ein. Jede Unix-Variante hat ihren eigenen Weg, aber die meisten verwenden das gleiche ausführbare Format (ELF) und haben ähnliche dynamische Linker¹ (abgeleitet von Solaris). Im Folgenden fasse ich das allgemeine Verhalten mit Schwerpunkt auf Linux zusammen; die vollständige Geschichte finden Sie in den Handbüchern Ihres Systems.
(Anmerkung zur Terminologie:Der Teil des Systems, der gemeinsam genutzte Bibliotheken lädt, wird oft als „Dynamic Linker“ bezeichnet, manchmal aber auch als „Dynamic Loader“, um genauer zu sein. „Dynamic Linker“ kann auch das Tool bedeuten, das beim Kompilieren Anweisungen für den Dynamic Loader generiert ein Programm oder die Kombination aus dem Kompilierzeit-Tool und dem Laufzeit-Loader. In dieser Antwort bezieht sich „Linker“ auf den Laufzeitteil.)
Kurz gesagt, wenn es nach einer dynamischen Bibliothek (.so
Datei) versucht der Linker:
- Verzeichnisse, die im
LD_LIBRARY_PATH
aufgelistet sind Umgebungsvariable (DYLD_LIBRARY_PATH
unter OSX); - Verzeichnisse, die im rpath der ausführbaren Datei aufgelistet sind;
- Verzeichnisse im Systemsuchpfad, der (zumindest unter Linux) aus den Einträgen in
/etc/ld.so.conf
besteht plus/lib
und/usr/lib
.
Der rpath wird in der ausführbaren Datei gespeichert (es ist der DT_RPATH
oder DT_RUNPATH
dynamisches Attribut). Es kann absolute Pfade oder Pfade enthalten, die mit $ORIGIN
beginnen um einen Pfad relativ zum Speicherort der ausführbaren Datei anzugeben (z. B. wenn sich die ausführbare Datei in /opt/myapp/bin
befindet und sein rpath ist $ORIGIN/../lib:$ORIGIN/../plugins
dann sucht der dynamische Linker in /opt/myapp/lib
und /opt/myapp/plugins
). Der rpath wird normalerweise bestimmt, wenn die ausführbare Datei kompiliert wird, mit dem -rpath
Option zu ld
, aber Sie können es nachträglich mit chrpath
ändern .
In dem von Ihnen beschriebenen Szenario, wenn Sie der Entwickler oder Paketierer der Anwendung sind und beabsichtigen, sie in einem …/bin
zu installieren , …/lib
Struktur, dann mit -rpath='$ORIGIN/../lib'
verlinken . Wenn Sie eine vorgefertigte Binärdatei auf Ihrem System installieren, legen Sie die Bibliothek entweder in einem Verzeichnis im Suchpfad ab (/usr/local/lib
wenn Sie der Systemadministrator sind, andernfalls ein Verzeichnis, das Sie zu $LD_LIBRARY_PATH
hinzufügen ), oder versuchen Sie es mit chrpath
.