我想弄清楚重定位是如何工作的,但我似乎无法摆脱困境。 This document描述了重定位ELF文件时可能遇到的不同类型。在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中提到document的命名法是说明页:
- S(单独使用时)是符号的地址。
- A是重新安置的加数。
- 如果目标符号S具有类型STT_FUNC并且符号寻址Thumb指令,则T为1;否则为0。
- B(S)是输出段定义符号
所以我的问题是,其在重定位函数的参数的对应于式中所使用的那些的寻址原点?
你在哪里做重定位,你有一个在cortex-m3上有一个elf分析器的操作系统吗? –
我正在使用Contiki OS 2.7,因此我只需要编写一些与处理器相关的函数,如'elfloader_arch_relocate()' – boortmans
我不清楚您是在实现_linker_还是_loader_。链接器作为编译的最后阶段运行,将“目标文件”转换为“可执行文件”和“共享库”。加载程序作为执行的第一阶段运行,以便在将可执行程序和共享库引入内存时“修复”它们。链接器必须处理比装载器更多的重定位类型。请说出你的意思。 – zwol