加载时间ELF重定位

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

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

但是,在我的情况下,我通过mmap从内核请求地址,可能会或可能不会获得ELF段中请求的地址。 这是代码段的问题,因为它是独立的。 但是,如果数据段没有加载到预期的地址,则代码将无法正确引用存储在数据段中的任何内容。

事实上,我的加载程序似乎工作正常与一个简单的程序集可执行文件不包含任何数据。 但是,只要我添加一个数据段并引用它,可执行文件无法正确运行或SEGFAULT。

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

Solutions Collecting From Web of "加载时间ELF重定位"

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

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

祝你好运。

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

很高兴被证明是错误的。 在这里学习很酷。