Golang无法执行二进制文件:执行格式错误。

29

我的go环境

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH=""
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GO15VENDOREXPERIMENT=""
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"

我在我的Mac上编译并成功执行了二进制文件,然后将其复制到上面展示go env的Ubuntu机器上。当我调用myprog二进制文件时,我得到了以下结果

bash: /usr/local/go/bin/myprog: cannot execute binary file: Exec format error

4
你已经编译了适用于Darwin的二进制文件。同样的二进制文件无法在Linux上运行。你需要编译一个Linux版本的二进制文件。 - JimB
在使用Docker时遇到了错误。我已经在Docker上构建了一个镜像,并尝试在同一台Mac OS上运行二进制文件。 - Sharath BJ
5个回答

54

错误: /usr/local/go/bin/go: 3: 语法错误:未终止的引用字符串 - Emile Zäkiev

12

我曾经遇到过同样的问题。我安装了64位版本的go,而不是32位版本。安装了32位版本之后,它就正常工作了。


谢谢,我犯了同样的错误...下载了错误的文件架构(Linux而不是ARM) - Bilal
2
我下载了ARM版本,这就是问题所在。通过使用“uname -a”检查我的Linux架构后,安装正确的AMD版本解决了问题。https://unix.stackexchange.com/a/12454/429777 - Gudari

2
当我下载golang的x86版本时,遇到了这个问题,但我所提供的虚拟机是ARM架构的。你可以在此处获取ARM版本的下载链接:https://go.dev/dl/

谢谢,这正是在尝试在通过UTM模拟的Apple M1机器上安装Go时遇到的问题。他们推荐的Ubuntu版本实际上是arm64架构,因此适当的Go发行版确实需要具有“linux”和“arm64”功能组合。遗憾的是,Go的首页只提供amd版本供下载,并隐藏了所有其他版本:如果您不确定需要哪个版本,您将选择默认(可能错误)的版本。 - Emile Zäkiev

1
可能会出现这种情况,您的二进制文件与一些C库动态链接,但这些库在您的操作系统上未安装。如果您在不同的环境中编译二进制文件并在其他地方运行,则可能会发生这种情况。
要获取有关二进制文件的信息,您可以同时运行file ./your-binaryld ./your-binary
我建议阅读此帖子以获取解决该问题的一些解决方案:Go-compiled binary won't run in an alpine docker container on Ubuntu host 基本上,您有以下选项:
  • 在与编译相同的架构/操作系统上运行
  • 在目标操作系统上安装缺少的库
  • 尝试静态编译

0
在 Windows 上,请确保您(或您的 IDE)未运行 PowerShell - PowerShell 将不会接受 set GOOS 命令,也不会报错,但它仍然会编译二进制文件。当您将此二进制文件部署到服务器上时,您将遇到此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接