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
相关产品推荐
相关产品推荐

