[LINUX] Überprüfen Sie, ob die ausführbare Datei und ihre abhängigen Bibliotheken ein bestimmtes Symbol enthalten (vereinfachte Version).

Zweck

Es gibt Zeiten, in denen Sie beim Debuggen feststellen möchten, ob in Ihrer aktuellen Ausführungsumgebung ein bestimmtes Symbol verwendet wird. (Wenn Sie eine bestimmte Funktion mit LD_PRELOAD usw. verknüpfen möchten => Referenz: printf später durch LD_PRELOAD --Qiita ersetzen)

Die Untersuchungsmethode in diesem Fall ist zusammengefasst.

Ausführungsquelle

Grundsätzlich benutze ich nur "ldd" und "readelf", aber ich habe es zu einem Werkzeug gemacht, weil es eine große Sache war.

elf_symbol_searcher.sh


#!/bin/bash

APP=$1
SYMBOL=$2

LIST=$(echo $APP; ldd $APP \
    | grep -v -E 'ld-linux*.so' \
    | grep -v 'linux-vdso.so' \
    | grep -v 'linux-gate.so' \
    | awk '{print $3}')

for f in $LIST
do
    echo $f
    readelf -s -W $f | grep $SYMBOL
done

Ich erhalte die abhängigen Bibliotheken mit "ldd", aber "ld-linux * .so" und "Linux Virtual Dynamic Shared Objects" (Referenz. Bibliothek / l-lpic1-102-3 /)) ist ausgeschlossen. Sie können das Symbol auch mit "nm" abrufen. Wenn es sich jedoch um "strip" handelt, ist das Symbol nicht sichtbar. Daher verwenden wir dieses Mal "readelf".

Das Ausführungsbeispiel lautet wie folgt. Dieses Mal ist das Ziel "/ usr / bin / weston" und das Suchziel "eglSwapBuffers".

Ausführungsergebnis


$ ./elf_symbol_searcher.sh /usr/bin/weston eglSwapBuffers
/usr/bin/weston
   166: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND eglSwapBuffers
/usr/lib/x86_64-linux-gnu/libwayland-server.so.0
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0
/usr/lib/x86_64-linux-gnu/mesa-egl/libEGL.so.1
   180: 0000000000006fb0   380 FUNC    GLOBAL DEFAULT   11 eglSwapBuffersRegionNOK
   187: 0000000000009850   339 FUNC    GLOBAL DEFAULT   11 eglSwapBuffers
   235: 00000000000079e0   427 FUNC    GLOBAL DEFAULT   11 eglSwapBuffersWithDamageEXT
/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.2
/usr/lib/x86_64-linux-gnu/libxkbcommon.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libm.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libffi.so.6
/lib/x86_64-linux-gnu/librt.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/usr/lib/x86_64-linux-gnu/libX11-xcb.so.1
/usr/lib/x86_64-linux-gnu/libX11.so.6
/usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0
/usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0
/usr/lib/x86_64-linux-gnu/libxcb.so.1
/usr/lib/x86_64-linux-gnu/libwayland-client.so.0
/usr/lib/x86_64-linux-gnu/libgbm.so.1
/usr/lib/x86_64-linux-gnu/libdrm.so.2
/usr/lib/x86_64-linux-gnu/libglapi.so.0
/usr/lib/x86_64-linux-gnu/libXau.so.6
/usr/lib/x86_64-linux-gnu/libXdmcp.so.6

Es ist sehr einfach, aber ich konnte herausfinden, dass es in "libEGL" Symbole gibt, die "weston" und "eglSwapBuffers" im Körper implementieren.

Das Skript wird auch unten veröffentlicht. (Ich habe vor, es in Python zu schreiben, um die Verwendung zu vereinfachen.) https://github.com/koara-local/elf_symbol_searcher

TODO

Das Obige kann auch für Debugging-Zwecke verwendet werden, aber es wäre schön, wenn Sie etwas detaillierter suchen könnten.

Eine solche

Referenz

Linux 101-Prüfungsvorbereitung: Verwalten freigegebener Bibliotheken

Recommended Posts

Überprüfen Sie, ob die ausführbare Datei und ihre abhängigen Bibliotheken ein bestimmtes Symbol enthalten (vereinfachte Version).
[Golang] Überprüfen Sie, ob eine bestimmte Zeichenfolge in der Zeichenfolge enthalten ist
Wenn verzweigen, hängt davon ab, ob die Liste ein bestimmtes Element enthält
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Wenn in boto3 der Fehler no attribute angezeigt wird, überprüfen Sie die Version
Ich möchte die Einstellungsdatei erhalten und prüfen, ob die von jinja2 generierte JSON-Datei eine gültige JSON ist
Ich habe ein Skript erstellt, um zu überprüfen, ob an der angegebenen Position der JSON-Datei in Python Englisch eingegeben wird.
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
Überprüfen Sie, ob es sich um Unix in der Skriptsprache handelt
Überprüft, ob für alle Dateien im Verzeichnis Python eine bestimmte Zeichenfolge vorhanden ist, und gibt die Zielzeile aus
Beim Lesen eines Bildes mit SimpleITK tritt ein Problem auf, wenn sich Japanisch im Pfad befindet
[Sublime Text 2] Führen Sie immer eine bestimmte Datei im Projekt aus
Speichern Sie das Pystan-Modell und erhalten Sie eine Pickle-Datei
Gibt es eine Verzerrung in den Zahlen, die in den Fibonacci-Zahlen erscheinen?
Was tun, wenn Sie eine Binärdatei katzen oder verfolgen und das Terminal verstümmelt ist?
Ich habe eine Funktion erstellt, um zu überprüfen, ob der Webhook vorerst in Lambda empfangen wird
Python schlägt fehl, wenn nach dem Backslash ein Leerzeichen steht
[Blender] Skript zum Überprüfen, ob es sich bei dem ausgewählten um ein Netz handelt
Auf jeden Fall bleibt das schnellste serielle Kommunikationsprotokoll in der Datei
Löschen Sie ein bestimmtes Zeichen in Python, wenn es das letzte ist
Zählen Sie bestimmte Zeichenfolgen in einer Datei
Gibt es ein besonderes in scipy? ??
Was tun, wenn in python json .dumps eine Dezimalstelle enthalten ist?
Ersetzen Sie den Verzeichnisnamen und den Dateinamen im Verzeichnis zusammen mit einem Linux-Befehl.
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen