Android平台aarch64架构下C程序编译链接后执行异常求助
问题分析与解决方案
第一个错误:无法执行,找不到所需文件(错误码127)
在Android aarch64平台下,直接用ld链接时若不指定正确的动态链接器,系统会找不到对应的加载程序。标准Linux的动态链接器路径(如/lib64/ld-linux-aarch64.so.1)在Android中不存在,Android使用的是/system/lib64/ld-android.so。你后续尝试指定动态链接器的方向是对的,但还有两处关键问题需要修正:
- 代码使用
_start作为入口函数,会跳过Android libc的初始化流程,导致printf等函数无法正常工作,甚至引发加载错误。Android的libc依赖标准main函数完成初始化(比如stdio缓冲区设置)。
第二个错误:权限拒绝(Permission denied),chmod无效
这种情况通常由两个原因导致:
- SELinux限制:Android默认开启SELinux强制模式,即便设置了777权限,若文件的SELinux上下文标签不正确,仍会被阻止执行。
- 文件系统挂载属性:如果程序放在SD卡或其他挂载为
noexec的分区,即便权限正确也无法执行,必须放到/data/local/tmp这类允许执行的目录。
完整解决步骤
1. 修正代码入口
将_start改为标准main函数:
#include <stdio.h> int main(){ printf("Hello, world!\n"); return 0; }
2. 正确编译链接
推荐直接用gcc编译(会自动处理libc初始化和动态链接器配置):
gcc Test.c -o Test.elf
若必须分步编译链接,执行以下命令:
# 编译生成目标文件 gcc -c Test.c -o Test.o # 链接时指定Android动态链接器和libc路径 ld Test.o -o Test.elf -lc --dynamic-linker=/system/lib64/ld-android.so -L/system/lib64
3. 解决权限问题
- 将程序移动到允许执行的目录,比如
/data/local/tmp:
mv Test.elf /data/local/tmp/ cd /data/local/tmp/
- 调整SELinux上下文(若仍有权限问题):
chcon u:object_r:shell_exec:s0 Test.elf
- 赋予执行权限:
chmod +x Test.elf
4. 运行程序
./Test.elf
内容的提问来源于stack exchange,提问作者Marcos Barceló Pérez
相关产品推荐
相关产品推荐

