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.
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
Linux 101-Prüfungsvorbereitung: Verwalten freigegebener Bibliotheken