我写Linux下一个简单的用户空间ELF装载机(为什么吗?“乐”)。我此刻装载机是相当简单的,并设计成加载包含与位置无关的代码只静态链接的ELF文件。

通常,当一个程序被内核的ELF加载器加载,它被加载到其自身的地址空间。这样,数据段和代码段可以在如在ELF段指定了正确的虚拟地址被加载。

在我的情况,但是,我通过mmap请求从内核地址,并可能会或可能不会得到在ELF段要求的地址。这不是代码段的一个问题,因为它是与位置无关。然而,如果数据段没有在预期的地址加载,代码将不能够正确地引用存储在数据段任何东西。

事实上,我的装载机似乎很好地工作以简单的组件可执行不包含任何数据。但只要我添加一个数据段和引用它,可执行无法正确或段错误运行。

如何,如果可能的话,我可以修正内容的数据段的任何引用指向正确的位置?是否有存储在(静态)ELF文件用于此目的的重定位部?

有帮助吗?

解决方案

如果您修改的.got部分提供的绝对地址(全局偏移表),你的程序应该工作。一定要修改的绝对地址的计算,以满足的.text和。数据之间的新的距离,恐怕你需要弄清楚在这个信息来自于,你的架构。

请参阅此:全局偏移表(处理器特异性)

好运。

其他提示

我看不出有什么办法可以做到这一点,除非你完全效仿内核提供的虚拟地址空间,并运行该虚拟空间内的代码。当你的mmap从文件中的数据部分,您有内在它搬迁到您的ELF解释器的虚拟地址空间的一个未知的地址,你的代码将无法参考它以任何方式。

很高兴被证明是错误。有一些非常酷在这里学习。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top