リロケータブルバイナリ
リロケータブルバイナリとは、リロケータブルな性質を持つバイナリである。リロケーション(再配置)とは、位置に依存するコードを読み込みアドレスを割り当てるプロセスであり、コードとデータの参照を読み込み先のメモリアドレスに置き換えることである。
普通、コンピュータの機械語(実行形式)では、通常はコードが0番地から始まる絶対アドレスが用いられる。この場合、プログラムファイルを置くアドレス位置は一箇所に固定され、そのままでは別アドレス位置に置いて実行することはできない。マルチプロセスのシステムでは動的にプログラム間のリンク、切り替えを行うため、位置独立コードにしてオブジェクトの再配置をできるようにする必要がある。
あらかじめ絶対アドレスの記述に代えて仮想のアドレス指定をしておき、実行形式のプログラムファイルを生成する際にはじめて絶対アドレスを記述する(このためのソフトウェアを「リンケージエディタ」と呼ぶ)ようにすれば、メモリ空間のどこにでもその実行形式プログラムを置くことができる。分割コンパイルで出力されるオブジェクトやバイナリライブラリはたいていリロケータブルバイナリである。
セグメント
[編集]オブジェクトファイルは、ヘッダー情報、コードセグメント、データセグメント、読み取り専用データセグメント、VSSセグメントなど多くのメモリセグメント種別に分けられる。リロケーション情報もメモリセグメントの1つである。
リロケーション情報
[編集]オブジェクトファイル内のリロケーション情報とは、各セクションをメモリに配置する際の先頭アドレスとセクションサイズを意味する。テキストやデータなどのセクションはファイル内に実体があり、ファイルの先頭からのオフセット(をページサイズで割った余り)とメモリ上に配置する際のアドレスのページ内オフセットが一致するように配置される。BSSは初期値を持たないグローバル変数域であり、ファイル内に実体がない。
ダイナミックリンクライブラリを使用する実行ファイルでは未解決シンボルに関するシンボルテーブル状のデータをリロケーション情報として持っていて、実行時にローダーがリロケーションを行う。
リロケーションの手法
[編集]リンカがオブジェクトファイル内のセグメント情報とリロケーションテーブルを読み込み以下のようにリロケーションを実施する。
- 各オブジェクトファイルにはテキスト、データ、BSS といったセクションが存在する。全オブジェクトファイルをひとつの実行ファイルにまとめる際にそれらセクションを種類ごとにまとめるように配置する。そして、各セクションの配置アドレスを決定する。これによって各シンボルのアドレスが決定される。この時点で各シンボル(関数名や変数名)はユニークな実行時アドレスが割り当てられる。
- 各セクションでシンボルを参照している箇所を修正して正しい実行時アドレスを参照するようにする。