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