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)
字节到它
我看到对于图像文件中的部分,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)
字节到它