5

マシン出力で調べる C コードの特定の行がある場合、それを objdump 出力でどのように見つけますか。ここに例があります

if (cond)
   foo;
   bar();

bar が希望どおりにインライン化されているかどうかを確認したい。それとも、objdump の代わりに別のツールを使用しますか?

4

4 に答える 4

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
于 2008-11-12T03:30:51.683 に答える
2

デバッグシンボルを使用してコンパイルした場合、デバッガーはソースコードと一致するアセンブリも表示できるようにする必要があります。これはgccオプション-gおよびgdbdisassコマンドです。

于 2008-11-12T07:02:52.567 に答える
1

gcc でコンパイルしている場合は、-S を使用してアセンブリ ファイルを直接生成できます。このファイルには通常、関数名やコードの行番号などの有用な情報が含まれています (使用するコンパイル オプションによって異なります)。

于 2008-11-12T03:56:30.290 に答える
0

関数呼び出しは、共通関数プロローグによってアセンブリで検出されます。

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,%espbar がインライン化されている場合、メイン プロローグの直後にスタック調整 (例: ) が実行され、メインはその var にアクセスできます。そうでない場合は、バー専用です。

于 2010-08-29T21:07:22.777 に答える