.exe
内置 Visual Studio的默认基地址是 0x00400000。
d3dx9_30.dll
和odbcint.dll
(都存在于 中)的默认基地址%windir%\system32
也是 0x00400000。因此,默认情况下,exe
链接到这些 dll 中的任何一个的 s 都会发生运行时地址冲突。操作系统会自动将 重新定位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 在加载时保留了此内存;我的调试功能不够强大,无法发现是哪个、为什么或确切的时间。