どうすればこれを実現できるのでしょうか?
何かがどのようにコンパイルされるかを分析したい場合、生成されたアセンブリ コードを取得するにはどうすればよいでしょうか?
ベストアンサー1
使用-Sオプションgcc
(またはg++
)(オプション)-fverbose-asmデフォルトでうまく機能する-O0C 名を asm オペランドにコメントとして添付します。これは、通常、asm を注目に値するものにするために使用する最適化レベルでは、あまりうまく機能しません。
gcc -S helloworld.c
これはhelloworld.cに対してプリプロセッサ(cpp)を実行し、初期コンパイルを実行してからアセンブラが実行される前に停止します。この場合に使用する便利なコンパイラオプションについては、以下を参照してください。GCC/clang アセンブリ出力から「ノイズ」を除去するにはどうすればよいでしょうか?(または、コードを確認するだけですMatt Godbolt のオンライン コンパイラ エクスプローラーディレクティブなどをフィルタリングし、デバッグ情報を使用してソース行と asm を一致させるための強調表示を行います。
デフォルトでは、ファイル が出力されますhelloworld.s
。出力ファイルは、-oオプション、-o -
書き込みを含む標準出力パイプ用少ない。
gcc -S -o my_asm_output.s helloworld.c
もちろん、これは元のソースがある場合にのみ機能します。結果のオブジェクトファイルしかない場合は、代わりに次の方法を使用します。オブジェクトダンプオプションを設定することで--disassemble
(または-d
省略形の場合は )。
objdump -S --disassemble helloworld > helloworld.dump
-S
通常の逆アセンブリ出力とソース行をインターリーブするため、このオプションはオブジェクトファイルに対してデバッグオプションが有効になっている場合に最適に機能します(-gコンパイル時に)、ファイルはストリップされていません。
を実行すると、 objdump をfile helloworld
使用して取得される詳細レベルがいくらかわかります。
その他の便利なobjdump
オプションには、-rwC
(シンボルの再配置を表示したり、長いマシンコードの行折り返しを無効にしたり、C++ の名前をデマングルしたりする) があります。また、x86 の AT&T 構文が気に入らない場合は、 を参照してください-Mintel
。マニュアルページ。
たとえば、リンクされた実行可能ファイルとは対照的に、シンボル参照用のプレースホルダーのみを持つでは、 objdump -drwC -Mintel -S foo.o | less
.-r
は非常に重要です。.o
00 00 00 00