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.

War es hilfreich?

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()
    • Verwenden Sie closedir()

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top