オブジェクトファイル
プログラムの実行 |
---|
一般的な概念 |
コードの種類 |
コンパイル戦略 |
有名なランタイム |
|
有名なコンパイラとツールチェーン |
|
オブジェクトファイル (object file) またはオブジェクトコード (object code) とは、コンパイラがソースコードを処理した結果生成される(たいていはアセンブリ言語による assembler code file と、アセンブラによるそれのアセンブルを経由している)、コード生成の結果にしてバイナリコードを含む中間的なデータ表現のファイルである。オブジェクトファイルは共有ライブラリのようにも使われることがある。名称としては、オブジェクトファイル、オブジェクトコードの他、オブジェクトプログラム(object program)[1]とも。
オブジェクトモジュールとは、ソースコードをコンパイルした結果の(静的リンクが行われる前の)機械語プログラムである。これらオブジェクトモジュールの集合体がオブジェクトファイルである。
中身は、機械語バイナリと、異なるモジュール間の相互参照を解決するシンボルテーブルやリロケーションテーブル、スタック巻き戻し情報、コメント、さらにリンクまたはデバッグに使用されるメタデータが含まれる場合もある。
オブジェクトファイル群をリンクすることにより、最終的な実行ファイルやライブラリが作成される。オブジェクトファイルのほとんどは機械語(コンピュータのCPUが直接実行できるコード)であり、オブジェクトファイルフォーマットはコンパイラやアセンブラが生成するオブジェクトファイルのファイルフォーマットである。
概要
[編集]オブジェクトファイルにはオブジェクトコードだけでなく、リンカが実行ファイルやライブラリを作成するときに使用するリロケーション情報、プログラム内のシンボル情報、デバッグ情報などが含まれる。
オブジェクトファイルフォーマットには様々なものがある。本来各コンピュータはそれぞれオリジナルのフォーマットを持っていたが、UNIXや他の移植性のあるオペレーティングシステムが普及するに従ってCOFFやELFなどのフォーマットが定義され、様々なシステムで使われるようになった。リンカの入力と出力に同じファイルフォーマットを使うのが一般的であるため、オブジェクトファイルフォーマットは実行ファイルフォーマットでもある[2]:p.16。
オブジェクトファイルフォーマットの設計や選択はシステム全体の設計に関わる問題である。リンカの性能に直接関係してくるため、プログラム開発の効率に影響する。また、同じフォーマットを実行ファイルでも使用する場合、プログラムの起動時間にも影響する。多くのオブジェクトファイルフォーマットでは同種のデータを集めた形式でブロック化されており、仮想記憶システムで必要に応じてページ単位にロードすることができ、そのまま実行可能である。
最も単純なオブジェクトファイルフォーマットとしてMS-DOSのCOMフォーマットがある。COMファイルは固定アドレスにロードされるバイト列から構成されている。他のフォーマットは内部構造があり、何ページにも渡る仕様書でその構造が規定されている。
セグメント
[編集]殆どの種類のオブジェクトファイル形式は、一般的なメモリ管理の手法のひとつである "メモリセグメント" という用語に由来する "セグメント" と呼ばれる単位でデータを分割して保持しており、それぞれデータの種類が異なる。プログラムがローダによってメモリに読み込まれると、ローダはメモリの複数の領域をプログラムに割り当てる。
典型的なオブジェクトファイルフォーマットでサポートされるデータ種別は以下の通りである。
- ヘッダー情報 (ディスクリプティブ/コントロール情報)
- コードセグメント ("テキストセグメント"、実行形式コード)
- データセグメント (初期値を持つ静的変数)
- 読み取り専用データセグメント (RODATA、初期値を持たない静的定数)
- BSS セグメント (初期値を持たない変数や定数といった静的データ)
- リンキングのための外部定義と参照情報
- リロケーション情報
- ダイナミックリンク情報
- デバッグ情報
異なるオブジェクトファイル内のセグメントはセグメントの定義で決められた規則に従いリンカが結合する。例えば、DOSでは特別なセグメントの名前を決めたり結合されるべきかを定義した規則が存在する[3]。
デバッグ情報はCOFFなどのフォーマットでは必須の部分だが、stabs、DWARFなどのフォーマットでは半ば独立したフォーマットとなっている。
GNUプロジェクトのBFDライブラリは様々なフォーマットのオブジェクトファイルについての共通のAPIを提供する。
フォーマット
[編集]主なオブジェクトファイルフォーマットを以下に列挙する。
- DOS
- COM
- DOS MZ executable : 初期の.EXEファイルフォーマット。先頭に "MZ" (4D 5A) という文字列が入っている。
- 組み込みシステム
- 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)
脚注
[編集]- ^ J.DONOVAN, JOHN (1972). systems programming. pp. 4,149. ISBN 0-07-085175-1
- ^ IBM Corporation (1973). IBM OS Linkage Editor and Loader
- ^ Irvine, Kip R. (1993), Assembly language for the IBM-PC (2nd ed.), New York: Macmillan, ISBN 0-02-359651-1
関連項目
[編集]外部リンク
[編集]- Linkers and Loaders John R. Levine(Morgan Kaufmann Publishers, 2000)