Ich möchte die Liste der dynamischen Bibliotheken herausfinden, die eine Binärdatei lädt, wenn sie ausgeführt wird (mit ihren vollständigen Pfaden). Ich benutze CentOS 6.0. Wie macht man das?
executable
libraries
dynamic-linking
Ciro Santilli ist ein Schauspieler
quelle
quelle
lld
auf Darwin, so scheint es, und ich kann es auch nicht über Homebrew finden.otool -L <path-to-binary>
ldd
. Siehe Manpage .readelf -d $executable | grep 'NEEDED'
Kann verwendet werden, wenn Sie die ausführbare Datei nicht ausführen können, z. B. wenn sie crosscompiliert wurde oder wenn Sie ihr nicht vertrauen:
Beispiel:
Beispiel Ausgabe:
Beachten Sie, dass Bibliotheken von anderen Bibliotheken abhängen können. Daher müssen Sie jetzt die Abhängigkeiten ermitteln.
Ein naiver Ansatz, der oft funktioniert, ist:
Die genauere Methode ist jedoch, den
ldd
Suchpfad / Cache zu verstehen . Ich denke, dasldconfig
ist der richtige Weg.Wähle einen aus und wiederhole:
Beispielausgabe:
Und so weiter.
Siehe auch:
/proc/<pid>/maps
zum Ausführen von ProzessenDies wird von Basile erwähnt und ist nützlich, um alle Bibliotheken zu finden, die derzeit zum Ausführen von ausführbaren Dateien verwendet werden. Z.B:
zeigt alle aktuell geladenen dynamischen Abhängigkeiten von
init
(PID1
) an:Diese Methode zeigt auch Bibliotheken an
dlopen
, die mit diesem minimalen Setup geöffnet wurden , das mitsleep(1000)
Ubuntu 18.04 gehackt wurde .Siehe auch: Wie werden die aktuell geladenen freigegebenen Objekte in Linux angezeigt? | Super User
quelle
ldd und lsof zeigen die Bibliotheken an, die entweder direkt oder zu einem bestimmten Zeitpunkt geladen wurden . Sie berücksichtigen nicht die Bibliotheken, die über geladen
dlopen
(oder von verworfendlclose
) wurden. Sie können sich ein besseres Bild davon machen, indem Siestrace
z.(da
dlopen
letztendlich Anrufeopen
- obwohl man natürlich ein System haben kann, das unterschiedliche Namen für 64-Bit-Öffnungen verwendet ...).Beispiel:
zeigt mir das:
von dem aus man die ".so" -Namen abrufen kann, um nur gemeinsam genutzte Objekte zu sehen.
quelle
strace -e trace=open,openat myprogram
/proc/<pid>/maps
zeigt auchdlopen
libs btw: unix.stackexchange.com/questions/120015/… Dieltrace -S
Ausgabe ist sogar noch cooler, da sowohl Systemaufrufe als auch Bibliotheksaufrufe wie folgt angezeigt werdendlopen
: unix.stackexchange.com/questions/226524/…lsof kann Ihnen auch zeigen, welche Bibliotheken für einen bestimmten Prozess verwendet werden.
dh
quelle
Für einen Prozess von pid 1234 können Sie auch die
/proc/1234/maps
(textuelle) Pseudodatei lesen (read proc (5) ...) oder pmap (1) verwenden.Dies gibt den virtuellen Adressraum dieses Prozesses an, daher die Dateien (einschließlich der gemeinsam genutzten Bibliotheken, sogar die mit dlopen (3) bezeichneten ), die dem Speicher zugeordnet sind
(Verwenden Sie
ps aux
oder pgrep (1) , um die Prozesse zu finden, auf denen ein bestimmtes Programm ausgeführt wird.)quelle
Für Massenabfragen:
Erstellen Sie ein kleines Skript (
useslib
) und fügen Sie es in den Pfad ein (oder geben Sie einen vollständigen Pfad im folgenden Befehl an).Verwenden Sie es in einem
find
Befehl, zum Beispiel:(libgtk-x11-2.0 scheint die gtk2-lib zu sein)
quelle
Es ist möglich zu verwenden
pmap
.Starten Sie zum Beispiel einen Prozess:
$ watch date
Erhalten Sie pid:
$ ps -ef | grep watch
Speicherkarte anzeigen:
$ pmap <pid>
Zeige mit vollem Pfad:
$ pmap <pid> -p
quelle