Android无法识别可执行文件:ARM架构程序执行异常求助
嘿,这个报错看起来有点迷惑(估计是终端输入或者显示的小问题,应该是No such file or directory对吧?),我来帮你梳理几个最可能的原因和对应的解决步骤:
确认交叉编译工具链与设备架构匹配
Leagoo M5是32位ARM设备(armv7架构),你得确保交叉编译用的是对应armv7的工具链,而不是ARM64或者其他架构的。可以在本地编译机器上执行file armexe,看输出里的架构信息(比如ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)才是对的);也可以在设备终端执行uname -m,确认设备的架构是armv7l。如果工具链不匹配,重新用正确的工具链编译程序。检查程序依赖的动态链接库
很多C程序依赖系统的动态库(比如libc.so.6、libm.so.6),如果你的交叉编译环境用的库和设备系统里的不兼容,或者缺少某个依赖库,系统会伪装成“找不到程序”的错误。你可以在本地用readelf -d armexe | grep NEEDED列出程序需要的动态库,然后在设备上用ls /system/lib/或者ls /lib/检查这些库是否存在。如果缺少某个库,要么重新编译时静态链接(加-static参数,把库打包进程序),要么把对应的库传到设备的合适目录(比如/data/local/lib),再用export LD_LIBRARY_PATH=/data/local/lib:$LD_LIBRARY_PATH指定库路径后执行程序。验证文件传输与完整性
FTP传输时如果用了ASCII模式,二进制的程序文件会被损坏,导致系统无法识别。重新用FTP的二进制模式(比如输入binary命令切换模式)传输程序,然后在设备上用md5sum armexe和本地的文件MD5值对比,确认文件没有损坏。确认执行路径与权限
执行程序时,如果你不在/data/local目录下,一定要用绝对路径/data/local/armexe来执行,避免路径错误。另外,虽然你加了chmod +x,但可以再用ls -l /data/local/armexe确认权限位是否包含可执行权限(比如输出开头是-rwxr-xr-x)。还有,部分设备的SELinux可能会阻止非系统目录的程序执行,你可以先临时关闭SELinux试试:setenforce 0,然后再执行程序。
先从这几个方向排查,应该能找到问题所在~
内容的提问来源于stack exchange,提问作者Wiktor Sołtys

