21

我正在 Linux 下编写一个简单的用户空间 ELF 加载程序(为什么?为了“有趣”)。目前我的加载器非常简单,旨在仅加载包含与位置无关的代码的静态链接的 ELF 文件。

通常,当一个程序被内核的 ELF 加载器加载时,它会被加载到它自己的地址空间中。因此,数据段和代码段可以加载到 ELF 段中指定的正确虚拟地址。

但是,就我而言,我通过 向内核请求地址mmap,并且可能会或可能不会获得 ELF 段中请求的地址。这对于代码段来说不是问题,因为它与位置无关。但是,如果数据段未加载到预期地址,代码将无法正确引用存储在数据段中的任何内容。

事实上,我的加载器似乎可以很好地处理一个不包含任何数据的简单程序集可执行文件。但是只要我添加一个数据段并引用它,可执行文件就无法正确运行或 SEGFAULTs。

如果可能的话,我如何修复对数据段的任何引用以指向正确的位置?为此目的,(静态)ELF 文件中是否存储了重定位部分?

4

2 回答 2

8

如果您修改 .got 部分中可用的绝对地址(全局偏移表),您的程序应该可以工作。确保修改绝对地址计算以适应 .text 和 .data 之间的新距离,恐怕您需要为您的架构弄清楚这些信息的来源。

请参阅:全局偏移表(特定于处理器)

祝你好运。

于 2009-09-30T08:35:37.947 回答
4

我看不出有任何方法可以做到这一点,除非您完全模拟内核提供的虚拟地址空间,并在该虚拟空间内运行代码。当您从文件中映射数据部分时,您本质上是将其重新定位到 ELF 解释器的虚拟地址空间的未知地址,并且您的代码将无法以任何方式引用它。

很高兴被证明是错误的。这里有一些很酷的东西要学。

于 2009-09-06T12:52:22.177 回答