Go 程序运行时出现 exec format error 错误,通常意味着 你试图在一个不兼容的系统架构或操作系统上运行一个可执行文件

这个错误的核心是:操作系统无法识别或加载该可执行文件的格式

以下是常见的原因和解决方法:

1. 跨平台编译问题(最常见)

这是最常见的原因。你在一台机器上编译了 Go 程序,然后试图在另一台不同架构或操作系统的机器上运行它。

  • 示例

    • 在你的 Mac (Apple Silicon M1/M2, darwin/arm64) 上编译了一个二进制文件。
    • 然后把它复制到一台 Linux x86_64 (linux/amd64) 的服务器上运行。
    • 结果就会报 exec format error,因为 Linux 无法理解 macOS 的 Mach-O 格式。
  • 解决方法: 使用 Go 的交叉编译功能,在编译时指定目标平台的 GOOS (操作系统) 和 GOARCH (架构)。

    1. # 假设你想为 Linux x86_64 编译
    2. GOOS=linux GOARCH=amd64 go build -o myapp main.go
    3. # 为 Windows 64位编译
    4. GOOS=windows GOARCH=amd64 go build -o myapp.exe main.go
    5. # 为旧版 Mac Intel 编译
    6. GOOS=darwin GOARCH=amd64 go build -o myapp main.go
    7. # 为新版 Mac Apple Silicon 编译
    8. GOOS=darwin GOARCH=arm64 go build -o myapp main.go

    将编译出的二进制文件放到对应的目标机器上运行。

2. 文件不是有效的可执行文件

你可能不小心尝试运行了一个非可执行文件。

  • 检查文件类型

    1. file your_program_name

    正常的输出应该类似于:

    • ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped (Linux)
    • Mach-O 64-bit executable arm64 (macOS)
    • PE32+ executable (console) x86-64, for MS Windows (Windows)

    如果输出是 ASCII text 或其他非可执行类型,说明你试图运行的是源代码或文本文件。

  • 解决方法: 确保你运行的是通过 go build 生成的二进制文件,而不是 .go 源文件。

    1. # 正确:先构建再运行
    2. go build main.go
    3. ./main
    4. # 错误:直接“运行”源文件(某些环境可能会尝试解释,但通常不行)
    5. ./main.go # 这很可能导致 exec format error

3. 目标机器缺少必要的依赖或 ABI 不兼容

虽然 Go 默认静态链接,但如果你使用了 CGO 或链接了外部库,可能会产生动态依赖。

  • 检查依赖 (Linux):
    1. ldd your_binary
    如果显示 not a dynamic executable,说明是静态链接,没问题。如果有未找到的库,则需要安装。

4. 文件损坏或下载不完整

如果二进制文件在传输过程中损坏,也可能导致此错误。

  • 解决方法:重新编译或重新下载。

排查步骤总结

  1. 确认你运行的是二进制文件,而不是 .go 源文件
  2. 使用 file <your_binary> 命令检查文件的实际格式
  3. 确认你的目标运行环境 (uname -a, arch, 或系统信息)。
  4. 使用正确的 GOOSGOARCH 进行交叉编译
  5. 确保文件权限正确 (chmod +x your_binary)。