偶然发现这个问题(和答案):https : //stackoverflow.com/questions/2170843/va-virtual-adress-rva-relative-virtual-address在我寻求理解 Windows 的 PE 格式时,我想知道:为什么默认图像库值是 0x400000?为什么我们不能从 0 开始?在所有实际目的中,VA 将等于 RVA。
我显然遗漏了一些东西,但在过去的 40 分钟内我一直无法找到对此的合理解释。
偶然发现这个问题(和答案):https : //stackoverflow.com/questions/2170843/va-virtual-adress-rva-relative-virtual-address在我寻求理解 Windows 的 PE 格式时,我想知道:为什么默认图像库值是 0x400000?为什么我们不能从 0 开始?在所有实际目的中,VA 将等于 RVA。
我显然遗漏了一些东西,但在过去的 40 分钟内我一直无法找到对此的合理解释。
为什么默认图像库值是 0x400000?
来自http://msdn.microsoft.com/en-us/library/ms809762.aspx --
在为 Windows NT 生成的可执行文件中,默认映像库为 0x10000。对于 DLL,默认值为 0x400000。在 Windows 95 中,地址 0x10000 不能用于加载 32 位 EXE,因为它位于所有进程共享的线性地址区域内。因此,Microsoft 已将 Win32 可执行文件的默认基址更改为 0x400000。
请注意,默认(或“首选”)基地址由链接器(GCC ld
、Microsoft VC++link.exe
等)在构建时设置;默认(或“首选”)基地址不是由 Windows 确定的。
如果您希望 msvc 使用 0x10000 的图像库编译驱动程序,您可以更改基础
:\>kd -c "!dh acpi;q" -z c:\WINDOWS\system32\drivers\acpi.sys | grep -i image
File Type: EXECUTABLE IMAGE
00010000 image base
5.01 image version
2DD80 size of image
:\>
这里是如何改变用户模式可执行文件 imagebase base 必须是 64k 的倍数如果 base:0 被使用 exe 将有一个 0x10000 的图像 base
:\>dir /b & type * & cl /nologo /Zi * /link /base:0x200000 & dir /b
sysbp.cpp
sysbp.cpp
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
printf("all the bases belongs to base\n");
exit(0);
}sysbp.cpp
sysbp.cpp
sysbp.exe
sysbp.ilk
sysbp.obj
sysbp.pdb
vc100.pdb
:\>sysbp.exe
all the bases belongs to base
:\>cdb -c "q;" sysbp.exe | grep -i modload
ModLoad: 00200000 00222000 sysbp.exe
ModLoad: 7c900000 7c9b2000 ntdll.dll
ModLoad: 7c800000 7c8f6000 C:\WINDOWS\system32\kernel32.dll
q
:\>