如果您在機器輸出中考慮了特定的C代碼行,您將如何在objdump輸出中找到它。這裏是一個例子查找機器代碼中的位置(gcc/objdump -d)
if (cond)
foo;
bar();
我想看看,如果酒吧內聯,因爲我想。 或者你會使用一些替代工具而不是objdump?
如果您在機器輸出中考慮了特定的C代碼行,您將如何在objdump輸出中找到它。這裏是一個例子查找機器代碼中的位置(gcc/objdump -d)
if (cond)
foo;
bar();
我想看看,如果酒吧內聯,因爲我想。 或者你會使用一些替代工具而不是objdump?
您可以使用-S
選項(如"objdump -Sd a.out"
)啓動objdump。如果代碼編譯的源文件可用,它將顯示與彙編代碼混合的源代碼。
或者,您可以使用以下方法:
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
如果你正在用gcc編譯,你可以使用-S直接生成彙編文件。該文件通常包含一些有用的信息,包括函數名稱和代碼的行號(取決於您使用的編譯選項)。
如果使用調試符號進行編譯,則調試器還應該讓您看到源代碼和匹配程序集。這是gcc選項-g和gdb disass命令。
通用函數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
輸出內你的主要功能 和酒吧也不,欄不內聯。此外,當主要呼叫或跳轉 禁止它不內聯。
在你的情況下,你可以看到如果酒吧有本地變量,這需要在本地棧上的空間 。如果bar被內聯,堆棧調整(例如sub $0x8,%esp
) 在主序列之後完成,main可以訪問該var。 如果不是,它是私人的酒吧。
-S意味着-d。你不需要指定兩者。 :-P – 2008-11-12 03:43:45
哦,對。我喜歡冗長。人們可能會想知道-D還是-d是默認設置。這使得它可以安全無憂:p – 2008-11-12 03:48:27