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

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


1
我一段时间前写了一个基本的 ELF 加载器,记得只向标记为“R_ARM_ABS32”的重定位条目添加偏移量。你可以在这里找到代码 https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c - tangrs
如何向 ELF 文件添加重定位项?readelf 显示没有,但我使用 -r -fpic 进行编译/链接。(顺便说一句,您应该将此作为答案添加,以便我可以点赞) - SztupY
1个回答

3
我之前写过一个基本的ELF加载器,我记得你只需要向标记为“R_ARM_ABS32”的重定位项添加偏移量。
你可以在这里找到代码 https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c 我只是简单地将我的ELF文件链接到了打开"--emit-relocs"选项的状态。这样,连接器就完成了所有的链接工作,它只是告诉我它所做的,以便您可以在加载时修正偏移量。

实际问题是我使用了gcc,所以我必须在命令行中使用“-Xlinker --emit-relocs”。启用重定位后,任务变得容易了。 - SztupY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接