5

我正在尝试为准系统 ARM 应用程序创建一个简单的链接器。目前,加载模块的加载器只会将偏移量添加到.got.data.rel部分内的所有记录中。这适用于.got所有需要重定位的符号.data.rel。对于所有不可重定位的数据,它都会中断,因为这些数据也会得到这个偏移量。

例子:

void some_function() { return; }

struct a {
    void* fptr;
    int number;
};

static struct a = {
   .fptr = some_function,
   .number = 0x1000,
};

这里a.fptr将正确处理函数的实际位置,但a.number会错误地持有0x1000 + offset,而不仅仅是0x1000.

我应该如何区分这两者?我检查该.symtab部分并仅重新定位在那里找到的地址就足够了吗?但是如果一个符号实际上是在 location0x1000呢?或者链接器是否解决了这个问题(所以它不会在 address 放置一个函数0x1000)?实际上是否.symtabs包含可以在.gotand中找到的所有符号.data.rel

4

1 回答 1

3

不久前我写了一个基本的 ELF 加载器,我记得你只向标记为“R_ARM_ABS32”的重定位条目添加偏移量。

你可以在这里找到代码https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

我只是将我的 ELF 文件与打开的 --emit-relocs 链接起来。这样,链接器会完成所有的链接,它只是告诉我它做了什么,以便您可以在加载期间修复偏移量。

于 2012-03-11T06:55:05.823 回答