我正在尝试为裸机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
中找到的符号?