wake-up-neo.com

Ist es in Ordnung, DYLD_LIBRARY_PATH unter Mac OS X zu verwenden? Und was ist der dynamische Bibliothekssuchalgorithmus damit?

Ich habe einige Artikel gelesen, die von der Verwendung von DYLD_LIBRARY_PATH abraten, da der Pfad der dynamischen Bibliothek mit -install_name, @rpath und @loader_path festgelegt werden sollte.

Um ein Programm zu erstellen, das sowohl unter Linux als auch unter Mac OS X ausgeführt werden kann, erfüllt DYLD_LIBRARY_PATH von Mac OS X genau die Anforderungen von LD_LIBRARY_PATH von Linux. Und wir können (fast) dieselbe make-Datei mit den Bezeichnungen -install_name und @rpath freigeben.

  • Ist dies OK, um DYLD_LIBRARY_PATH unter Mac OS X zu verwenden?
  • Was ist der Suchalgorithmus für dynamische Bibliotheken unter Mac OS X, wenn die Binärdatei die dynamische Bibliothek nicht finden kann? aktuelles Verzeichnis -> DYLD_LIBRARY_PATH-Verzeichnisse ...?
48
prosseek

Wie Sie bemerkt haben, DYLD_LIBRARY_PATH benimmt sich wie LD_LIBRARY_PATH auf anderen * nix. Es gibt jedoch eine andere Umgebungsvariable namens DYLD_FALLBACK_LIBRARY_PATH.

Im Allgemeinen werden diese (sowohl unter OSX als auch unter Linux) nur für Entwicklungszwecke empfohlen, da sie zu Fehlern bei der Symbolsuche führen können, wenn Sie eine Bibliothek überschreiben, die nicht dieselbe Symboltabelle enthält. Ein gutes Beispiel hierfür ist der Versuch, die Standardinstallation von VecLib (z. B. blas lapack) durch eine benutzerdefinierte Installation zu überschreiben. Dies führt dazu, dass in Anwendungen, die mit der System-VecLib verknüpft sind, Fehler aufgrund nicht gefundener Symbole auftreten, wenn DYLD_LIBRARY_PATH wird gesetzt und umgekehrt (Fehler bei der Symbolsuche in benutzerdefinierten Anwendungen), wenn dies nicht der Fall ist. Dies liegt daran, dass das System blas/lapack keine vollständige Implementierung der ATLAS-Bibliotheken ist.

DYLD_FALLBACK_LIBRARY_PATH erzeugt diese Probleme nicht.

Bei der Installation von Bibliotheken an einem nicht standardmäßigen Speicherort wird DYLD_FALLBACK_LIBRARY_PATH ist viel vernünftiger. Dadurch wird nach Symbolen in Bibliotheken gesucht, die in den Standardpfaden bereitgestellt werden. Wenn das Symbol dort nicht gefunden wird, greifen Sie auf den angegebenen Pfad zurück.

Der Vorteil ist, dass dieser Prozess in Anwendungen, die mit den Standardbibliotheken kompiliert wurden, keine Fehler bei der Symbolsuche verursacht.

Wenn Bibliotheken an nicht standardmäßigen Speicherorten installiert werden, sollten im Allgemeinen absolute Pfade angegeben werden, die die Mehrdeutigkeit der dynamischen Suche zunichte machen.

67
jkyle

DYLD_LIBRARY_PATH Verhält sich nicht wie LD_LIBRARY_PATH. Die Dokumentation zu OS X dlopen ( https://developer.Apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html ) gibt dies an Wenn Sie einen absoluten Pfad angeben, wird zuerst nach Orten gesucht, die mit DYLD_LIBRARY_PATH angegeben sind:

Wenn path einen Schrägstrich enthält, aber kein Framework-Pfad ist (dh ein vollständiger Pfad oder ein Teilpfad zu einer Dylib), durchsucht dlopen () Folgendes, bis eine kompatible Mach-O-Datei gefunden wird: $ DYLD_LIBRARY_PATH (mit Blattname aus path) , dann der angegebene Pfad (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade), dann $ DYLD_FALLBACK_LIBRARY_PATH (mit dem Blattnamen aus dem Pfad).

Mit anderen Worten, wenn Sie DYLD_LIBRARY_PATH Auf /Hello Setzen, rufen die folgenden zwei dlopen auf:

dlopen("/Hello/libfoo.so", RTLD_NOW);
dlopen("/World/libfoo.so", RTLD_NOW);

werden beide zu /Hello/libfoo.so aufgelöst. Dies ist nicht sehr intuitiv und stellt eine Sicherheitslücke dar. Software, die dlopen verwendet, kann nicht garantieren, dass die richtigen Bibliotheken geladen werden (möglicherweise DYLD_LIBRARY_PATH In der eigenen Umgebung überschreiben?)

6
Sander Mertens

Zur Dokumentation der Umgebungsvariablen des Dynamic Link Editors und ihrer Auswirkungen auf die Suche nach dynamischen Bibliotheken, man dyld.

DYLD_LIBRARY_PATH

Dies ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die Bibliotheken enthalten. Der dynamische Linker durchsucht diese Verzeichnisse, bevor er die Standardspeicherorte nach Bibliotheken durchsucht. Hier können Sie neue Versionen vorhandener Bibliotheken testen.

Für jede Bibliothek, die ein Programm verwendet, sucht der dynamische Linker nacheinander in jedem Verzeichnis in DYLD_LIBRARY_PATH. Wenn die Bibliothek immer noch nicht gefunden wird, werden nacheinander DYLD_FALLBACK_FRAMEWORK_PATH und DYLD_FALLBACK_LIBRARY_PATH durchsucht.

Verwenden Sie die Option -L, um (1) zu otoolen. um die Frameworks und gemeinsam genutzten Bibliotheken zu ermitteln, mit denen die ausführbare Datei verknüpft ist.

DYLD_FALLBACK_LIBRARY_PATH

Dies ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die Bibliotheken enthalten. Es wird als Standardspeicherort für Bibliotheken verwendet, die nicht im Installationspfad enthalten sind. Standardmäßig ist $ (HOME)/lib:/usr/local/lib:/lib:/usr/lib eingestellt.

DYLD_VERSIONED_LIBRARY_PATH

Dies ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die potenzielle Überschreibungsbibliotheken enthalten. Der dynamische Linker durchsucht diese Verzeichnisse nach dynamischen Bibliotheken. Für jede gefundene Bibliothek sucht dyld in seiner LC_ID_DYLIB und ruft den aktuellen Versions- und Installationsnamen ab. Dyld sucht dann nach der Bibliothek unter dem Pfad des Installationsnamens. Je nachdem, welcher Wert den größeren Wert für current_version hat, wird er verwendet, wenn eine Dylib mit diesem Installationsnamen erforderlich ist. Dies ist ähnlich wie DYLD_LIBRARY_PATH, außer dass die mitgelieferte Bibliothek neuer ist, anstatt sie immer zu überschreiben.

3
Doug Richardson