什么是64位Windows上的PE文件的最大大小?

在我看来,它总是4GB,因为它使用相同大小的数据types(DWORD)? SizeOfImage的DWORD是不是总是32位的? 还是我误解了这个限制?

回答

4GB确实似乎是所有可移植可执行文件(32位和64位PE +)的硬性限制。

根据规范,它是一个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标头的文件头部分中设置了标志,说明它可以处理大于2GB的地址。 它也可以为2GB以上的非图像部分分配内存。

看起来这个映像需要在整个进程的VA空间的低2GB内完全适应,这意味着SizeOfImage被加载器有效地处理为带符号的32位整数。

根据COFF / PE32规范 ,有效PE32 +(64位/(PE +)文件的映像大小是一个4字节的无符号值。