在我看来,它总是要4GB,因为它使用相同大小的数据类型(A DWORD)? SizeOf
Image的DWORD是不是总是32位?还是我错了这个限制?
回答
4GB确实似乎是所有便携式可执行程序(32位和64位PE)的硬限制.
根据
spec,PE32图像的32位无符号值就像PE32图像一样.
但是,在我使用Windows 7 SP1 Home Premium x64上的32位和64位应用程序(PE32 / PE32文件)进行测试时,两者的最大文件大小在1.8-1.85GB之间.
我通过使用Visual Studio(〜8K为32位和9K为64位)创建一个非常基本的C可执行程序,并添加了一个空代码段到PE头,直到Windows不再加载它,然后二进制搜索极限.使用vmmap查看进程显示,几乎所有第一个2GB的地址空间都是映像(包括随后加载的任何DLL,如kernel32.dll).对于32位和64位进程,我的限制是一样的. 64位进程的NT标头的文件头部分中设置了标志,指出它可以处理地址> 2GB.它也可以为高于2GB限制的非图像部分分配内存.
看起来像是需要在整个进程的2GB空间中整合图像,这意味着SizeOfImage被有效地处理了一个带符号的32位整数.