共享对象中的ELF重定位导致分段错误

我在十六进制编辑器中从头开始创建了无节的32位ARM ELF可执行文件,该文件从 glibc调用了两个函数:printf 以显示“ hello world”并退出以终止。我必须为包含 r_offset 字段的那些符号创建两个REL重定位条目。规范 https://refspecs.linuxbase.org/elf/gabi4+/ch4.reloc.html将该字段描述为:

  

r_offset
此成员提供了应用重定位操作的位置。对于可重定位文件,该值是从该节的开头到受重定位影响的存储单元的字节偏移量。对于可执行文件或共享对象,该值为受重定位影响的存储单元的虚拟地址。

当我创建EXEC(可执行文件)ELF时,我知道应将重定位应用到的虚拟地址,并且我可以运行可执行文件。通过将ELF类型更改为DYN(共享目标文件)(与位置无关的可执行文件),我遇到了分段错误,因为在将可执行文件加载到随机虚拟地址后应用了重定位,因此 r_offset 指向无法写入的内存区域。

如何为DYN类型的ELF创建正确的重定位条目?

hex dump of ELF
information from readelf

反汇编的机器代码:
加r0,pc,#0x18
mov lr,pc
ldr pc,[pc,#8]
mov r0,#0
mov lr,pc
ldr pc,[pc]

jllykg 回答:共享对象中的ELF重定位导致分段错误

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3141102.html

大家都在问