gdb disassemble/rs
pour afficher également les octets source et bruts
Avec ce format, il se rapproche vraiment de la objdump -S
sortie:
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
principal c
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
Compiler et démonter
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Démontage:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
Testé sur Ubuntu 16.04, GDB 7.11.1.
objdump + awk solutions de contournement
Imprimez le paragraphe comme indiqué sur: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the- paragraph- that - has- the -texte
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
par exemple:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
donne juste:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
Lors de l'utilisation -S
, je ne pense pas qu'il existe un moyen infaillible, car les commentaires de code pourraient contenir n'importe quelle séquence possible ... Mais ce qui suit fonctionne presque tout le temps:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
adapté de: Comment sélectionner des lignes entre deux motifs de marqueurs qui peuvent se produire plusieurs fois avec awk / sed
Réponses à la liste de diffusion
Il y a un fil de discussion 2010 sur la liste de diffusion qui dit que ce n'est pas possible: https://sourceware.org/ml/binutils/2010-04/msg00445.html
Outre la gdb
solution de contournement proposée par Tom, ils commentent également une autre (pire) solution de contournement de compilation avec -ffunction-section
laquelle met une fonction par section, puis vidage de la section.
Nicolas Clifton lui a donné un WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html , probablement parce que la solution de contournement GDB couvre ce cas d'utilisation.
static
, elle peut être intégrée par le compilateur dans ses sites d'appels. Cela peut signifier qu'il n'y a peut-être aucune fonction à démonter en soi . Si vous pouvez repérer des symboles pour d'autres fonctions, mais pas la fonction que vous recherchez, cela indique clairement que la fonction a été incorporée. Valgrind peut toujours faire référence à la fonction pré-intégrée d'origine car les informations de débogage du fichier ELF stockent l'origine de chaque instruction individuelle, même si les instructions sont déplacées ailleurs.