2008-11-12 4 views
5

Si vous souhaitez examiner une ligne particulière de code C dans la sortie machine, comment la localiseriez-vous dans la sortie objdump? Voici un exempleRecherche d'emplacements dans le code machine (gcc/objdump -d)

if (cond) 
    foo; 
    bar(); 

et je veux voir si la barre a été insérée comme je le voudrais. Ou utiliseriez-vous un autre outil au lieu d'objdump?

Répondre

7

Vous pouvez démarrer objdump en utilisant l'option -S (comme "objdump -Sd a.out"). Il affichera le code source intermixxé avec le code de l'assembleur, si les fichiers sources dont le code a été compilé sont disponibles.

Vous pouvez également utiliser de la manière suivante:

int main(void) { 
    int a = 0; 
    asm("#"); 
    return a; 
} 

devient

 .file "a.c" 
     .text 
.globl main 
     .type main, @function 
main: 
     leal 4(%esp), %ecx 
     andl $-16, %esp 
     pushl -4(%ecx) 
     pushl %ebp 
     movl %esp, %ebp 
     pushl %ecx 
     subl $16, %esp 
     movl $0, -8(%ebp) 
#APP 
# 3 "a.c" 1 
     # 
# 0 "" 2 
#NO_APP 
     movl -8(%ebp), %eax 
     addl $16, %esp 
     popl %ecx 
     popl %ebp 
     leal -4(%ecx), %esp 
     ret 
     .size main, .-main 
     .ident "GCC: (GNU) 4.3.2" 
     .section  .note.GNU-stack,"",@progbits 
+2

-S implique -d. Vous n'avez pas besoin de spécifier les deux. :-P –

+0

Oh, c'est vrai. Tho j'aime être verbeux. On pourrait se demander si -D ou -d est la valeur par défaut. Cela rend le cerveau mort sûr: p –

1

Si vous compilez avec gcc, vous pouvez utiliser -S pour générer un fichier de montage directement. Ce fichier contient généralement des informations utiles, y compris des noms de fonctions et parfois des numéros de ligne pour le code (en fonction des options de compilation que vous utilisez).

+0

Vous pouvez également utiliser -save-temps pour compiler et générer le fichier d'assemblage (et d'autres) en tant que sous-produit. – CesarB

2

Vous débogueur devrait également vous permettre de voir le code source et l'assembly correspondant si vous avez compilé avec les symboles de débogage. C'est l'option gcc -g et gdb disass commande.

0

Les appels de fonction sont détectés dans l'ensemble par le prologue de fonction commune.

Avec i386 il est

55  push %ebp 
    89 e5 mov %esp, %ebp 
    ... 
    c9  leave # optional 
    c3  ret 

avec amd64/x86_64 est similaire (juste le préfixe quad 48):

55     push %rbp 
    48 89 e5    mov %rsp,%rbp 
    .. 
    c9     leaveq # optional 
    c3     retq 

Alors, quand vous constatez que l'intérieur de votre objdump -S bla.o ou gcc bla.c -g -fsave-temps -fverbose-asm sortie de votre fonction principale et pour la barre également, la barre n'est pas inline. En outre, lorsque le principal a un appel ou un saut à la barre, il n'est pas inséré.

Dans votre cas, vous pouvez voir si la barre a des variables locales, ce qui nécessite de l'espace sur la pile locale. Si la barre est en ligne, l'ajustement de la pile (par exemple sub $0x8,%esp) est effectué juste après le prologue principal, principal peut accéder à cette variable. Sinon, il est privé à la barre.

Questions connexes