Android设备使用GCC工具链编译C/C++遇execv权限错误求助
我来帮你排查这个execv permission denied的问题——虽然你已经拿到root权限,而且之前成功运行过C程序,但这个错误针对的是GCC内部的cc1编译前端,大概率是工具链的深层文件权限没设置到位,或者是Android的SELinux在搞鬼,下面给你几个针对性的解决方案:
1. 递归修复整个工具链的可执行权限
你提到把工具链复制到了data目录,但可能只给了bin目录下的文件权限,而cc1藏在libexec/gcc/arm-linux-androideabi/6.1.0/这个子目录里,没被赋予可执行权限。直接递归给整个工具链加权限:
su # 替换成你的GCC工具链实际路径,比如/data/local/android-gcc chmod -R +x /path/to/your/gcc-toolchain
执行完之后再重新编译你的test.c试试。
2. 临时关闭SELinux(Android常见坑)
即使有root权限,Android的SELinux强制模式可能会阻止执行data目录下的某些二进制文件。你可以临时关闭它测试:
su setenforce 0
然后再运行编译命令,如果成功了,说明是SELinux的限制导致的。如果需要永久解决,可以修改SELinux策略,但临时关闭足够验证问题。
3. 确认工具链与设备架构匹配
虽然你用的是arm-linux-androideabi-gcc,但要确保你的设备是ARM架构(不是x86/x86_64)。可以先查看设备架构:
uname -m
如果输出是aarch64,那你需要用aarch64-linux-android-gcc对应的64位工具链,否则会出现执行错误(有时候也会伪装成权限问题)。
4. 尝试指定sysroot路径(可选)
部分Android GCC工具链需要明确指定sysroot路径才能正常工作,虽然你的错误是权限问题,但路径配置异常也可能触发奇怪的报错。编译时加上--sysroot参数:
# 替换成工具链自带的sysroot目录路径,比如工具链目录下的sysroot文件夹 ./arm-linux-androideabi-gcc --sysroot=/path/to/toolchain/sysroot -o test test.c
先试试前两个方法,这是最常见的解决思路,应该能搞定你的问题。
内容的提问来源于stack exchange,提问作者Yamin

