Shu*_*eng 3 windows assembly portable-executable windows-10
我看到对于图像文件中的部分,该VirtualSize字段是加载到内存中时该部分的总大小,而该SizeOfRawData字段是该部分在磁盘上的初始化数据的大小。
在检查一个.idata部分时,该VirtualSize字段设置为 0x14,而该SizeOfRawData字段设置为 0x400。
为什么链接器 - 在这种情况下 MinGW ld- 使文件部分如此之大,而加载到内存中的部分只是它大小的一小部分?
另外,这个VirtualSize领域的目的是什么?为什么不总是加载整个部分,即加载SizeOfRawData字节?
我在官方 PE 文档中没有看到描述或它们的关系。
SizeOfRawData(图像文件中原始数据部分的大小)总是多个IMAGE_OPTIONAL_HEADER.FileAlignment
文件对齐
图像文件中节的原始数据的对齐方式,以字节为单位。该值应该是 512 到 64K(含)之间的 2 的幂。默认为 512。如果 SectionAlignment 成员小于系统页面大小,则该成员必须与 SectionAlignment 相同。
VirtualSize字段的目的是需要为节分配和复制多少内存。没有这个字段,loader 怎么知道这个?
VirtualSize可以大于或小于SizeOfRawData。
例如,我们可以在节中只有几个字节的初始化实际数据,并且没有未初始化的数据 - 所以VirtualSize将只有几个字节大小,而SizeOfRawData 512 个字节
在.data或.bss部分中的另一种情况- 可以根本没有初始化数据(因此SizeOfRawData == 0)但VirtualSize != 0。
所以加载器(VirtualSize + SectionAlignment - 1) & ~(SectionAlignment-1)为节分配字节并将min(VirtualSize, SizeOfRawData)字节从文件复制到它