dynamic – 如何区分.data.rel部分中的可重定位符号和不可重定位符号

我正在尝试为准系统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偏移量,而不仅仅是0x1000.

我应该如何区分这两者?我检查.symtab部分并仅重新定位那里找到的地址是否足够?但是,如果一个符号实际上位于0x1000位置怎么办?或者链接器是否解决了这个问题(因此它不会将函数放在地址0x1000处)? .symtabs actuall是否包含.got和.data.rel中可以找到的所有符号?

最佳答案 我刚才写了一个基本的ELF加载器,我记得你只在标记为“R_ARM_ABS32”的重定位条目中添加了偏移量.

你可以在这里找到代码https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

我只是将我的ELF文件与–emit-relocs打开了.这样,链接器完成所有链接,它只是告诉我它做了什么,这样你就可以在加载时修复偏移量.

点赞