gpt4 book ai didi

c - ARM Cortex-M3 上的 ELF 重定位

转载 作者:太空宇宙 更新时间:2023-11-04 04:24:04 25 4
gpt4 key购买 nike

我想弄清楚重定位是如何工作的,但我似乎无法理解它。 This document描述了在重定位 ELF 文件时可能遇到的不同类型。

我们以 R_ARM_ALU_SB_G0_NC (#70) 为例。

  • 类型:静态
  • 类别:ARM,描述了搬迁地点的类型(我不明白)
  • 运算:((S + A) | T) – B(S))

我猜数学表达式就是我正在寻找的操作。但是,我不完全理解这如何适合我的职能。发生重定位的方法如下所示:

int elfloader_arch_relocate(int input_fd, struct elfloader_output *output,
unsigned int sectionoffset, char *sectionaddr, struct elf32_rela *rela, char *addr)

input_fd是ELF文件的文件描述符,*output是写输出段时使用的,sectionoffset是文件偏移量在其中可以找到重定位,*sectionaddr是段起始地址(绝对运行时),*addr是重定位地址。32位的重定位结构是这样的

 struct elf32_rela {
elf32_addr r_offset;
elf32_word r_info;
elf32_sword r_addend;
};

在上面提到的第26页document术语解释:

  • S(单独使用时)是符号的地址。
  • A 是重定位的加数。
  • 如果目标符号 S 的类型为 STT_FUNC 且该符号寻址 Thumb 指令,则 T 为 1;否则为 0。
  • B(S)是定义符号的输出段的寻址原点

所以我的问题是,relocate 函数中的哪些参数对应于公式中使用的参数?

最佳答案

如果我没看错,但我不确定自己是否看对了,它会是这样的:

  • Saddr
  • B(S)sectionaddr
  • Arela->r_addend
  • T 可能可从 rela->r_info 中的信息导出;如果没有,我不知道你需要去哪里找。

这是一个看起来非常复杂的搬迁。考虑从简单的开始(例如 R_ARM_ABS16)。在动态加载器中,您应该不必必须实现您链接到的规范中的所有重定位类型,而只需实现一小部分。如果看起来您需要很多重定位类型,这可能是因为您试图将未链接的目标文件 提供给动态加载器;您应该使用现有的 ARM 链接器将它们变成共享对象。 (使用 GNU 工具链,第一个近似方法是 gcc -shared foo.o -o foo.so。)

为架构取消现有的动态加载器通常是一个好计划;此类事情的代码中往往隐藏着许多未记录的智慧。例如,这里是 GNU libc's ld.so's ARM relocator . (LGPL)

关于c - ARM Cortex-M3 上的 ELF 重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43379029/

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