Encontrar locais em código de máquina (gcc / objdump -d)
-
08-07-2019 - |
Pergunta
Se você tem uma determinada linha de código C em mente para analisar na saída da máquina, como você localizá-lo na saída objdump. Aqui está um exemplo
if (cond)
foo;
bar();
e eu quero ver se bar foi embutido como eu gostaria. Ou será que você use alguma ferramenta alternativa em vez de objdump?
Solução
Você pode começar objdump usando a opção -S
(como "objdump -Sd a.out"
). Ele irá exibir o código fonte intermixxed com o código assembler, se a fonte-arquivos do código foi compilado a partir de estão disponíveis.
Como alternativa, você pode usar o seguinte caminho:
int main(void) {
int a = 0;
asm("#");
return a;
}
se torna
.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
Outras dicas
Você depurador também deve deixá-lo ver o código-fonte e combinando montagem se você compilado com símbolos de depuração. Esta é a opção gcc -g e comando gdb disass.
Se você está compilando com gcc, você pode usar -S para gerar um arquivo de montagem diretamente. Este arquivo normalmente tem algumas informações úteis nele, incluindo nomes de função e às vezes números de linhas de código (dependendo das opções de compilação que você usa).
chamadas de função são detectados em conjunto pelo Prolog função comum.
Com i386 é
55 push %ebp
89 e5 mov %esp, %ebp
...
c9 leave # optional
c3 ret
com amd64 / x86_64 é é semelhante (apenas o 48
quad prefixo):
55 push %rbp
48 89 e5 mov %rsp,%rbp
..
c9 leaveq # optional
c3 retq
Assim, quando você detectar que dentro de sua objdump -S bla.o
ou
saída gcc bla.c -g -fsave-temps -fverbose-asm
de sua função principal
e para bar também, bar não está embutido. Além disso, quando principal tem uma chamada ou salto
para bar não é embutido.
No seu caso, você poderia ver se bar tem vars locais, que precisa de espaço em
a pilha local. Se a barra é embutido na pilha ajustar (por exemplo sub $0x8,%esp
)
é feito logo após o prólogo principal, principal poderia acessar esse var.
Se não é privada para barrar.