Finden Sie ein Verzeichnis in Shared Library-Suchpfad
-
26-09-2019 - |
Frage
Ich will dlopen () jede gemeinsam genutzte Bibliothek in einem bestimmten Verzeichnis. Um diese
zu tun
Was ist der sauberste Weg, Linux Bibliothekssuchpfad abzurufen. Oder gibt es einen schnelleren Weg, der ein bestimmtes Verzeichnis in diesem Pfad finden?
Posix wäre besser.
Lösung
POSIX keinen Mechanismus unterstützt die Verzeichnisse auf dem gemeinsamen genutzten Bibliothekssuchpfad, um herauszufinden, (es nicht LD_LIBRARY_PATH
Mandat, zum Beispiel), so dass jede Lösung von Natur aus etwas plattformspezifisch.
Linux stellt einige Probleme, da die Werte verwendet werden, könnte man auf dem Inhalt des /etc/ld.so.conf
basieren sowie jeden Laufzeitwertes in LD_LIBRARY_PATH
Umgebungsvariable; andere Systeme präsentieren vergleichbare Probleme. Die Standardspeicherorte unterscheiden sich auch durch das System - mit /lib
und /usr/lib
für gewöhnlich sind 32-Bit-Linux-Maschinen aber /lib64
und /usr/lib64
auf mindestens einigen 64-Bit-Maschinen verwendet wird. Jedoch können auch andere Plattformen verwenden, um andere Standorte für 64-Bit-Software. Zum Beispiel verwendet Solaris /lib/sparcv9
und /usr/lib/sparcv9
, zum Beispiel (obwohl die docs /lib/64
und /usr/lib/64
erwähnt, sind sie symbolische Links zu den sparcv9
Verzeichnissen). Solaris hat auch Umgebungsvariablen LD_LIBRARY_PATH_64
und LD_LIBRARY_PATH_32
. HP-UX und AIX verwenden traditionell andere Variablen als LD_LIBRARY_PATH
- SHLIB_PATH
und LIBPATH
, IIRC - obwohl ich glaube, AIX jetzt Anwendungen zu LD_LIBRARY_PATH
. Und auf Solaris, das Werkzeug für gemeinsam genutzte Bibliotheken Konfiguration ist ‚crle‘ (configure Laufzeit von Umwelt) und der Analogon von /etc/ld.so.conf
entweder /var/ld/ld.config
oder /var/ld/64/ld.config
. Außerdem natürlich die Erweiterungen auf gemeinsam genutzten Bibliotheken variieren (.so
, .sl
, .dylib
, .bundle
, etc).
So wird Ihre Lösung plattformspezifisch sein. Sie müssen auf den die Standardpfade entscheiden, um die Umgebungsvariablen zu lesen, und die Konfigurationsdatei zu lesen, und die entsprechende Dateierweiterung. In Anbetracht diejenigen, dann ist es in erster Linie ein SMOP - einfach eine Frage der Programmierung:
- Für jedes Verzeichnis durch eine der Quellen genannt:
- Öffnen Sie das entsprechende Unterverzeichnis (
opendir()
)- Lesen Sie die einzelnen Dateinamen (
readdir()
) wiederum - Verwenden Sie
dlopen()
auf dem Weg der relevanten Dateien. - tun, was Analyse für Sie relevant ist.
- Verwenden Sie
dlclose()
- Lesen Sie die einzelnen Dateinamen (
- Verwenden Sie
closedir()
- Öffnen Sie das entsprechende Unterverzeichnis (
Siehe auch die Hinweise im Kommentar unten ... das komplette Thema ist bescheiden voller Variationen von Plattform zu Plattform.
Andere Tipps
Ich bin nicht sicher, dann ist es möglich, das zu tun und tragbar sein. Da diese Frage zu Linux ist, Portabilität kann nicht von größter Bedeutung sein. Dann verstehe ich nicht, die POSIX-Einschränkung. Könnten Sie erklären?
Sie werden wahrscheinlich haben, entweder die Suchfunktion in man 8 ld.so
detailliert zu implementieren, die zusätzlich zu LD_LIBRARY_PATH
/etc/ld.so.conf Scannen umfasst, oder make /lib/ld.so
tun, was Sie für Sie und die Ausgabe analysieren. Eine nicht genau hübsche Befehlszeile für das sein könnte:
export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD
Sie können dann enumerate-Dateien mit dem POSIX ruft opendir(3)
und readdir(3)
.