You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在汇编语言中加载其他编译单元的函数指针?

解决方案

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:38:15