2010-04-12 3 views

Répondre

4

Vous pouvez utiliser l'utilitaire nm conjointement avec grep pour trouver executables référence le symbole, comme ceci:

 
nm name_of_executable | grep symbol 

Ainsi, par exemple, si j'avais une liste de executables qui pourrait utiliser « strcat », je pouvais vérifier que l'utilisation:

 
for file in exectuble1 executable2 ... executableN; do 
    references_to_strcat=`nm "$file" | grep strcat -c` 
    if [ $references_to_strcat -ne 0 ] ; then 
     echo "$file" 
    fi 
done 

la petite boucle au-dessus (en supposant BASH) imprimerait la liste de tous les fichiers faisant référence à « strcat ». Notez que cela ne vous indiquera que l'exécutable réellement lié au symbole ... il n'y a aucun moyen que je connaisse pour déterminer quels exécutables peuvent référencer la fonction en utilisant le chargement dynamique (par exemple dlopen/dlsym/dlcose). Notez que si vous avez le code source, et pas seulement les exécutables, vous pouvez utiliser Doxygen pour générer un graphe d'appel complet (en plus de la documentation) pour votre code source, donc c'est une autre possibilité.

+0

Vous ne pouvez pas fondamentalement déterminer quels seront les arguments de chaque appel 'dlopen()'. Un programme pourrait en théorie lire les arguments à 'dlopen' de l'entrée standard. – MSalters

+0

@ MSalters, je suis d'accord. C'est pourquoi je ne connais aucun moyen de déterminer quels exécutables référencent la fonction en utilisant le chargement dynamique. En théorie, cependant, on pourrait déterminer si les paramètres de dlopen()/dlsym() sont des constantes de compilation (ou inferrable des constantes de compilation) ou si elles sont générées d'une manière qui dépend de l'entrée de l'utilisateur. Je ne connais pas un bon moyen de le faire, cependant. Dans le cas où il est généré à partir de l'entrée de l'utilisateur, on pourrait aussi théoriquement déterminer si le nom de la fonction particulière peut être construit (la validation empêche-t-elle ce nom), etc. –

0

En tant que variante de Michael Aaron Safyan's answer, vous pouvez utiliser objdump -d pour générer une liste d'assembleurs du fichier. Vous pouvez alors grep -wn déterminer les numéros de ligne dans votre liste d'assemblage où se produit l'appel de fonction souhaité. Une fois que vous avez les numéros de ligne, vous pouvez voir votre liste et déterminer la fonction/routine dans laquelle ils sont appelés/utilisés, et comment ils sont utilisés (appelés, branchés à, poussés sur la pile, ...).

1

strace et ltrace pourrait être utile également.

Questions connexes