Pregunta

Si tiene en mente una línea particular de código C para examinar en la salida de la máquina, ¿cómo la ubicaría en la salida de objdump? Aquí hay un ejemplo

if (cond)
   foo;
   bar();

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

¿Fue útil?

Solución

Puede iniciar objdump usando 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 de los que se compiló el código están disponibles.

Alternativamente, puede usar la siguiente manera:

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

se 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    <*>, -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

Otros consejos

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

Si está compilando con gcc, puede usar -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).

Las llamadas de función se detectan en el ensamblado 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 (solo el prefijo cuádruple 48 ):

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

Entonces, cuando detecta eso dentro de su objdump -S bla.o o gcc bla.c -g -fsave-temps -fverbose-asm 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 salto para bloquear no está en línea.

En su caso, podría ver si el bar 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 justo después del prólogo principal, main podría acceder a esa var. Si no, es privado para bar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top