PE:节头的 SizeOfRawData 和 VirtualSize 字段之间的关系

PE: Relation between SizeOfRawData and VirtualSize fields of the section header

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

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

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

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

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

SizeOfRawData(图像文件中原始数据部分的大小)总是多个IMAGE_OPTIONAL_HEADER.FileAlignment

文件对齐

The alignment of the raw data of sections in the image file, in bytes. The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member is less than the system page size, this member must be the same as SectionAlignment.

VirtualSize 字段的目的是为部分分配和复制多少内存。没有这个字段,加载器怎么知道这个?

VirtualSize 可以大于或小于 SizeOfRawData.

例如,我们可以在部分中只有几个字节的初始化实际数据并且没有未初始化的数据 - 所以 VirtualSize 将只有几个字节大小,而 SizeOfRawData 512 字节

在另一种情况下,在 .data.bss 部分 - 可能根本没有初始化数据(因此 SizeOfRawData == 0)但是 虚拟大小 != 0.

所以加载程序为部分分配 (VirtualSize + SectionAlignment - 1) & ~(SectionAlignment-1) 字节并从文件

复制 min(VirtualSize, SizeOfRawData) 字节到它