我有责任为ARM elf可重定位文件制作加载器。我设法以某种方式解析了精灵,并设法做了一些简单的重新安置,但我必须做以下事情,我有麻烦。我需要从我正在尝试加载的ELF文件中调用printf函数,并且它必须与尝试加载它的程序中的printf函数相同。 (这是我的主机程序,用ARM arch编写的c ++)。我怎样才能得到这个printf地址,之后如何重新定位elf文件中的符号。 (我用Google搜索并发现这种类型的重定位使用24位PC相对寻址)任何人都可以帮我提取printf的地址吗? Thanx提前!
答案 0 :(得分:1)
答案 1 :(得分:0)
如果您能理解C ++,请使用源Luke。
请参阅:Assemblers and Loader, David Solomon 。 [一些智慧的珍珠,一些古老的琐事]
据我了解,printf
位于同一个文件中,您需要在运行时修补该地址。在这种情况下,重定位是 24位PC相对重定位。答案是你在这种情况下什么都不做。由于可执行文件和实现都在相同的二进制文件中,因此 24位PC相对
无论加载地址是什么,都已经重新定位。
如果要重新定位共享库,则过程会有所不同。
答案 2 :(得分:0)
我找到了解决方案。当我得到(unsigned int)printf时,我得到了实际的32位函数地址。必须将修补程序代码添加到ELF文件中的文本末尾部分。现在需要24位偏移量,将偏移量插入补丁码。现在这个补丁代码很难做到。
编辑:
这样的事情:
bl printf应该像bl offset_to_patch_code
一样解决补丁代码应位于.text部分的底部。当计算偏移管道时,请注意提前pc指令2指令。补丁代码应该只服务器读入printf的pc地址。您无需保存链接寄存器。