Visual Studio中内置的.exe的默认基址为0x00400000。
d3dx9_30.dll和odbcint.dll (都位于%windir%\system32中)的默认基地址也是0x00400000。因此,默认情况下,链接到这两个exe中任何一个的dlls都会有运行时地址冲突。操作系统自动将dll重新定位到不同的基地址,并根据需要修复指针,当我附加VS调试器时,我可以看到这一点:重新定位的模块得到一个感叹号图标覆盖。
重新设置系统DLL的基址是一个非常糟糕的想法,更不用说在用户系统上几乎不可能做到。因此,我决定重新设置我的exe的基址,以防止这种地址冲突,从而防止运行时重新基址。
如果我改变我的客户EXE到一个不同的基地址,以移出d3dx9_30.dll的方式,它工作得很好:没有地址冲突,没有重定位,没有修正。
但是,如果我将我的服务器可执行文件更改为不同的基地址,将它们从odbcint.dll的方式中移出,它将不起作用。
odbcint.dll在内存中为0x17000字节,并且首选基地址0x00400000。我尝试将我的EXEs设置为0x00420000,然后设置为0x00660000。尽管如此,odbcint.dll还是会在运行时被重新定位。我对depends.exe进行了分析,结果显示在odbcint.dll加载之前没有其他模块试图声明此地址。
有没有人能解释为什么我不能让odbcint.dll加载到它的首选地址?
Update:vadump显示,当我输入main()时,位于0x00400000-0x00470000的内存被声明为'UNKNOWN_MAPPED‘。我一直无法找到更多关于这到底是什么意思的信息。我假设某个系统dll在加载时保留了这个内存;我的dll fu不够强大,无法发现是什么、为什么或者是确切的时间。
发布于 2009-04-19 18:29:52
如果您下载VADump (在Windows Resource Kit:中可用),您可以确切地看到哪个模块正在访问这些页面并导致其未命中其地址。(运行vadump -op pid。)
你没有说你正在使用什么操作系统,但在Vista/2K8+上,你也应该知道ASLR。
https://stackoverflow.com/questions/762177
复制相似问题