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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top