我正在 Linux 下编写一个简单的用户空间 ELF 加载程序(为什么?为了“好玩”)。目前我的加载器非常简单,旨在仅加载包含位置无关代码的静态链接 ELF 文件。
通常,当一个程序被内核的 ELF 加载器加载时,它被加载到它自己的地址空间中。因此,数据段和代码段可以加载到 ELF 段中指定的正确虚拟地址。
然而,在我的例子中,我通过 mmap
从内核请求地址,并且可能会或可能不会获得 ELF 段中请求的地址。这对代码段来说不是问题,因为它与位置无关。但是,如果数据段未加载到预期地址,代码将无法正确引用存储在数据段中的任何内容。
事实上,我的加载程序似乎可以很好地处理不包含任何数据的简单程序集可执行文件。但是一旦我添加数据段并引用它,可执行文件就无法正确运行或出现 SEGFAULT。
如果可能的话,我如何修复对数据段的任何引用以指向正确的位置?是否为此目的在(静态)ELF 文件中存储了重定位部分?
最佳答案
如果您修改 .got 部分中可用的绝对地址,(全局偏移表)您的程序应该可以运行。确保修改绝对地址计算以适应 .text 和 .data 之间的新距离,恐怕您需要为您的架构弄清楚此信息的来源。
看这个:Global Offset Table (Processor-Specific)
祝你好运。
关于c - 加载时 ELF 重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1349120/