オブジェクトファイル
オブジェクトファイル (object file) またはオブジェクトコード (object code) とは、コンパイラがソースコードを処理した結果生成される中間的なコード表現である。オブジェクトファイルの内容はバイナリであり、コンパクトで構文解析済みのコードである。オブジェクトファイル群をリンクすることによって最終的な実行ファイルやライブラリが作成される。オブジェクトファイルのほとんどは機械語である(コンピュータのCPUが直接実行できるコード)。オブジェクトファイルフォーマットはコンパイラやアセンブラが生成するオブジェクトファイルのファイルフォーマットである。
目次 |
概要 [編集]
オブジェクトファイルにはオブジェクトコードだけでなく、リンカが実行ファイルやライブラリを作成するときに使用するリロケーション情報、プログラム内のシンボル情報、デバッグ情報などが含まれる。
オブジェクトファイルフォーマットには様々なものがある。本来各コンピュータはそれぞれオリジナルのフォーマットを持っていたが、UNIXや他の移植性のあるオペレーティングシステムが普及するに従ってCOFFやELFなどのフォーマットが定義され、様々なシステムで使われるようになった。リンカの入力と出力に同じファイルフォーマットを使うのが一般的であるため、オブジェクトファイルフォーマットは実行ファイルフォーマットでもある。
オブジェクトファイルフォーマットの設計や選択はシステム全体の設計に関わる問題である。リンカの性能に直接関係してくるため、プログラム開発の効率に影響する。また、同じフォーマットを実行ファイルでも使用する場合、プログラムの起動時間にも影響する。多くのオブジェクトファイルフォーマットでは同種のデータを集めた形式でブロック化されており、仮想記憶システムで必要に応じてページ単位にロードすることができ、そのまま実行可能である。
最も単純なオブジェクトファイルフォーマットとしてMS-DOSのCOMフォーマットがある。COMファイルは固定アドレスにロードされるバイト列から構成されている。他のフォーマットは内部構造があり、何ページにも渡る仕様書でその構造が規定されている。
デバッグ情報はCOFFなどのフォーマットでは必須の部分だが、stabs、DWARFなどのフォーマットでは半ば独立したフォーマットとなっている。
GNUプロジェクトのBFDライブラリは様々なフォーマットのオブジェクトファイルについての共通のAPIを提供する。
典型的なオブジェクトファイルフォーマットでサポートされるデータ種別としては、テキストセグメント、データセグメント、BSS がある。
リロケーション [編集]
リロケーション(再配置)とは、オブジェクトファイル内のシンボリックな参照を具体的なメモリアドレスに置き換えることを意味する。一般にオブジェクトファイルはその中のコードが0番地から始まるものとしてコードが生成されている。従って、実際に実行する前にそのコードが置かれたアドレスに応じてコードの調整をしなければならない。
リロケーションは以下の2段階で行われる:
- 各オブジェクトファイルにはテキスト、データ、BSS といったセクションが存在する。全オブジェクトファイルをひとつの実行ファイルにまとめる際にそれらセクションを種類ごとにまとめるように配置する。そして、各セクションの配置アドレスを決定する。これによって各シンボルのアドレスが決定される。この時点で各シンボル(関数名や変数名)はユニークな実行時アドレスが割り当てられる。
- 各セクションでシンボルを参照している箇所を修正して正しい実行時アドレスを参照するようにする。
オブジェクトファイル内のリロケーション情報とは、各セクションをメモリに配置する際の先頭アドレスとセクションサイズを意味する。テキストやデータなどのセクションはファイル内に実体があり、ファイルの先頭からのオフセット(をページサイズで割った余り)とメモリ上に配置する際のアドレスのページ内オフセットが一致するように配置される。BSSは初期値を持たない広域変数域であり、ファイル内に実体がない。
ダイナミックリンクライブラリを使用する実行ファイルでは未解決シンボルに関するシンボルテーブル状のデータをリロケーション情報として持っていて、実行時にローダーがリロケーションを行う。
シンボルテーブル [編集]
シンボルテーブルはコンパイラなどが使用するデータ構造であり、ソースコード内の各種シンボル(関数名、変数名)の位置、タイプ、スコープなどを格納するものである。ハッシュテーブル形式になっていることが多く、コンパイル中ずっと保持される。コンパイル後の実行ファイルにシンボルテーブルを含めることもでき、シンボリックなデバッグに使用したり、統計情報や診断情報を実行時に得るのに使ったりする。ダイナミックリンクライブラリでは、シンボルテーブルをリロケーション情報として使用する。
フォーマット [編集]
主なオブジェクトファイルフォーマットを以下に列挙する。
- DOS
- COM
- DOS executable (MZ):初期の.EXEファイルフォーマット。先頭に"MZ"(4D 5A)という文字列が入っている。
- 組み込みシステム
- Macintosh
- Preferred Executable Format (PEF) / Code Fragment Manager (CFM)
- Mach-O (NeXT, Mac OS X)
- Unix
- a.outフォーマット
- COFF (UNIX System V)
- XCOFF (AIX)
- ELF (SVR4; 最も広く採用されている)
- Mach-O (NeXT, Mac OS X)
- Microsoft Windows
- 16ビット New Executable
- Portable Executable (PE)
関連項目 [編集]
外部リンク [編集]
- Linkers and Loaders John R. Levine(Morgan Kaufmann Publishers, 2000)