コンパイルの途中の段階で止めてみる
ここでhello.cについて、コンパイル途中の各ファイルの中身の移り変わりを見てみましょう(図3.2)。ただし、プリプロセッサを通った直後のファイルについては、stdio.hの展開結果が長く複雑になるため、図では省略しています。
コンパイルの途中の段階で止めるためのgccのオプションは次のとおりです。
gcc -E | プリプロセッサを通った段階で止める(出力は標準出力) |
gcc -S | アセンブラのソースの段階で止める |
gcc -c | リロケータブルオブジェクトファイルの段階で止める |
gcc | 最後までコンパイルする |
図3.2からは、hello.c→hello.s→hello.o→helloというようにファイルが変換されてコンパイルが行われている様子がわかります。
hello.sのアセンブラのソースの段階まではテキストファイルであり、そのまま中身を表示することができます。それ以降の、リロケータブルオブジェクトファイルのhello.oと実行バイナリファイルのhelloはバイナリファイルのため、GNU binutilsに含まれるobjdumpという一種の逆アセンブラを使って表示しています。
なお、ここではgccに、最適化オプションの「-O2」のほかに、別の最適化オプションのひとつである-fomit-frame-pointerを付け、アセンブラのコードがさらに小さくなるようにしています。
lddコマンドでライブラリを確認
コンパイル済みの実行バイナリファイルは、libc(標準ライブラリ関数)とリンクして動作するようになっています。libcは共有ライブラリであり、libcとのリンクは実行バイナリファイルの実行時に動的に行われます。
実行バイナリファイルが実際にどのライブラリとリンクしているかは、図3.3の実行例のように、lddコマンドを使って確認することができます。
OS環境によってはlibcのほか、いくつかのシステムで必要なライブラリともリンクされている場合があります。なお、lddコマンドで表示されるのは動的リンクしている共有ライブラリの場合であり、ライブラリが静的リンクされている場合はlddコマンドでは表示されません。