9
votes

Comment puis-je différencier les fonctions statiques avec la sortie NM ou Lookeonement en C

J'essaie de traiter la sortie d'une nm ou de lookelf -s sur un exécutable. Cependant, j'ai du mal à différencier les fonctions statiques de l'autre dans la sortie.

Voici ce que je travaille avec: p>

test.c strong> p>

00000000004004ed t foo
0000000000400500 t foo


5 commentaires

Pour autant que je sache, les informations de fichier source sont stockées dans des informations de débogage. Binary entièrement dépouillé ne disposera pas de telles informations. Pour la lecture des informations de débogage, consultez lookelf -Debug-Dump. Similaire --Debug-syms pour nm


Compiler avec -g et utiliser nm -l


Je devrais ajouter que pour mon étui d'utilisation, j'ai accès aux fichiers binaires finaux et aux fichiers d'objets utilisés par celui-ci, mais je ne peux pas construire ni garantir des informations de débogage dans le binaire.


Cela pourrait être beaucoup de travail .... Mais peut-être que vous pourriez utiliser «NM -S» pour obtenir des tailles de symboles pour chaque fichier d'objet, puis comparez-le contre «NM -S» pour l'exécutable lié. Bien sûr, cela assume différentes tailles ....


Si des tailles ne sont pas uniques, vous pouvez utiliser objdump et CRC32 ou similaire, d'abord, d'abord, d'abord sur les fichiers Obj, puis sur le fichier lié.


4 Réponses :


2
votes

Vous devrez peut-être lire la table des symboles elfe et extraire la valeur elf32_st_bind.

Selon la spécification ELF (voir http://flint.cs.yale.edu/cs422/doc/elf_format.pdf ) Les valeurs de elf32_st_bind peuvent être: xxx

où stb_local est défini comme "les symboles locaux ne sont pas visibles en dehors du fichier d'objet contenant leur définition. Les symboles locaux du même nom peuvent exister dans plusieurs fichiers sans interférer les uns avec les autres." qui semblent correspondre assez bien aux fonctions statiques C.

par exemple, vous prenant un échantillon et la modifiant légèrement: xxx

et compilation avec GCC -O test test.cher.c et en regardant la table des symboles (beaucoup d'entrées supprimées): xxx

Nous pouvons voir que les deux statiques Les fonctions apparaissent comme une fonction locale et une `normale 'apparaît sur une note globale

REMARQUE: Bien que cette méthode fonctionnera avec des fichiers non débogés, si le fichier final est dépouillé, nous ne pouvons pas utiliser cette méthode.


0 commentaires

3
votes

J'ai essayé de suivre la séquence suivante.

Si vous avez un fichier de sortie dénudé sans symboles de débogage, sans symboles gdb code> Vous pouvez créer un fichier d'objet. Suivez les commandes ci-dessous: p>

[ 8] t 0x80483b4 foo section .text  test.c
[ 9] T 0x80483c3 main section .text  other.c
[10] t 0x80483c8 foo section .text  other.c


1 commentaires

Merci pour la réponse. J'aurais probablement dû mentionner que je veux que ma méthode adopte une exécutable arbitraire, une table des symboles pourrait même être omise et la méthode devrait toujours fonctionner. Cependant, lors de la visualisation de votre réponse et de plusieurs autres, je ne pense pas que cela soit possible. Merci encore!



11
votes

Votre question suppose que, étant donné un exécutable, vous pouvez toujours découvrir Les noms des fonctions statiques (local) qui ont été compilées, en utilisant nm ou un autre outil. Ainsi, vous pourrez voir quand deux ou plus de tels noms sont les mêmes et de soulever la question de savoir comment découvrir Quels fichiers sources ont été compilés.

Cependant, cette hypothèse est fausse. Dans le cas de GCC, si les fichiers sont compilés avec optimisation -O0 puis les symboles locaux seront émis dans l'objet Tableau des symboles de fichier. -O0 est la valeur par défaut, de sorte qu'il s'applique dans le cas de votre: xxx

mais si les fichiers sont compilés à un niveau d'optimisation plus élevé - comme ils certainement sera pour une version de déverrouillage - alors les symboles locaux sont omis de l'objet Table des symboles de fichiers. Donc, la liaison ne les voit jamais même. Donc, vous ne pouvez pas récupérer à partir de l'exécutable avec nm ou quoi que ce soit d'autre.

compilez vos fichiers d'échantillons avec: xxx

alors nm Testez à nouveau et vous observerez que le: xxx

a disparu, ainsi que tous les autres noms de fonction statiques.

in Ce cas, si vous dites que vous ne pouvez pas contrôler la manière dont l'exécutable est construit, Ensuite, vous ne pouvez pas vous assurer que c'est même possible pour votre question de se présenter .

Si vous auriez Contrôler comment l'exécutable est conçu pour garantir que les fichiers sont construits pour garantir compilé avec -O0 , puis il y a plusieurs façons dans lesquelles vous pouvez attacher le Noms de fonction statique aux fichiers source. Deux tout aussi simples seraient les suivants: xxx

et xxx

chacun répertoriera un nom de fichier source à la tête de chaque morceau de symboles qui viennent de cela.

(et si cela a besoin de dire, l'approche gdb suggéré par @Amol n'échappe pas à la restriction que l'exécutable doit avoir été compilée avec optimisation < Code> -O0 )


0 commentaires

0
votes

Si cela devrait fonctionner sur tout exécutable dépouillé, vous pouvez implanter une chaîne dans les fonctions et les rechercher dans l'exécutable. xxx


0 commentaires