オブジェクトファイル

オブジェクトファイル () またはオブジェクトコード () とは、コンパイラがソースコードを処理した結果生成される（たいていはアセンブリ言語による assembler code file と、アセンブラによるそれのアセンブルを経由している）、コード生成の結果にしてバイナリコードを含む中間的なデータ表現のファイルである。オブジェクトファイルは共有ライブラリのようにも使われることがある。名称としては、オブジェクトファイル、オブジェクトコードの他、オブジェクトプログラム()とも。
オブジェクトモジュールとは、ソースコードをコンパイルした結果の（静的リンクが行われる前の）機械語プログラムである。これらオブジェクトモジュールの集合体がオブジェクトファイルである。
中身は、機械語バイナリと、異なるモジュール間の相互参照を解決するシンボルテーブルやリロケーションテーブル、スタック巻き戻し情報、コメント、さらにリンクまたはデバッグに使用されるメタデータが含まれる場合もある。
オブジェクトファイル群をリンクすることにより、最終的な実行ファイルやライブラリが作成される。オブジェクトファイルのほとんどは機械語（コンピュータのCPUが直接実行できるコード）であり、オブジェクトファイルフォーマットはコンパイラやアセンブラが生成するオブジェクトファイルのファイルフォーマットである。
概要.
オブジェクトファイルにはオブジェクトコードだけでなく、リンカが実行ファイルやライブラリを作成するときに使用するリロケーション情報、プログラム内のシンボル情報、デバッグ情報などが含まれる。
オブジェクトファイルフォーマットには様々なものがある。本来各コンピュータはそれぞれオリジナルのフォーマットを持っていたが、UNIXや他の移植性のあるオペレーティングシステムが普及するに従ってCOFFやELFなどのフォーマットが定義され、様々なシステムで使われるようになった。リンカの入力と出力に同じファイルフォーマットを使うのが一般的であるため、オブジェクトファイルフォーマットは実行ファイルフォーマットでもある。
オブジェクトファイルフォーマットの設計や選択はシステム全体の設計に関わる問題である。リンカの性能に直接関係してくるため、プログラム開発の効率に影響する。また、同じフォーマットを実行ファイルでも使用する場合、プログラムの起動時間にも影響する。多くのオブジェクトファイルフォーマットでは同種のデータを集めた形式でブロック化されており、仮想記憶システムで必要に応じてページ単位にロードすることができ、そのまま実行可能である。
最も単純なオブジェクトファイルフォーマットとしてMS-DOSのCOMフォーマットがある。COMファイルは固定アドレスにロードされるバイト列から構成されている。他のフォーマットは内部構造があり、何ページにも渡る仕様書でその構造が規定されている。
セグメント.
殆どの種類のオブジェクトファイル形式は、一般的なメモリ管理の手法のひとつである "メモリセグメント" という用語に由来する "セグメント" と呼ばれる単位でデータを分割して保持しており、それぞれデータの種類が異なる。プログラムがローダによってメモリに読み込まれると、ローダはメモリの複数の領域をプログラムに割り当てる。
典型的なオブジェクトファイルフォーマットでサポートされるデータ種別は以下の通りである。
異なるオブジェクトファイル内のセグメントはセグメントの定義で決められた規則に従いリンカが結合する。例えば、DOSでは特別なセグメントの名前を決めたり結合されるべきかを定義した規則が存在する。
デバッグ情報はCOFFなどのフォーマットでは必須の部分だが、、DWARFなどのフォーマットでは半ば独立したフォーマットとなっている。
GNUプロジェクトのBFDライブラリは様々なフォーマットのオブジェクトファイルについての共通のAPIを提供する。
フォーマット.
主なオブジェクトファイルフォーマットを以下に列挙する。