我在试图弄清楚搬迁是如何进行的,但我似乎无法理解它。本文件描述了在重新定位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页中,解释了这个术语:
因此,我的问题是,重新定位函数中的哪些参数对应于公式中使用的参数?
发布于 2017-04-12 20:42:33
如果我看得对,但我不确定我读错了,它是这样的:
S是addr。B(S)是sectionaddr。A是rela->r_addend。T可能是从rela->r_info中的信息派生出来的;如果不是,我不知道您需要在哪里查找。这是一次非常复杂的搬迁。考虑从简单的(比如R_ARM_ABS16)开始。在动态加载器中,您不应该必须实现您链接到的规范中的所有重新定位类型,只需实现一个小子集。如果您似乎需要大量的重新定位类型,这可能是因为您试图将未链接的对象文件提供给动态加载器;您应该使用现有的ARM链接器将它们转换为共享对象。(对于GNU工具链,您如何做到这一点的第一个近似是gcc -shared foo.o -o foo.so。)
为架构提供现有的动态加载程序通常是一个很好的计划;这类事情的代码中往往隐藏着许多未记录的智慧。例如,这里是GNU‘s ld.so的手臂定位器。(LGPL)
https://stackoverflow.com/questions/43379029
复制相似问题