In der HOWTO der Shared Library werden die meisten Mechanismen erläutert, und das Handbuch zum dynamischen Laden wird ausführlicher beschrieben. Jede Unix-Variante hat ihren eigenen Weg, aber die meisten verwenden dasselbe ausführbare Format ( ELF ) und haben ähnliche dynamische Linker (von Solaris abgeleitet). Im Folgenden fasse ich das allgemeine Verhalten mit einem Schwerpunkt auf Linux zusammen. In den Handbüchern Ihres Systems finden Sie die vollständige Story.
Kurz gesagt, wenn nach einer dynamischen Bibliothek ( .so
Datei) gesucht wird, versucht der Linker Folgendes:
- Verzeichnisse, die in der
LD_LIBRARY_PATH
Umgebungsvariablen aufgelistet sind ( DYLD_LIBRARY_PATH
unter OSX);
- Verzeichnisse, die im Pfad der ausführbaren Datei aufgeführt sind ;
- Verzeichnisse im Systemsuchpfad, der (mindestens unter Linux) aus den Einträgen in
/etc/ld.so.conf
plus /lib
und besteht /usr/lib
.
Der Pfad wird in der ausführbaren Datei gespeichert (es ist das DT_RPATH
oder DT_RUNPATH
dynamische Attribut). Es kann absolute Pfade oder Pfade enthalten, die mit $ORIGIN
einem Pfad relativ zum Speicherort der ausführbaren Datei beginnen (z. B. wenn sich die ausführbare Datei in /opt/myapp/bin
und ihr Pfad in befindet, sucht $ORIGIN/../lib:$ORIGIN/../plugins
der dynamische Linker in /opt/myapp/lib
und /opt/myapp/plugins
). Der Pfad wird normalerweise festgelegt, wenn die ausführbare Datei kompiliert wird, mit der -rpath
Option to ld
, aber Sie können ihn anschließend mit ändern chrpath
.
Im Szenario beschreiben Sie, wenn Sie sich an den Entwickler oder Verpacker der Anwendung sind und beabsichtigen , sie in einem installiert werden …/bin
, …/lib
Struktur, dann verbinden 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 hinzufügen $LD_LIBRARY_PATH
), oder versuchen Sie es chrpath
.
/lib64
und/usr/lib64
für 64-Bit-Binärdateien und/lib
und/usr/lib
für 32-Bit-Binärdateien verwendet.ldconfig
.ldconfig
wird eingebunden, wenn Sie eine Bibliothek installieren.*.so
Bibliotheken nicht identisch ist mit$PATH
. Der Suchpfad wird von @enzotib in der Antwort angegeben. Führen Sie den folgenden Befehl aus, um die zu durchsuchenden Pfade auszudruckenldconfig -v 2>/dev/null | grep -v ^$'\t'
./sbin/ldconfig
und die andere Magie von Andrew Bate, damit es ohne Rootberechtigung ausgeführt wirdUnter Linux wird das Verhalten in der
ld(1)
Manpage erläutertquelle
Ich bin mir ziemlich sicher, dass die Antwort hier ist
ldconfig
.http://linux.die.net/man/8/ldconfig
quelle
Für laufende Anwendungen
/proc/1234/maps
enthält die Datei alle aktuell 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.
quelle