オブジェクトファイル()とは、プログラムのソースコードをコンパイラやアセンブラが翻訳した際に生成される、実行ファイルの前段階のプログラムコードを格納したファイルである。
プログラム開発においてはリンク処理の対象として位置づけられ、複数のオブジェクトファイルを結合することで実行可能ファイルやライブラリを構築する用途で用いられる。内部には機械語命令のほか、シンボルテーブルや再配置情報(リロケーション)など、モジュール間の参照解決や配置調整に必要なデータが含まれる。
概要 オブジェクトファイルにはオブジェクトコードだけでなく、リンカが実行ファイルやライブラリを作成するときに使用するリロケーション情報、プログラム内のシンボル情報、デバッグ情報などが含まれる。
オブジェクトファイルフォーマットには様々なものがある。本来各コンピュータはそれぞれオリジナルのフォーマットを持っていたが、UNIXや他の移植性のあるオペレーティングシステムが普及するに従ってCOFFやELFなどのフォーマットが定義され、様々なシステムで使われるようになった。リンカの入力と出力に同じファイルフォーマットを使うのが一般的であるため、オブジェクトファイルフォーマットは実行ファイルフォーマットでもある。
オブジェクトファイルフォーマットの設計や選択はシステム全体の設計に関わる問題である。リンカの性能に直接関係してくるため、プログラム開発の効率に影響する。また、同じフォーマットを実行ファイルでも使用する場合、プログラムの起動時間にも影響する。多くのオブジェクトファイルフォーマットでは同種のデータを集めた形式でブロック化されており、仮想記憶システムで必要に応じてページ単位にロードすることができ、そのまま実行可能である。
最も単純なオブジェクトファイルフォーマットとしてDOSのCOMフォーマットがある。COMファイルは固定アドレスにロードされるバイト列から構成されている。他のフォーマットは内部構造があり、何ページにも渡る仕様書でその構造が規定されている。
セグメント 殆どの種類のオブジェクトファイル形式は、一般的なメモリ管理の手法のひとつである "メモリセグメント" という用語に由来する "セグメント" と呼ばれる単位でデータを分割して保持しており、それぞれデータの種類が異なる。プログラムがローダによってメモリに読み込まれると、ローダはメモリの複数の領域をプログラムに割り当てる。
典型的なオブジェクトファイルフォーマットでサポートされるデータ種別は以下の通りである。 ヘッダー情報 (ディスクリプティブ/コントロール情報) コードセグメント ("テキストセグメント"、実行形式コード) データセグメント (初期値を持つ静的変数) 読み取り専用データセグメント (RODATA、初期値を持たない静的定数) BSS セグメント (初期値を持たない変数や定数といった静的データ) リンキングのための外部定義と参照情報 リロケーション情報 ダイナミックリンク情報 デバッグ情報
異なるオブジェクトファイル内のセグメントはセグメントの定義で決められた規則に従いリンカが結合する。例えば、DOSでは特別なセグメントの名前を決めたり結合されるべきかを定義した規則が存在する。
デバッグ情報はCOFFなどのフォーマットでは必須の部分だが、、DWARFなどのフォーマットでは半ば独立したフォーマットとなっている。
GNUプロジェクトのBFDライブラリは様々なフォーマットのオブジェクトファイルについての共通のAPIを提供する。
フォーマット 主なオブジェクトファイルフォーマットを以下に列挙する。
DOS COM DOS MZ executable : 初期の.EXEファイルフォーマット。先頭に "MZ" (4D 5A) という文字列が入っている。 組み込みシステム IEEE-695 S-record Macintosh Preferred Executable Format (PEF) / Code Fragment Manager (CFM) Mach-O (NeXT, macOS) Unix a.outフォーマット COFF (UNIX System V) XCOFF (AIX) ELF (SVR4; 最も広く採用されている) Mach-O (NeXT, macOS) Microsoft Windows 16ビット New Executable Portable Executable (PE)
脚注
関連項目 リンケージエディタ ソースコード バイトコード リロケータブルバイナリ 位置独立コード
外部リンク Linkers and Loaders John R. Levine(Morgan Kaufmann Publishers, 2000)