オブジェクトファイル

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

オブジェクトファイル (object file) またはオブジェクトコード (object code) とは、コンパイラソースコードを処理した結果生成される中間的なコード表現である。オブジェクトファイルの内容はバイナリであり、コンパクトで構文解析済みのコードである。オブジェクトファイル群をリンクすることによって最終的な実行ファイルライブラリが作成される。オブジェクトファイルのほとんどは機械語である(コンピュータのCPUが直接実行できるコード)。オブジェクトファイルフォーマットコンパイラアセンブラが生成するオブジェクトファイルのファイルフォーマットである。

概要[編集]

オブジェクトファイルにはオブジェクトコードだけでなく、リンカ実行ファイルライブラリを作成するときに使用するリロケーション情報、プログラム内のシンボル情報、デバッグ情報などが含まれる。

オブジェクトファイルフォーマットには様々なものがある。本来各コンピュータはそれぞれオリジナルのフォーマットを持っていたが、UNIXや他の移植性のあるオペレーティングシステムが普及するに従ってCOFFELFなどのフォーマットが定義され、様々なシステムで使われるようになった。リンカの入力と出力に同じファイルフォーマットを使うのが一般的であるため、オブジェクトファイルフォーマットは実行ファイルフォーマットでもある。

オブジェクトファイルフォーマットの設計や選択はシステム全体の設計に関わる問題である。リンカの性能に直接関係してくるため、プログラム開発の効率に影響する。また、同じフォーマットを実行ファイルでも使用する場合、プログラムの起動時間にも影響する。多くのオブジェクトファイルフォーマットでは同種のデータを集めた形式でブロック化されており、仮想記憶システムで必要に応じてページ単位にロードすることができ、そのまま実行可能である。

最も単純なオブジェクトファイルフォーマットとしてMS-DOSCOMフォーマットがある。COMファイルは固定アドレスにロードされるバイト列から構成されている。他のフォーマットは内部構造があり、何ページにも渡る仕様書でその構造が規定されている。

デバッグ情報はCOFFなどのフォーマットでは必須の部分だが、stabsDWARFなどのフォーマットでは半ば独立したフォーマットとなっている。

GNUプロジェクトのBFDライブラリは様々なフォーマットのオブジェクトファイルについての共通のAPIを提供する。

典型的なオブジェクトファイルフォーマットでサポートされるデータ種別としては、テキストセグメント、データセグメント、BSS がある。

リロケーション[編集]

リロケーション(再配置)とは、オブジェクトファイル内のシンボリックな参照を具体的なメモリアドレスに置き換えることを意味する。一般にオブジェクトファイルはその中のコードが0番地から始まるものとしてコードが生成されている。従って、実際に実行する前にそのコードが置かれたアドレスに応じてコードの調整をしなければならない。

リロケーションは以下の2段階で行われる:

  1. 各オブジェクトファイルにはテキスト、データ、BSS といったセクションが存在する。全オブジェクトファイルをひとつの実行ファイルにまとめる際にそれらセクションを種類ごとにまとめるように配置する。そして、各セクションの配置アドレスを決定する。これによって各シンボルのアドレスが決定される。この時点で各シンボル(関数名や変数名)はユニークな実行時アドレスが割り当てられる。
  2. 各セクションでシンボルを参照している箇所を修正して正しい実行時アドレスを参照するようにする。

オブジェクトファイル内のリロケーション情報とは、各セクションをメモリに配置する際の先頭アドレスとセクションサイズを意味する。テキストやデータなどのセクションはファイル内に実体があり、ファイルの先頭からのオフセット(をページサイズで割った余り)とメモリ上に配置する際のアドレスのページ内オフセットが一致するように配置される。BSSは初期値を持たない広域変数域であり、ファイル内に実体がない。

ダイナミックリンクライブラリを使用する実行ファイルでは未解決シンボルに関するシンボルテーブル状のデータをリロケーション情報として持っていて、実行時にローダーがリロケーションを行う。

シンボルテーブル[編集]

シンボルテーブルはコンパイラなどが使用するデータ構造であり、ソースコード内の各種シンボル(関数名、変数名)の位置、タイプ、スコープなどを格納するものである。ハッシュテーブル形式になっていることが多く、コンパイル中ずっと保持される。コンパイル後の実行ファイルにシンボルテーブルを含めることもでき、シンボリックなデバッグに使用したり、統計情報や診断情報を実行時に得るのに使ったりする。ダイナミックリンクライブラリでは、シンボルテーブルをリロケーション情報として使用する。

フォーマット[編集]

主なオブジェクトファイルフォーマットを以下に列挙する。

関連項目[編集]

外部リンク[編集]