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
4 Réponses :
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: p> 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. p> par exemple, vous prenant un échantillon et la modifiant légèrement: p> et compilation avec Nous pouvons voir que les deux statiques Les fonctions apparaissent comme une fonction locale et une `normale 'apparaît sur une note globale p> 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. p> p> GCC -O test test.cher.c code> et en regardant la table des symboles (beaucoup d'entrées supprimées): p>
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
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!
Votre question suppose que, étant donné un exécutable, vous pouvez toujours découvrir
Les noms des fonctions code> statiques code> (local) qui ont été compilées,
en utilisant Cependant, cette hypothèse est fausse. Dans le cas de GCC, si les fichiers sont compilés
avec optimisation 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 compilez vos fichiers d'échantillons avec: p> alors a disparu, ainsi que tous les autres noms de fonction statiques. P> 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 em>. p> Si vous auriez em> Contrôler comment l'exécutable est conçu pour garantir que les fichiers sont construits pour garantir
compilé avec et p> chacun répertoriera un nom de fichier source à la tête de chaque morceau de
symboles qui viennent de cela. p> (et si cela a besoin de dire, l'approche nm code> 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.
-O0 code> puis les symboles locaux seront émis dans l'objet
Tableau des symboles de fichier.
-O0 code> est la valeur par défaut, de sorte qu'il s'applique dans le cas de votre: p>
nm code> ou quoi que ce soit d'autre. p>
nm Testez à nouveau code> et vous observerez que le: p>
-O0 code>, 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: p>
gdb code> suggéré par @Amol n'échappe pas à la restriction que l'exécutable doit avoir été compilée avec optimisation < Code> -O0 code>) p> p>
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.
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 code> -Debug-Dump. Similaire --Debug-syms pour
nm code>
Compiler avec
-g code> et utiliser
nm -l code>
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 code> et
CRC32 code> ou similaire, d'abord, d'abord, d'abord sur les fichiers Obj, puis sur le fichier lié.