1

.exe組み込みの Visual Studioのデフォルトのベース アドレスは 0x00400000 です。

d3dx9_30.dllodbcint.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 は、どれが、なぜ、またはいつ正確に発見できるほど強力ではありません。

4

1 に答える 1

1

VADump ( Windows リソース キットで入手可能: ) をダウンロードすると、どのモジュールがそれらのページにアクセスして、そのアドレスを見逃しているかを正確に確認できます。(vadump -op pid を実行します。)

作業している OS については言及していませんが、Vista/2K8+ ではASLRについても知っておく必要があります。

于 2009-04-19T18:29:52.180 に答える