gpt4 book ai didi

c - 可执行文件中的数据位于奇怪的位置

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:20 25 4
gpt4 key购买 nike

几天前,我开始玩 PE 格式。我已经完成了小型 PE 加载器,它能够根据虚拟地址将部分加载到内存中。例如,我在虚拟地址 0x1000 上有部分 .text,或者在 0x2000 上有部分 .data。使用我的小汇编代码,我在某个空闲位置 (0x10000) 加载了 PE 文件,并从它的位置加载了 PE 部分。因此,.text 部分位于 0x11000 (0x10000 + 0x1000),.data 位于 0x12000 等等... 但是当我从 .code 位置引用我的汇编数据时,我发现(在反汇编中)它指向 0x402000。在互联网上,我发现了类似图像库的东西,它特定于每种类型的图像......但我不明白如何将 .exe 加载到 0x402000 当有例如,许多在 Windows 中运行的可执行文件。有没有人为什么会这样,它是如何工作的以及我如何在我的非常基本的系统中理论上实现它?

请帮忙。

最佳答案

虚拟内存意味着您计算机上的每个进程都可以使用“相同”的地址,因为每个进程的地址空间都是独立的。进程 A 的 0x400000 被操作系统映射到与进程 B 的 0x400000 不同的物理地址,即使它们是相同的虚拟地址(不同的虚拟地址空间)。

可执行文件的默认基址是0x400000。您的链接器将该基地址硬编码到可执行文件中,并将适本地调整地址引用。当程序启动时,您的可执行文件将加载到该地址。您的汇编程序或链接程序应该为您提供一种更改此默认基地址的方法。

请注意,另一方面,DLL 必须加载到唯一的地址,因为它们必须共存于同一进程中。出于这个原因,DLL 通常可重定位,即它们在加载时可以具有任何基地址,以满足将它们放在唯一地址的要求。 (在一个系统上有多个不可重定位的 DLL 可能会导致问题,但在一个系统上有多个不可重定位的 .exe 则完全没有问题。)

关于c - 可执行文件中的数据位于奇怪的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15324629/

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