在我看来它总是4GB,因为它使用相同大小的数据类型(一个DWORD)? SizeOfImage
总是不是32位的DWORD?或者我错了这个限制?
4GB确实似乎是ALL Portable Executable(32位和64位PE +)的硬限制。
答案 0 :(得分:12)
根据spec,对于PE32 +图像,它是32位无符号值,就像PE32图像一样。
但是,在我使用Windows 7 SP1 Home Premium x64上的32位和64位应用程序(PE32 / PE32 +文件)进行测试时,两者之间的最大文件大小介于 1.8-1.85GB 。
我通过使用Visual Studio创建一个非常基本的C可执行文件(对于32位为~8K,对于64位为9K)进行了测试,并在PE标头中添加了一个空代码段,直到Windows不再加载它为止,然后二进制搜索限制。使用vmmap查看进程显示,几乎所有前2GB的地址空间都是映像(包括任何后续加载的DLL,如kernel32.dll)。对于32位和64位进程,我的限制是相同的。 64位进程确实在其NT Header的文件头部分中设置了标志,表明它可以处理> 2GB的地址。它还可以为高于2GB限制的非图像部分分配内存。
对于进程来说,似乎需要将图像整体放入VA空间的较低2GB空间中,这意味着有效地将SizeOfImage处理为带符号的32位整数。
答案 1 :(得分:7)
根据COFF/PE32 spec,有效PE32 +(64位/(PE +)文件的图像大小为4字节无符号值。
答案 2 :(得分:1)
PE标头中的ImageSize字段与PE文件在磁盘上的文件大小基本无关。 ImageSize是加载的图像的内存大小,即所有部分的大小(每个部分四舍五入到SectionAlignment边界)+ PE标头的大小(在下一个标头字段SizeOfHeaders中给出)。对于PE32或PE32 +,此值不能大于2GB,因为a)规格说明了b)规格中存在31位RVA,例如在导入查找表中。 RVA是作为内存内基址的偏移量给出的内存引用。
虽然在内存中。磁盘上的文件可以包含未加载到内存中的数据(例如调试数据,证书数据)。 PE规范中的文件指针字段是32位无符号值。因此,根据规范,PE 文件的理论最大大小为4GB。
这是根据规范。在PE规范之外可能存在文件系统,加载程序,操作系统限制,这些限制会进一步降低最大值。