64位Windows上PE文件的最大大小是多少?

时间:2011-08-08 00:10:19

标签: windows 64-bit 32bit-64bit portable-executable

在我看来它总是4GB,因为它使用相同大小的数据类型(一个DWORD)? SizeOfImage总是不是32位的DWORD?或者我错了这个限制?

答案

4GB确实似乎是ALL Portable Executable(32位和64位PE +)的硬限制。

3 个答案:

答案 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规范之外可能存在文件系统,加载程序,操作系统限制,这些限制会进一步降低最大值。