在机器代码中查找位置(gcc / objdump -d)

时间:2008-11-12 03:12:28

标签: c gcc objdump object-code

如果您想在机器输出中检查特定的C代码行,那么如何在objdump输出中找到它。这是一个例子

if (cond)
   foo;
   bar();

我想看看栏是否按照我的意愿内联。 或者你会使用一些替代工具而不是objdump?

4 个答案:

答案 0 :(得分:7)

您可以使用-S选项启动objdump(例如"objdump -Sd a.out")。如果编译代码的源文件可用,它将显示与汇编代码混合的源代码。

或者,您可以使用以下方式:

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

成为

       .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

答案 1 :(得分:2)

如果使用调试符号编译,调试器还应该让您看到源代码和匹配程序集。这是gcc选项-g和gdb disass命令。

答案 2 :(得分:1)

如果您正在使用gcc进行编译,则可以使用-S直接生成程序集文件。该文件通常包含一些有用的信息,包括函数名称和有时代码的行号(取决于您使用的编译选项)。

答案 3 :(得分:0)

通过公共函数prolog在程序集中检测函数调用。

使用i386

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

与amd64 / x86_64类似(只是四前缀48):

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

所以当你在objdump -S bla.o内发现 要么 主函数的gcc bla.c -g -fsave-temps -fverbose-asm输出 而对于酒吧,酒吧没有内联。当主要有一个电话或跳跃时 禁止内联。

在您的情况下,您可以看到酒吧是否有本地变量,需要空间 本地堆栈。如果栏内联,则调整堆栈(例如sub $0x8,%esp) 在主要prolog之后完成,main可以访问该var。 如果不是,它是私人的吧。