如何区分.data.rel部分中的可重定位符号和不可重定位符号

时间:2012-03-09 14:33:45

标签: dynamic linker arm relocation

我正在尝试为准系统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部分并仅重新定位那里找到的地址是否足够?但是如果符号实际位于0x1000位置怎么办?或者链接器是否解决了这个问题(因此它不会在地址0x1000处放置函数)? .symtabs是否包含.got.data.rel中可以找到的所有符号?

1 个答案:

答案 0 :(得分:2)

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

您可以在https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

找到代码

我只是在启用了--emit-relocs的情况下链接了我的ELF文件。这样,链接器会完成所有链接,只是告诉我它做了什么,这样你就可以在加载时修复补偿。