マシン出力で調べる C コードの特定の行がある場合、それを objdump 出力でどのように見つけますか。ここに例があります
if (cond)
foo;
bar();
bar が希望どおりにインライン化されているかどうかを確認したい。それとも、objdump の代わりに別のツールを使用しますか?
マシン出力で調べる C コードの特定の行がある場合、それを objdump 出力でどのように見つけますか。ここに例があります
if (cond)
foo;
bar();
bar が希望どおりにインライン化されているかどうかを確認したい。それとも、objdump の代わりに別のツールを使用しますか?
-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
デバッグシンボルを使用してコンパイルした場合、デバッガーはソースコードと一致するアセンブリも表示できるようにする必要があります。これはgccオプション-gおよびgdbdisassコマンドです。
gcc でコンパイルしている場合は、-S を使用してアセンブリ ファイルを直接生成できます。このファイルには通常、関数名やコードの行番号などの有用な情報が含まれています (使用するコンパイル オプションによって異なります)。
関数呼び出しは、共通関数プロローグによってアセンブリで検出されます。
i386では
55 push %ebp
89 e5 mov %esp, %ebp
...
c9 leave # optional
c3 ret
amd64/x86_64 も同様です (quad プレフィックスのみ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 にローカル var があるかどうかを確認できます。これには、ローカル スタックに余裕が必要です。sub $0x8,%esp
bar がインライン化されている場合、メイン プロローグの直後にスタック調整 (例: ) が実行され、メインはその var にアクセスできます。そうでない場合は、バー専用です。