如何在汇编语言中加载其他编译单元的函数指针?
解决方案
在x86_64架构的共享库中,不能直接使用32位重定位引用符号,必须采用PC相对寻址的64位重定位。修改caller.s中的leaq指令,通过GOT(全局偏移表)间接获取函数地址即可解决:
修改后的caller.s代码
.section .text .globl mymain .type mymain, @function mymain: # 以RIP为基准,定位到GOT中myfunc的条目地址 leaq myfunc@GOTPCREL(%rip), %rdi # 从GOT条目里取出myfunc的实际运行时地址 movq (%rdi), %rdi movq $0, %rax ret
原理说明
共享库中的全局符号地址需要通过GOT间接访问,确保动态加载器能在运行时完成正确重定位。myfunc@GOTPCREL(%rip)使用PC相对寻址生成R_X86_64_GOTPCREL类型的64位重定位,完全符合PIC(位置无关代码)的要求,避免了原代码中32位重定位的限制。
内容的提问来源于stack exchange,提问作者DJ Gruby
相关产品推荐
相关产品推荐

