我正在尝试为准系统 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?