在我看来,它总是4 4GB,因为它使用相同大小的数据类型( DWORD)?SizeOfImage
的DWORD值不是一直是32位的吗?或者我对这个限制的理解是错误的?
回答
4 4GB似乎确实是所有可移植可执行文件(32位和64位PE+)的硬限制。
发布于 2011-08-23 11:35:16
根据spec,它是PE32+镜像的32位无符号值,就像PE32镜像一样。
然而,在我对Windows7 SP1家庭高级版x64上的32位和64位应用程序(PE32/PE32+文件)的测试中,这两种应用程序的最大文件大小都在1.8-1.85 64之间。
我使用Visual Studio创建了一个非常基本的C可执行文件(32位约为8K,64位约为9K ),并在PE头中添加了一个空的代码部分,直到Windows不再加载它,然后对限制进行二进制搜索。使用vmmap查看进程会发现,整个前2 2GB的地址空间几乎都是映像(包括任何后续加载的DLL,如kernel32.dll)。对于我来说,32位和64位进程的限制是相同的。它还可以为超过2 2GB限制的非图像部分分配内存。
对于这个过程,图像似乎需要完全适合低2 2GB的VA空间,这意味着SizeOfImage正在被加载器有效地处理为带符号的32位整数。
发布于 2011-08-08 08:39:49
根据COFF/PE32 spec,有效的PE32+ (64位/(PE+)文件的图像大小是4字节无符号值。
发布于 2020-08-01 23:52:03
PE报头中的ImageSize字段在很大程度上与PE文件在磁盘上的文件大小无关。ImageSize是已加载映像的内存大小,即所有部分的大小(每个部分四舍五入到SectionAlignment边界)+ PE标头的大小(在下一个标头字段SizeOfHeaders中给定)。对于PE32或PE32+,此值不能大于2 2GB,因为a)规范说明了这一点,并且b)规范中存在31位RVA,例如,在导入查找表中。RVA是作为相对于内存中基地址的偏移量给出的内存引用。
不过,这是在内存中。磁盘上的文件可以包含未加载到内存中的数据(例如调试数据、证书数据)。PE规范中的文件指针字段是32位无符号值。因此,根据规范,一个PE文件的理论最大大小是4 4GB。
这是按照说明书的。可能存在PE规范之外的文件系统、加载器、操作系统限制,从而进一步降低最大限制。
https://stackoverflow.com/questions/6976693
复制相似问题