我看到对于图像文件中的部分,VirtualSize字段是加载到内存中时该部分的总大小,而SizeOfRawData字段是该部分在磁盘上的初始化数据的大小。

在检查.idata部分时,VirtualSize字段设置为0x14,而SizeOfRawData字段设置为0x400。

为什么链接程序(在本例中为MinGW ld)使文件部分如此之大,而加载到内存中的文件却只是其大小的一小部分?

另外,VirtualSize字段的用途是什么?为什么不总是加载整个部分,即加载SizeOfRawData字节?

我在官方的PE文档中看不到任何描述或它们之间的关系。

最佳答案

SizeOfRawData(图像文件中原始数据部分的大小)始终为IMAGE_OPTIONAL_HEADER.FileAlignment

文件对齐



VirtualSize 字段的目的是为节分配和复制多少内存。没有此字段,装载机如何知道这一点?

VirtualSize 可以大于或小于 SizeOfRawData

例如,我们在节中只能有几个字节的已初始化实际数据,而没有未初始化的数据-因此 VirtualSize 将只有几个字节大小,而 SizeOfRawData 512个字节

.data.bss节中的另一种情况下-可以根本没有初始化数据(因此 SizeOfRawData == 0),但 VirtualSize != 0。

因此,加载程序为段分配(VirtualSize + SectionAlignment - 1) & ~(SectionAlignment-1)字节,然后从文件中将min(VirtualSize, SizeOfRawData)字节复制到该段

08-27 18:27