位置独立コード
これをRVAと呼ぶ。しかし、複数のDLLが同じ希望のベースアドレスを持っている場合、同じベースアドレスに配置することはできないので、配置位置が被った2つ目以降のDLL全てをリンク時に再配置しなければならない。Windowsのローダが実行ファイルを主記憶にロードする際、その実行ファイルが作られたときに決めたアドレス(RVAのことではない)に各DLLがロードされているかをチェックする。DLLがロードされていない場合、その実行ファイルが要求するベースアドレスに再配置する。これにより実行ファイルは複数プロセス間で共有できるが(Fast User Switching で複数アカウントから起動した場合など)、同じDLLを異なるプログラム間で共有しても再配置されるため、DLL自身は共有されないことがある。
macOSやLinuxといったプラットフォームでは、事前バインディングの形式もサポートしている。macOSではこれを prebinding と呼ぶ。Linuxでは同じ機能を提供するプログラム prelink(英語版) がある。ただし実装方式は Windows の memory mapping とは大きく異なる。
64ビットのx86(x64)は命令ポインタ(プログラムカウンタ)相対アドレッシングをサポートしているため、64ビット版WindowsではDLLに位置独立コードを使うようになり、再配置方式をやめた。
初期のコンピュータではコードは位置依存だった。プログラムは特定アドレスにロードされ、実行されるよう構築されていた。複数のジョブを同時に並行して実行させるには、それらジョブが必要とするアドレスが重ならないようオペレータが注意深くスケジューリングする必要があった。例えば、給与支払いプログラムと受取勘定プログラムが共に同じアドレスで動作するよう構築されていた場合、オペレータはそれらを同時に実行させることができない。時には1つのプログラムのロードアドレスを変化させた複数のバージョンを作っておき、スケジューリングしやすくしていた。
より柔軟にするため、位置独立コードが発明された。位置独立コードをロードするアドレスはオペレータが任意に選択可能である。
動的アドレス変換(MMUが提供する機能)によって各プロセスに別々のアドレス空間が割り当てられるようになり、位置独立コードはほとんど不要となった。位置独立コードは位置依存コードより効率が悪いため、動的アドレス変換の方がよりよい解決策だった。
次に解決すべき課題は、複数の似たようなジョブを同時に実行する際、同じコードを複数回 重複してロードしなければならず、メモリを浪費することになる点である。全く同じプログラムを動作させる2つのジョブがあるとき、動的アドレス変換では物理メモリ上にロードしたプログラムを2つのジョブの仮想アドレス空間にマッピングすることで、プログラムの唯一の実体をメモリ上へ配置する事ができる。