Szt*_*upY 5 linker arm dynamic relocation
我正在尝试为准系统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,
};
Run Code Online (Sandbox Code Playgroud)
此处a.fptr
将正确解决该函数的实际位置,但a.number
将错误地保持0x1000 + offset
,而不是0x1000
。
我应该如何区分两者?.symtab
仅检查该部分并仅重定位在此找到的地址就足够了吗?但是,如果符号实际上位于该位置0x1000
怎么办?还是链接程序解决了这个问题(因此它将不会在address放置函数0x1000
)?.symtabs
实际上是否包含在.got
和中可以找到的所有符号.data.rel
?
我不久前编写了一个基本的 ELF 加载程序,我记得您只向标记为“R_ARM_ABS32”的重定位条目添加偏移量。
您可以在这里找到代码https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c
我只是在打开 --emit-relocs 的情况下链接我的 ELF 文件。这样,链接器就会完成所有链接,它只是告诉我它做了什么,以便您可以在加载期间修复偏移量。
归档时间: |
|
查看次数: |
1080 次 |
最近记录: |