リロケータブルバイナリは、メモリにおける
コードの配置を柔軟にするための技術です。この
バイナリは、実行する際の
メモリアドレスが固定されず、さまざまなアドレスに再配置できる特徴を持っています。これは特に、複数のプログラムが同時に実行されるマルチプロセス環境において重要です。
リロケーションの基本概念
リロケーション、すなわち「再配置」とは、プログラムやデータのアドレスを動的に変更するプロセスを指します。通常、
機械語の実行形式では、
コードが常に先頭から開始される絶対アドレスが使われているため、異なるメモリ位置に
コードを移動することは困難です。しかし、
リロケータブルバイナリでは、あらかじめ仮想アドレスを使用しておくことで、実行時にメモリ上の任意の位置に配置可能になるのです。
オブジェクトファイルは、数種類のメモリセグメントで構成されており、それにはヘッダー情報や
コードセグメント、データセグメント、さらにリロケーション情報が含まれます。リロケーション情報自体もメモリセグメントの一部であり、各セクションの先頭アドレスやセクションサイズについてのデータを持っています。これによって、ファイルの内容がどのようにメモリに読み込まれるかが制御されます。
リロケーション情報の役割
オブジェクトファイル内のリロケーション情報は、各セクション(テキスト、データ、BSSなど)をどのようにメモリに配置するかを指示します。例えば、
グローバル変数が初期値を持たないBSSセクションでは、ファイル内にはその実体が存在せず、必要に応じて実行時にメモリを割り当てます。ダイナミックリンク
ライブラリを使用する場合、リロケーション情報は未解決シンボルに関するデータを含んでおり、これを基に実行時にローダーがリロケーション処理を行います。
リロケーションの手法
リンカは、
オブジェクトファイル内からセグメント情報やリロケーションテーブルを読み取ります。全ての
オブジェクトファイルを一つの
実行ファイルにまとめる際、各セクション(テキスト、データ、BSSなど)を種類ごとに配置し、それぞれのセクションのアドレスを決定します。この時点で、各関数名や変数名などのシンボルにユニークな実行時アドレスが割り当てられます。
その後、各セクション内でシンボルを参照している箇所を修正し、正しい実行時のアドレスを参照するようにします。これにより、プログラムは
リロケータブルバイナリとして、様々なメモリの配置に対応しながらスムーズに動作することが可能になります。
関連項目