如果您想在机器输出中检查特定的C代码行,那么如何在objdump输出中找到它。这是一个例子
if (cond)
foo;
bar();
我想看看栏是否按照我的意愿内联。 或者你会使用一些替代工具而不是objdump?
答案 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。
如果不是,它是私人的吧。