GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wo suchen ausführbare Dateien zur Laufzeit nach gemeinsam genutzten Objekten?

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 .


Linux
  1. So erstellen Sie ein freigegebenes Verzeichnis für alle Benutzer in Linux

  2. Styli.sh ist ein großartiger dynamischer Desktop-Hintergrundbildwechsler für Linux

  3. Wie kann ich Exit-Codes für Anwendungen nachschlagen?

  4. Linux – Berechtigungsprobleme für freigegebenes Verzeichnis auf einem Server?

  5. „welches“ Äquivalent für gemeinsam genutzte Bibliotheken?

6 aufregende neue ShellHub-Funktionen, auf die Sie 2021 achten sollten

Linux Look Command Tutorial für Anfänger (mit Beispielen)

Statische und dynamische IP-Adresskonfigurationen für DHCP

So listen Sie gemeinsam genutzte Bibliotheken auf, die von ausführbaren Dateien in Linux verwendet werden

Wo ist die ausführbare PHP-Datei unter Ubuntu?

Wo sucht Django nach einer SQLite-Instanz? (SQLite 3.8.3 oder höher ist erforderlich (gefunden 3.7.17))