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_PATHaufgelistet sind Umgebungsvariable (DYLD_LIBRARY_PATHunter 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.confbesteht plus/libund/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 .