it-swarm.com.de

Wo suchen ausführbare Dateien zur Laufzeit nach freigegebenen Objekten?

Ich verstehe, wie man eingeschlossene Objekte zum Zeitpunkt der Verknüpfung/Kompilierung definiert. 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 lib.so Bibliothek. Nach dem Kompilieren verschiebe ich lib.so in ein neues Verzeichnis in meinem $HOME.

Wie kann ich sagen a.out um dort danach zu suchen?

120
rahmu

Die gemeinsam genutzte Bibliothek HOWTO erklärt die meisten beteiligten Mechanismen, und die Handbuch für dynamische Lader geht detaillierter. Jede Unix-Variante hat ihren eigenen Weg, aber die meisten verwenden dasselbe ausführbare Format ( ELF ) und haben ähnliche dynamische Linker (abgeleitet von Solaris). Im Folgenden fasse ich das allgemeine Verhalten mit Schwerpunkt auf Linux zusammen. In den Handbüchern Ihres Systems finden Sie die vollständige Geschichte.

Kurz gesagt, wenn nach einer dynamischen Bibliothek gesucht wird (.so - Datei), versucht der Linker:

  • verzeichnisse, die in der Umgebungsvariablen LD_LIBRARY_PATH aufgeführt sind (DYLD_LIBRARY_PATH unter OSX);
  • verzeichnisse in der ausführbaren Datei aufgeführt rpath ;
  • verzeichnisse im Systemsuchpfad, der (zumindest unter Linux) aus den Einträgen in /etc/ld.so.conf plus /lib und /usr/lib besteht.

Der Pfad wird in der ausführbaren Datei gespeichert (es ist das dynamische Attribut DT_RPATH Oder DT_RUNPATH). 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 ihr Pfad $Origin/../lib:$Origin/../plugins Ist Der dynamische Linker sieht in /opt/myapp/lib und /opt/myapp/plugins aus. Der Pfad wird normalerweise beim Kompilieren der ausführbaren Datei mit der Option -rpath Auf ld festgelegt. Sie können ihn jedoch anschließend mit chrpath ändern.

Wenn Sie in dem von Ihnen beschriebenen Szenario Entwickler oder Packager der Anwendung sind und beabsichtigen, diese in einer …/bin, …/lib - Struktur zu installieren, verknüpfen Sie sie mit -rpath='$Origin/../lib'. . 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 in einem Verzeichnis, das Sie zu $LD_LIBRARY_PATH) Oder versuchen Sie es mit chrpath.

Unter Linux wird das Verhalten in der Manpage ld(1) erläutert

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.
16
enzotib

Ich bin mir ziemlich sicher, dass die Antwort hier ldconfig lautet.

ldconfig erstellt die erforderlichen Links und den Cache zu den neuesten gemeinsam genutzten Bibliotheken in den in der Befehlszeile angegebenen Verzeichnissen, in der Datei /etc/ld.so.conf und in den vertrauenswürdigen Verzeichnissen (/ lib und/usr/lib). Der Cache wird vom Laufzeitlinker ld.so oder ld-linux.so verwendet. ldconfig überprüft den Header und die Dateinamen der Bibliotheken, auf die es stößt, wenn ermittelt wird, bei welchen Versionen die Links aktualisiert werden sollen.

http://linux.die.net/man/8/ldconfig

3
Sean C.

Zum Ausführen von Anwendungen die Datei /proc/1234/maps enthält alle tatsächlich dynamisch verknüpften Bibliotheken.

Wo 1234 ist die PID der laufenden ausführbaren Datei.

Linux folgt LD_LIBRARY_PATH und anderen Variablen, wie in der Antwort von Gilles ausgeführt.

0
user138692