Búsqueda de ubicaciones en código de máquina (gcc / objdump -d)
-
08-07-2019 - |
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?
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.