[英]ELF relocation on ARM Cortex-M3
我想弄清楚搬迁的工作原理,但我似乎无法理解它。 本文档描述了重定位ELF文件时可能遇到的不同类型。
我们以R_ARM_ALU_SB_G0_NC
(#70)为例。
我猜这个数学表达式是我正在寻找的操作。 但是,我并不完全理解这是如何适合我的功能的。 重定位发生的方法如下:
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
是addr
。 B(S)
是sectionaddr
。 A
是rela->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.