以下を使用して、コンパイラによって生成されたアセンブラソースコードを取得できることを知っています。
gcc -S ...
面倒なことに、プロセスの一部としてオブジェクトファイルが提供されません。
しかし、コンパイルされたコードに関するすべてを取得するにはどうすればよいでしょうか? アドレス、生成されたバイトなどを意味します。
によって出力された命令gcc -S
は、命令の長さやエンコーディングについて何も教えてくれません。これは私が見たいものです。
私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
、対応するソース行で出力に注釈を付けようとします。
クイック リストを取得する最も簡単な方法は-a
、アセンブラのオプションを使用することです。これ-Wa,-a
は、gcc
コマンド ラインに入力することで実行できます。a オプションにさまざまな修飾子を使用して、結果に正確に影響を与えることができます -- as(1) man ページを参照してください。
逆アセンブラが必要なようです。 objdump
ほぼ標準です(otool
Mac OS X上)。リンカーが提供するマップ ファイル情報と合わせて、オブジェクト ファイルを逆アセンブルすると、必要なものがすべて得られるはずです。
gcc は、アセンブリ言語のソース ファイルを生成します。次に、 を使用as -a yourfile.S
して、各命令のオフセットとエンコードされたバイトを含むリストを生成できます。-a
また、リスト ファイルに表示される内容を制御するためのサブオプションがいくつかあります (as --help
他の使用可能なオプションとともにそれらのリストが表示されます)。
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 デバッガーを使用できます