gpt4 book ai didi

windows - 为什么有时 .data 部分的虚拟大小大于原始大小?

转载 作者:可可西里 更新时间:2023-11-01 10:36:46 24 4
gpt4 key购买 nike

最近我发现,PE 中的 .data 部分的虚拟大小可以大于原始大小(在文件中)。这是相当令人吃惊的。有人说这是某处未初始化数据的结果。

但是在分析了一些PE之后,实在找不到这个多余的数据。以下是某些程序的 PEDump 结果的链接:

"Hello world" PEDump

如您所见,.data 部分的虚拟大小大于原始大小。为什么在这个特定示例中会这样?

最佳答案

任何初始化数据的值都存储在该部分中,如果二进制文件想在内存中为任何未初始化数据保留空间,则虚拟大小将大于原始数据大小。

您不会在文件中找到此数据,因为它不需要存在于此。引用数据(在代码部分中)的地址被烘焙到二进制文件中,以便它们在加载到内存中时指向正确的位置。

如果加载器没有预先保留这个空间,那么全局变量等在使用之前必须在堆上分配。

来自PE spec :

[SizeOfRawData is the] size of the section (for object files) or the size of the initialized data on disk (for image files). For executable images, this must be a multiple of FileAlignment from the optional header. If this is less than VirtualSize, the remainder of the section is zero-filled. Because the SizeOfRawData field is rounded but the VirtualSize field is not, it is possible for SizeOfRawData to be greater than VirtualSize as well. When a section contains only uninitialized data, this field should be zero.


编辑:回答有关 SizeOfUninitializedData 的问题。

Optional Header 中的SizeOfUninitializedData 字段就是.bss 部分的大小(如果有多个,则为它们的总和)。您的二进制文件没有用于该数据的单独部分,因此它为零。由于部分在特定边界上对齐,因此在现有部分的末尾节省一些空间可能比使用单独的部分更有效。

关于windows - 为什么有时 .data 部分的虚拟大小大于原始大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21648840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com