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