gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:51:55 24 4
gpt4 key购买 nike

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

最佳答案

不久前我写了一个基本的 ELF 加载器,我记得你只向标记为“R_ARM_ABS32”的重定位条目添加偏移量。

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

我只是将我的 ELF 文件与打开的 --emit-relocs 链接起来。这样,链接器会完成所有的链接,它只是告诉我它做了什么,以便您可以在加载期间修复偏移量。

关于dynamic - 如何区分 .data.rel 部分中的可重定位符号和不可重定位符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com