繁体   English   中英

ARM Cortex-M3上的ELF重定位

[英]ELF relocation on ARM Cortex-M3

我想弄清楚搬迁的工作原理,但我似乎无法理解它。 本文档描述了重定位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页,解释了术语:

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

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

如果我正在读这个,我不确定我是,它是这样的:

  • Saddr
  • B(S)sectionaddr
  • Arela->r_addend
  • T 可以rela->r_info信息rela->r_info ; 如果没有,我不知道你需要在哪里看。

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

为建筑物提供现有的动态装载机通常是一个很好的计划; 在这些事情的代码中,往往会埋藏许多无证的智慧。 例如,这里是GNU libc的ld.so的ARM重定位器 (LGPL)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM