对于 Windows NT/10 上的可移植可执行文件,堆是如何以及在哪里分配的?

Posted

技术标签:

【中文标题】对于 Windows NT/10 上的可移植可执行文件,堆是如何以及在哪里分配的?【英文标题】:How and where is the heap allocated in regards to a portable executable on Windows NT/10? 【发布时间】:2017-03-08 01:00:30 【问题描述】:

我目前正在研究 Portable Executable 文件格式,并且我已经了解了 9 个常见部分,例如 .code、.data、.rdata、.debug 等......但是,一条信息似乎在我读过的论文中,我读过的文件中没有提到的是程序“堆”在内存中与这些部分有关的位置(地址空间),以及它是如何分配的。它是这些数据部分之一的一部分吗?我听说它出现在 .bss 部分之后的谣言,但这些只是谣言。当 Windows 加载程序加载 PE 时,甚至有一个设置的堆大小(当然对于每个特定的 exe),如果有,它基于什么?

【问题讨论】:

【参考方案1】:

IMAGE_OPTIONAL_HEADER 中有几个字段控制默认进程堆 (GetProcessHeap) 的初始大小,但堆本身不是 PE 布局的一部分。

程序可以使用HeapCreate 创建额外的堆。堆还可以在不同的模式下运行(序列化或非序列化),还有一个low-fragmentation heap 实现。

您可以使用VMMap 查看堆在虚拟内存中的位置,但您不应依赖此信息。 ASLR will move them 如果您重新启动计算机。

【讨论】:

以上是关于对于 Windows NT/10 上的可移植可执行文件,堆是如何以及在哪里分配的?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录

LNK2019:从 Windows 到 OSX 的可移植性

没有广泛 API 的可移植 UTF-8 接口(Windows 和 Unix)

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码

MySql SQL 脚本的可移植性,MySql 可以执行的注释代码