Il y a des moments où vous souhaitez déterminer si un symbole particulier est utilisé dans votre environnement d'exécution actuel lors du débogage. (Lorsque vous voulez accrocher une fonction spécifique avec LD_PRELOAD, etc. => Référence: Remplacez printf plus tard par LD_PRELOAD --Qiita)
La méthode d'enquête dans ce cas est résumée.
En gros, j'utilise juste ldd
et readelf
, mais j'en ai fait un outil parce que c'était un gros problème.
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
J'obtiens les bibliothèques dépendantes avec ldd
, mais ld-linux * .so
et Linux Virtual Dynamic Shared Objects
(Reference library / l-lpic1-102-3 /)) est exclue.
Vous pouvez également obtenir le symbole avec «nm», mais s'il s'agit de «strip», le symbole ne sera pas visible, donc cette fois nous utilisons «readelf».
L'exemple d'exécution est le suivant.
Cette fois, la cible est / usr / bin / weston
, et la cible de recherche est ʻeglSwapBuffers`.
Résultat d'exécution
$ ./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
C'est très simple, mais j'ai pu découvrir qu'il y a des symboles dans libEGL
, qui implémente weston
et ʻeglSwapBuffers` dans le corps.
Le script est également publié ci-dessous. (Je prévois de l'écrire en python pour le rendre un peu plus facile à utiliser) https://github.com/koara-local/elf_symbol_searcher
TODO
Ce qui précède peut également être utilisé à des fins de débogage, mais ce serait bien si vous pouviez rechercher un peu plus en détail.
Tel
Préparation à l'examen Linux 101: Gestion des bibliothèques partagées
Recommended Posts