リロケータブル
リロケータブル(再配置可能)という形容詞は、プログラムの属性を示し、メモリ上の何処に配置しても差し支えなく動作できる性質を指して言う。そのようなバイナリをリロケータブルバイナリと言う。殊に、バイナリプログラム、実行形式と呼ばれるアプリケーションプログラムや、ライブラリ、モジュールで、この属性の有無が問題となる。
再配置可能にするための方法としては、再配置の際に修正が必要な箇所をリストアップしたものを付加し、再配置の際にフィックスアップするというものと、そもそも配置されるアドレスに依存するようなコードを含まないようにする、というものがあり、後者を位置独立(いちどくりつ)と言う。
概要
編集プログラムやライブラリ、モジュールを補助記憶装置から主記憶装置に読み込むにあたり、メモリ上の任意のアドレスに読み込むことが出来るものが、リロケータブルなプログラム、ライブラリ、モジュールである。たとえばOS-9では、プログラムやモジュールを、メモリの空いている所があれば任意の番地にロードし、実行を開始する事が出来る。
対照的にCP/Mでは、アプリケーションは所定の番地(0100Hより以下)に配置される事を前提として作成されており、単一のプログラムのロード・実行を開始したら、終了するまで他のプログラムをロード・実行を開始できない。
位置独立のための条件
編集位置独立なプログラムであるためには、当該プロセッサが、PC相対アドレッシング・モードを持つことが重要である。
相対分岐
編集当該分岐命令の置かれた番地に対し相対番地で示される場所へ分岐できる命令を持つ事が不可欠である。これにより、プログラムがどの場所に配置されても、所定の場所へ分岐することが出来る。
これに対して絶対番地を指定して分岐する方法では、プログラムを作成した際に想定したアドレスに配置しないと、分岐によってプログラム内の別の場所に分岐したり、プログラムが置かれていない場所に分岐して暴走する。
メモリへのアクセス
編集当該メモリアクセス命令の置かれた番地に対して相対番地で示される場所へメモリアクセスできる命令を持つことが重要である。これにより、プログラムがどの場所に配置されても、プログラム内に格納された定数を正しく読み出したり、プログラム内に確保された作業領域を正しく使用できる。
尚、呼び出し元のコール命令の配置アドレスをインデックスレジスタに格納するサブルーチンを用意しておき、これをコールすることで自身の配置アドレスを確認する方法もある。これにより、メモリアクセスについては擬似的にPC相対アドレッシングが実現できる。
再配置
編集MS-DOSのexe形式の実行ファイルでは、プログラムをロードした後に、セグメント情報を書き換えて再配置をおこなっている。
仮想記憶を使用するコンピュータでは、メモリが仮想化されているため、複数のプロセスを同時に実行する際でもアドレスをずらす必然性がない。そのため、再配置をしないシステムもある。