これがあなたの問題です:
古代の歴史(エクステンダーを備えた16ビットDOSプログラム)に戻ると、コンパイラーは、相対アドレスを格納する「ベースの」ポインターをサポートするために使用されていました。これらはまとめてシリアル化しても安全でした。そして、アプリケーションはそうし、コードとデータの両方を保存し、シリアル化されたモジュールは「オーバーレイ」と呼ばれていました。
今日では、ツールチェーンでベースのポインターサポートが必要になります(すべてのポインターアクセスに追加の調整が必要になります)。または、すべてのデータを調べて、ポインターを他のデータと区別し(どのように?)、新しいものに調整する必要があります。古いプログラムがヒープに使用していたのと同じアドレスにOSがすでにライブラリをロードしている場合の保存場所。ガベージコレクターのポインターを既に識別しなければならない最新の「管理された」環境では、これは一般的に行われていなくても実行可能です。ネイティブコードでは、共有ライブラリの再配置を可能にするためにメタデータが作成されますが、それは非常に困難です。
そのため、代わりに、データ構造全体を手動でウォークし、オブジェクトに新しいアドレスがある場合でも、オブジェクトリンク(ポインター)をもう一方の端で復元できるものに変換することになります(これも、古いアドレスが共有ライブラリ)。
多くのプロセッサにはベースアドレス指定をサポートする機能があることに注意してください...ベースアドレス指定はもはや一般的ではないため、コンパイラは先に進み、これらのポインタ演算機能を使用してユーザーコードを高速化しました。