我正在尝试为准系统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
中可以找到的所有符号?
答案 0 :(得分:2)
我刚才写了一个基本的ELF加载器,我记得你只是为标记为“R_ARM_ABS32”的重定位条目添加了偏移量。
您可以在https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c
找到代码我只是在启用了--emit-relocs的情况下链接了我的ELF文件。这样,链接器会完成所有链接,只是告诉我它做了什么,这样你就可以在加载时修复补偿。