gcc で C/C++ ソースからアセンブラ出力を取得するにはどうすればよいですか?

-S を使用 gcc (または g++) へのオプション)。

gcc -S helloworld.c

これにより、helloworld.c に対してプリプロセッサ (cpp) が実行され、最初のコンパイルが実行され、アセンブラが実行される前に停止します。

デフォルトでは、これはファイル helloworld.s を出力します .出力ファイルは -o を使用して設定できます オプション。

gcc -S -o my_asm_output.s helloworld.c

もちろん、これは元のソースがある場合にのみ機能します。結果のオブジェクト ファイルしかない場合の代替手段は、objdump を使用することです。 、 --disassemble を設定することにより オプション (または -d 省略形の場合)

objdump -S --disassemble helloworld > helloworld.dump

このオプションは、オブジェクト ファイル (-g) に対してデバッグ オプションが有効になっている場合に最適に機能します。 コンパイル時)、ファイルは削除されていません。

file helloworld を実行中 objdump を使用して得られる詳細レベルについて、ある程度の目安が得られます。


これにより、C コードと行番号が織り交ぜられたアセンブリ コードが生成され、どの行がどのコードを生成するかをより簡単に確認できます。

# create assembler code:
g++ -S -fverbose-asm -g -O2 test.cc -o test.s
# create asm interlaced with source lines:
as -alhnd test.s > test.lst

プログラマー向けのアルゴリズムの 3 ページ (PDF の全体の 15 ページ目) にあります。


次のコマンド ラインは、Christian Garbin のブログからのものです

g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt

暗黙のキャストを含むルーチンに対して、Win-XP の DOS ウィンドウから G++ を実行しました

c:\gpp_code>g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
horton_ex2_05.cpp: In function `int main()':
horton_ex2_05.cpp:92: warning: assignment to `int' from `double'

出力は、元の C++ コードが散在するアセンブルされた生成コードです (C++ コードは、生成された asm ストリーム内のコメントとして表示されます)

  16:horton_ex2_05.cpp **** using std::setw;
  17:horton_ex2_05.cpp ****
  18:horton_ex2_05.cpp **** void disp_Time_Line (void);
  19:horton_ex2_05.cpp ****
  20:horton_ex2_05.cpp **** int main(void)
  21:horton_ex2_05.cpp **** {
 164                    %ebp
 165                            subl $128,%esp
?GAS LISTING C:\DOCUME~1\CRAIGM~1\LOCALS~1\Temp\ccx52rCc.s
166 0128 55                    call ___main
167 0129 89E5          .stabn 68,0,21,LM2-_main
168 012b 81EC8000      LM2:
168      0000
169 0131 E8000000      LBB2:
169      00
170                    .stabn 68,0,25,LM3-_main
171                    LM3:
172                            movl $0,-16(%ebp)