[LINUX] Vérifier s'il y a un symbole spécifique dans le fichier exécutable et ses bibliothèques dépendantes (version simplifiée)

Objectif

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.

Source d'exécution

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

référence

Préparation à l'examen Linux 101: Gestion des bibliothèques partagées

Recommended Posts

Vérifier s'il y a un symbole spécifique dans le fichier exécutable et ses bibliothèques dépendantes (version simplifiée)
[Golang] Vérifiez si une chaîne de caractères spécifique est incluse dans la chaîne de caractères
Si branche en fonction de l'existence ou non d'un élément spécifique dans la liste
Vérifiez si la chaîne est un nombre en python
Si vous obtenez une erreur sans attribut dans boto3, vérifiez la version
Je souhaite recevoir le fichier de configuration et vérifier si le fichier JSON généré par jinja2 est un JSON valide
J'ai créé un script pour vérifier si l'anglais est entré dans la position spécifiée du fichier JSON en Python.
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
Vérifiez s'il s'agit d'Unix dans le langage de script
Vérifiez s'il s'agit d'Unix dans le langage de script
Vérifie s'il existe une chaîne de caractères spécifique pour tous les fichiers sous le répertoire Python et renvoie la ligne cible
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin
[Sublime Text 2] Toujours exécuter un fichier spécifique dans le projet
Enregistrez le modèle pystan et les résultats dans un fichier pickle
Y a-t-il un biais dans les nombres qui apparaissent dans les nombres de Fibonacci?
Que faire si vous chattez ou suivez un fichier binaire et que le terminal est brouillé
J'ai créé une fonction pour vérifier si le webhook est reçu dans Lambda pour le moment
Python échouera s'il y a un espace après la barre oblique inverse
[Blender] Script pour vérifier si celui sélectionné est un mesh
Quoi qu'il en soit, le journal de communication série le plus rapide est laissé dans le fichier
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Compter des chaînes spécifiques dans un fichier
Y a-t-il un spécial dans scipy? ??
Que faire s'il y a un décimal dans python json .dumps
Remplacez le nom du répertoire et le nom du fichier dans le répertoire par une commande Linux.
J'ai fait un programme pour vérifier la taille d'un fichier avec Python