c - 加载时 ELF 重定位

标签 c linux loader elf

我正在 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/

相关文章:

c - 创建了多少进程

php - 通过 PHP 的 exec 在 Linux Web 服务器上执行二进制文件

jquery - 我试图在 Jquery Ajax 调用之前显示 Loader,但它不起作用

iphone - 如何更改您的 Xcode iTunes Connect 登录名?

actionscript-3 - 将 AS2 swf 加载到 AS3 swf 时出现问题

c - 如何创建保存从 0000 到 1000 的银行帐号的随机访问文件

char ** 我应该分配 (char*) 的大小还是 char * 字符串长度的大小?

系统 dll 的副本不起作用

linux - Rsync备份无法在备份服务器上创建目录

c - 我用了wait(&status),status的值为256,为什么?