【问题标题】:fork/exec aarch64-linux-gnu-gcc: exec format errorfork/exec aarch64-linux-gnu-gcc:执行格式错误
【发布时间】:2019-10-31 00:05:18
【问题描述】:

我有一个 makefile 说明

CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOARCH=arm64 GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/victoria-metrics-arm64 ./app/victoria-metrics

我已经安装了 aarch64-linux-gnu-gcc 之类的二进制文件

mkdir aarch64-toolchain
cd aarch64-toolchain/
wget http://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/aarch64-linux-gnu/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz
tar -Jxvf gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz

并将其导出到 Path 变量

uname -a 命令的输出给出

Linux prom 4.14.0-115.2.2.el7a.aarch64 #1 SMP Wed Nov 28 22:05:51 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux

现在我收到错误

CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOARCH=arm64 GO111MODULE=on go build -mod=vendor -ldflags "-X 'github.com/VictoriaMetrics/VictoriaMetrics/lib/buildinfo.Version=-20190716-133242-heads-master-0-gfb14f23'" -o bin/victoria-metrics-arm64 ./app/victoria-metrics
# runtime/cgo
fork/exec /usr/bin/aarch64-linux-gnu-gcc: exec format error
make: *** [victoria-metrics-arm64] Error 2

请帮助我解决问题。我被困了很久

【问题讨论】:

  • 您在 aarch64 上,但您安装了 x86_64 编译器,允许您交叉编译 aarch64。只需安装 gcc。
  • 感谢@KamilCuk 的回复。如果我使用 CC=gcc 那么它适用于我,但如果我必须使用 CC=aarch64-linux-gnu-gcc 用于 aarch64,是否有任何步骤可以让它运行。感谢您的快速响应
  • 这还不清楚。为什么“你必须”?你 aarch 64架构。 aarch64-linux-gnu-gcc 是一个交叉编译器。想想看。让我们从顶部开始。有一个x86_64-linux-gcc 编译器。它是用 C 语言编写的。它为 x86_64 架构编译代码。它是使用自己编译的,但是是旧版本,然后是自己编译的。好的。所以有aarch64-linux-gnu-gcc 编译器。它是用 C 编写的。它为aarch64 架构生成代码。然后用gcc 编译aarch-linux-gnu-gcc。它是为 x86_64 架构编译的编译器,可为 arch64 生成代码。
  • 术语“交叉编译”是为您所在的另一个架构进行编译。如果要交叉编译,则在 x86_64 架构上编译为 aarch64 架构。如果你为 aarch64 编译 aarch64 代码,这就像一个正常的编译,它只是 gcc 在那个架构上。你会得到“exec:格式错误”,因为程序是为 x86_64 架构编译的。然后你尝试在 aarch64 上运行它。它们是不相容的。在机器指令级别上,两种架构的汇编代码是不兼容的。所以你得到一个错误。你还想要什么?你有什么问题?
  • 我明白你的意思@KamilCuk。我知道如果我有 aarch64,那么我应该使用 CC=gcc 作为交叉编译器,对于 x86_64,我需要使用 CC=aarch64-linux-gnu-gcc。感谢您的帮助。

标签: gcc cross-compiling


【解决方案1】:

为 ARM 尝试纯 Go 构建。它最近在 VictoriaMetrics 中实现,并成为 ARM 的默认设置。它没有 cgo deps,因此可以在没有 C 工具链的情况下构建。见https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/README.md#arm-build

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多