我正在尝试为准系统 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
包含可以在.got
and中找到的所有符号.data.rel
?