加载时ELF重定位

时间:2009-08-28 20:17:15

标签: c linux loader elf

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

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

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

实际上,我的加载器似乎可以正常使用不包含任何数据的简单程序集可执行文件。但是一旦我添加数据段并引用它,可执行文件就无法正常运行或SEGFAULTs。

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

2 个答案:

答案 0 :(得分:8)

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

请参阅:Global Offset Table (Processor-Specific)

祝你好运。

答案 1 :(得分:4)

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

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