【发布时间】:2010-11-23 20:42:00
【问题描述】:
我正在 Linux 下编写一个简单的用户空间 ELF 加载程序(为什么?为了“好玩”)。目前我的加载器非常简单,旨在仅加载包含与位置无关的代码的静态链接 ELF 文件。
通常,当一个程序被内核的 ELF 加载器加载时,它会被加载到它自己的地址空间中。因此,数据段和代码段可以加载到 ELF 段中指定的正确虚拟地址。
然而,就我而言,我通过mmap 向内核请求地址,并且可能会或可能不会获得ELF 段中请求的地址。这对于代码段来说不是问题,因为它与位置无关。但是,如果数据段没有加载到预期的地址,代码将无法正确引用存储在数据段中的任何内容。
确实,我的加载器似乎可以与不包含任何数据的简单程序集可执行文件一起正常工作。但是只要我添加一个数据段并引用它,可执行文件就无法正确运行或 SEGFAULTs。
如果可能的话,我如何修复对数据段的任何引用以指向正确的位置?为此目的,(静态)ELF 文件中是否存储了重定位部分?
【问题讨论】:
-
在提供请求的地址时 mmap() 失败的原因是因为调用 mmap 的进程已经在其地址空间中分配了这些页面吗?
-
是的,大概就是这个原因。我曾想过让
ld将我的代码/数据放在“不碍事”的某个地方,但我想知道是否可以首先使用通用解决方案。如果我在这里没有得到任何回复,我可能会继续尝试。