在Android物理设备运行Go程序遇“not executable: 64-bit ELF file”问题求助
解决Android x86_64设备运行Go编译程序报错问题
问题根源
你的Android设备架构是x86_64,但编译时指定了GOARCH=arm64,生成的是arm64架构的ELF可执行文件,和设备硬件架构不匹配,导致设备无法识别运行。
至于不指定CC时Hello World能运行,大概率是Android的x86_64设备内置了arm64二进制仿真层,能兼容Go默认编译的动态链接型arm64程序(依赖系统bionic libc),但你用musl-gcc编译的是静态链接musl libc的arm64程序,仿真层无法处理这种纯musl静态编译的二进制,因此报错。
解决步骤
匹配设备架构编译
把编译参数里的GOARCH改成amd64(对应x86_64架构),保持GOOS=linux不变:GOOS=linux GOARCH=amd64 go build -o hello hello.go这样生成的程序直接适配设备架构,无需仿真,运行不会有问题。
如果需要用musl编译静态程序
你现在用的是aarch64的musl交叉编译器,要换成x86_64版本的musl工具链:- 下载
x86_64-linux-musl-cross工具链并解压到本地目录 - 编译时指定对应路径的CC:
GOOS=linux GOARCH=amd64 CC=~/x86_64-linux-musl-cross/bin/x86_64-linux-musl-gcc go build -ldflags="-s -w" -o hello_static hello.go
编译完成后可以用
file hello_static验证,输出应该包含x86_64和statically linked字样。- 下载
验证程序兼容性
把编译好的文件传到Android设备后,记得先赋予执行权限:adb push hello /data/local/tmp/ adb shell chmod +x /data/local/tmp/hello adb shell /data/local/tmp/hello
内容的提问来源于stack exchange,提问作者Raul Cejas
相关产品推荐
相关产品推荐

