.exe
組み込みの Visual Studioのデフォルトのベース アドレスは 0x00400000 です。
d3dx9_30.dll
とodbcint.dll
(どちらも に存在する)のデフォルトのベース アドレス%windir%\system32
も 0x00400000 です。したがって、デフォルトでexe
は、これらの dll のいずれかにリンクする s は、実行時アドレスの衝突を起こします。OS は自動的にdll
別のベース アドレスに再配置し、必要に応じてポインターを修正します。VS デバッガーを接続すると、これが発生することがわかります。再配置されたモジュールには感嘆符のオーバーレイが表示されます。
システム DLL のリベースは、ユーザー システムで行うのがほぼ不可能であることは言うまでもなく、非常に悪い考えです。exe
そのため、このアドレスの衝突を防ぎ、実行時のリベースを防ぐために、s をリベースすることにしました。
クライアント EXE を別のベース アドレスに変更してd3dx9_30.dll
の邪魔にならないようにすると、正常に動作します。アドレスの競合、再配置、フィックスアップはありません。
しかし、サーバーの EXE を別のベース アドレスに変更して、サーバーodbcint.dll
の邪魔にならないようにすると、機能しません。
odbcint.dll
メモリ内の 0x17000 バイトであり、ベース アドレス 0x00400000 を優先します。EXE を 0x00420000、次に 0x00660000 に設定しようとしました。まだodbcint.dll
実行時に再配置されます。でプロファイリングしたところ、ロードdepends.exe
前にこのアドレスを要求しようとしているモジュールが他にないことが示されました。odbcint.dll
odbcint.dll
優先アドレスでロードできない理由を説明する理論を誰かが持っていますか?
Update
: vadump は、main() に入るまでに、0x00400000 ~ 0x00470000 のメモリが「UNKNOWN_MAPPED」として要求されていることを示しています。これが正確に何を意味するのかについて、これ以上の情報を見つけることができませんでした。一部のシステム dll がロード時にこのメモリを予約していると思われます。私の debug-fu は、どれが、なぜ、またはいつ正確に発見できるほど強力ではありません。