7

以下を使用して、コンパイラによって生成されたアセンブラソースコードを取得できることを知っています。

gcc -S ...

面倒なことに、プロセスの一部としてオブジェクトファイルが提供されません。

しかし、コンパイルされたコードに関するすべてを取得するにはどうすればよいでしょうか? アドレス、生成されたバイトなどを意味します。

によって出力された命令gcc -Sは、命令の長さやエンコーディングについて何も教えてくれません。これは私が見たいものです。

4

5 に答える 5

11

objdumpはこれが好きですが、最も便利なオプションは明白ではありません。特に、最終的なバイナリではなく、再配置を含むオブジェクトファイルで使用している場合はそうです。

objdump -d some_binary合理的な仕事をします。

objdump -d some_object.o外部関数の呼び出しが逆アセンブルされないため、あまり役に立ちません。

...
00000005 <foo>:
   5:   55                      push   %ebp
   6:   89 e5                   mov    %esp,%ebp
   8:   53                      push   %ebx
...
  29:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
  30:   e8 fc ff ff ff          call   31 <foo+0x2c>
  35:   89 d8                   mov    %ebx,%eax
...

call実際には...フラグをprintf()追加するとそれが役立ちます。-rそれは移転を示します。 objdump -dr some_object.o与えます:

...
  29:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
                        2c: R_386_32    .rodata.str1.1
  30:   e8 fc ff ff ff          call   31 <foo+0x2c>
                        31: R_386_PC32  printf
...

次に、各行に として注釈が付けられているのを確認すると便利です<symbol+offset>objdumpそのための便利なオプションがありますが、実際のバイトのダンプをオフにするという厄介な副作用があります-objdump --prefix-addresses -dr some_object.o与える:

...
00000005 <foo> push   %ebp
00000006 <foo+0x1> mov    %esp,%ebp
00000008 <foo+0x3> push   %ebx
...

しかし、別のあいまいなオプションを提供することでそれを元に戻すことができることが判明し、最終的に私のお気に入りのobjdump呪文にたどり着きました。

objdump --prefix-addresses --show-raw-insn -dr file.o

次のような出力が得られます。

...
00000005 <foo> 55                       push   %ebp
00000006 <foo+0x1> 89 e5                        mov    %esp,%ebp
00000008 <foo+0x3> 53                           push   %ebx
...
00000029 <foo+0x24> c7 04 24 00 00 00 00        movl   $0x0,(%esp)
                        2c: R_386_32    .rodata.str1.1
00000030 <foo+0x2b> e8 fc ff ff ff              call   00000031 <foo+0x2c>
                        31: R_386_PC32  printf
00000035 <foo+0x30> 89 d8                       mov    %ebx,%eax
...

また、デバッグ シンボルを使用してビルドした場合 (つまり、 でコンパイルした-g場合)、 を に置き換える-dr-Srl、対応するソース行で出力に注釈を付けようとします。

于 2010-09-07T23:27:31.650 に答える
3

クイック リストを取得する最も簡単な方法は-a、アセンブラのオプションを使用することです。これ-Wa,-aは、gccコマンド ラインに入力することで実行できます。a オプションにさまざまな修飾子を使用して、結果に正確に影響を与えることができます -- as(1) man ページを参照してください。

于 2010-09-08T00:27:48.853 に答える
1

逆アセンブラが必要なようです。 objdumpほぼ標準です(otoolMac OS X上)。リンカーが提供するマップ ファイル情報と合わせて、オブジェクト ファイルを逆アセンブルすると、必要なものがすべて得られるはずです。

于 2010-09-07T03:53:20.277 に答える
1

gcc は、アセンブリ言語のソース ファイルを生成します。次に、 を使用as -a yourfile.Sして、各命令のオフセットとエンコードされたバイトを含むリストを生成できます。-aまた、リスト ファイルに表示される内容を制御するためのサブオプションがいくつかあります (as --help他の使用可能なオプションとともにそれらのリストが表示されます)。

于 2010-09-07T03:53:25.427 に答える
0
nasm -f elf xx.asm -l x.lst

gcc xx.c xx.o -o xx

xx.asm 専用の「リスト」ファイル x.lst を生成します

xx.c と xx.asm の場合、両方をコンパイルしてから 'gdb' - gnu デバッガーを使用できます

于 2010-09-07T21:55:23.507 に答える