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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:20:00