2008-11-12 13 views
5

Si tiene en mente una línea particular de código C para examinar en la salida de la máquina, cómo lo ubicaría en la salida objdump. Aquí hay un ejemploEncontrar ubicaciones en el código de máquina (gcc/objdump -d)

if (cond) 
    foo; 
    bar(); 

y quiero ver si la barra estaba en línea como me gustaría. ¿O usaría alguna herramienta alternativa en lugar de objdump?

Respuesta

7

Puede iniciar objdump con la opción -S (como "objdump -Sd a.out"). Mostrará el código fuente entremezclado con el código del ensamblador, si los archivos fuente del que se compiló el código están disponibles.

Como alternativa, puede utilizar la siguiente manera:

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

convierte

 .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 implica -d. No necesita especificar ambos. :-P –

+0

Oh, correcto. Aunque me gusta ser prolijo. Uno podría preguntarse si -D o -d es el predeterminado. Esto hace que sea seguro para el cerebro muerto: p –

1

Si estás compilando con gcc, puede utilizar -S para generar un archivo de ensamblaje directamente. Este archivo generalmente contiene información útil, incluidos nombres de funciones y, a veces, números de línea para el código (según las opciones de compilación que utilice).

+0

También puede usar -save-temps para compilar y generar el archivo de ensamblaje (y otros) como subproducto. – CesarB

2

Su depurador también debería permitirle ver el código fuente y el conjunto correspondiente si compiló con símbolos de depuración. Esta es la opción gcc -g y gdb disass comando.

0

Las llamadas a funciones se detectan en el conjunto mediante el prólogo de función común.

Con i386 es

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

con AMD64/x86_64 es similar (sólo el prefijo de cuatro 48):

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

Así que cuando detectan que el interior de su objdump -S bla.o o gcc bla.c -g -fsave-temps -fverbose-asm de salida de su función principal y para la barra también, la barra no está en línea. También cuando main tiene una llamada o salta a la barra, no está en línea.

En su caso podría ver si la barra tiene vars locales, que necesita espacio en la pila local. Si la barra está en línea, el ajuste de la pila (por ejemplo, sub $0x8,%esp) se realiza inmediatamente después del prólogo principal, main podría acceder a esa var. Si no es privado, a la barra.

Cuestiones relacionadas