Delphiでは、イメージベースリンカオプションのデフォルトは00400000です。
ヘルプごと:
コンパイルされたイメージの優先ロードアドレスを指定します。この値は通常、DLLをコンパイルするときにのみ変更されます。デフォルト=400000
EXEに変更しても効果はありませんか?効果はどうなりますか?アドレスは各プロセスに関連していますか?
Delphiでは、イメージベースリンカオプションのデフォルトは00400000です。
ヘルプごと:
コンパイルされたイメージの優先ロードアドレスを指定します。この値は通常、DLLをコンパイルするときにのみ変更されます。デフォルト=400000
EXEに変更しても効果はありませんか?効果はどうなりますか?アドレスは各プロセスに関連していますか?
実行可能イメージ(EXEとDLL、およびBPLやOCXなどの偽装されたDLLであるその他のもの)は、可能であれば、OSローダーによって優先ロードアドレス(イメージベース)にロードされます。仮想アドレス空間のその領域が他の目的(別のイメージ、スレッドスタック、ヒープ割り当て)のために予約されている場合、OSローダーはイメージを再配置します。イメージを再配置するには、イメージをアドレススペースの別の場所に配置し、新しいロードアドレスと優先ロードアドレスの差を取り、この差をイメージ内のすべての再配置修正に追加します。再配置の修正は、グローバル変数からの値のロードや他のルーチンへの絶対ジャンプなど、コードまたはデータがそれ自体を参照する実行可能イメージ内のすべての場所を指します。
再配置には、OSがイメージデータのメモリ内バージョンを変更することが含まれるため、時間がかかり、より多くのI / Oを使用し、より多くのページをコミットし(再配置されたイメージ全体をページインする必要があります)、OS仮想メモリサブシステムロードされたイメージを、同じ実行可能イメージをロードした他のプロセスと共有することはできません(メモリ内で異なるため)。したがって、ロード時の再配置を回避することが望ましい。
実行可能イメージの優先アドレスは$00400000
、32ビットWindowsの慣例によるものであり、他のDLL(OS DLLを含む)は、メインの実行可能ファイルと一致する可能性のあるデフォルトのロードアドレスを持たないため、この規則に依存しています。したがって、彼らは移転を避けます。実際、EXEイメージの再配置はめったに行われないため、再配置データは害を及ぼすことなくEXEイメージから削除されることがよくあります。
DLL用に変更することは、デフォルトのOSDLLおよび通常DLL/EXEに付属している他のDLLとの競合を回避するために理にかなっています。EXE用に変更すると、OSがDLLを再配置する必要が生じる可能性が高くなるため、EXEロードアドレスを変更することはお勧めしません。
UPXのような実行可能イメージコンパクターは、特にDLLや、多くのインスタンスが実行されている可能性のある実行可能ファイルにはお勧めしません。メモリ内解凍は、メモリ内イメージが複数のプロセス間で共有されるのを防ぐための再配置のように機能するためです。
非常に低レベルのダーティハックを行わない限り、EXEのイメージベースの変更はほとんど役に立ちません。
アドレスは各プロセスに関連していますか?
はい、各プロセスには独自のアドレス空間があります。