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

Android平台AArch64汇编动态库编译链接报错求助

解决Android AArch64汇编动态库的TEXTREL错误

问题根源

错误提示的text relocations是因为你的动态库代码中使用了绝对地址访问数据段,Android从API 23开始禁止共享库包含文本重定位(TEXTREL)——这类重定位需要在加载时修改文本段内容,既不安全也会影响性能。

你代码里的ldr x1, =buffer1会在文本段生成一个指向buffer1绝对地址的立即数,当共享库被加载到随机地址时,系统需要修改这个立即数,这就触发了TEXTREL。

修正方案:编写位置无关的汇编代码

AArch64平台的共享库必须使用位置无关代码(PIC),访问本地数据段时需要用基于PC的相对寻址(adrp + add指令组合),而非直接加载绝对地址。

修正后的动态库代码(LibTest.s)

.global printHello

.section .text

printHello:
        mov x8, #64          // sys_write系统调用号
        mov x0, #1           // 标准输出文件描述符
        adrp x1, buffer1     // 加载buffer1所在页的基地址到x1
        add x1, x1, :lo12:buffer1  // 加上低12位偏移,得到buffer1完整地址
        mov x2, #14          // 字符串长度("Hello, world!\n"共14字节)
        svc 0                // 触发系统调用
        ret

.section .data
buffer1: .ascii "Hello, world!\n"

重新编译链接动态库

编译时需添加-fPIC参数(告诉汇编器生成位置无关代码),链接时保持-shared:

as -fPIC LibTest.s -o LibTest.o
ld LibTest.o -o libTest.so -shared

修正主程序的链接命令

你原命令漏掉了.o后缀,正确命令如下:

as Main.s -o Main.o
ld -pie -dynamic-linker=/system/bin/linker64 -L. -lTest Main.o -o Main.elf

验证运行

现在执行./Main.elf即可正常输出Hello, world!。

内容的提问来源于stack exchange,提问作者Marcos Barceló Pérez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:22:08