linux - cgo从amd64(linux)交叉编译到arm64(linux)

标签 linux cross-compiling cgo gccgo

我正在尝试使用基于arm64的so从“amd64”构建“arm64”架构的go代码。当我使用共享库构建 go 代码时,出现以下错误。有人可以帮助我吗?

Go版本: go1.10.3 linux/amd64

海湾合作委员会版本: gcc版本7.3.0(Ubuntu 7.3.0-21ubuntu1~16.04)

去环境:

GOARCH="arm64"
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
CGO_ENABLED="1"

错误: 去构建 hello.go

# runtime/cgo
gcc_arm64.S: Assembler messages:
gcc_arm64.S:27: Error: no such instruction: `stp x19,x20,[sp,'
gcc_arm64.S:28: Error: no such instruction: `stp x21,x22,[sp,'
gcc_arm64.S:29: Error: no such instruction: `stp x23,x24,[sp,'
gcc_arm64.S:30: Error: no such instruction: `stp x25,x26,[sp,'
gcc_arm64.S:31: Error: no such instruction: `stp x27,x28,[sp,'
gcc_arm64.S:32: Error: no such instruction: `stp x29,x30,[sp,'
gcc_arm64.S:33: Error: too many memory references for `mov'
gcc_arm64.S:35: Error: too many memory references for `mov'
gcc_arm64.S:36: Error: too many memory references for `mov'
gcc_arm64.S:37: Error: too many memory references for `mov'
gcc_arm64.S:39: Error: no such instruction: `blr x20'
gcc_arm64.S:40: Error: no such instruction: `blr x19'
gcc_arm64.S:42: Error: no such instruction: `ldp x29,x30,[sp],'
gcc_arm64.S:43: Error: no such instruction: `ldp x27,x28,[sp],'
gcc_arm64.S:44: Error: no such instruction: `ldp x25,x26,[sp],'
gcc_arm64.S:45: Error: no such instruction: `ldp x23,x24,[sp],'
gcc_arm64.S:46: Error: no such instruction: `ldp x21,x22,[sp],'
gcc_arm64.S:47: Error: no such instruction: `ldp x19,x20,[sp],'

执行代码:

package main
/*
#cgo CFLAGS: -I./cgolang/include
#cgo LDFLAGS: -L./cgolang/lib  -laxxxxxx
#include "axxxxxx.h"
*/
import "C"
import "fmt"

func main() {
fmt.Printf("hello, world\n")
}

最佳答案

当我需要使用 cgo 构建静态 Go 二进制文件时,我遇到了类似的问题,该二进制文件最终将在具有 arm64 架构的 alpine 容器中运行,但必须构建在具有 x86_64 架构的 golang:alpine 容器中(我无法控制 CI/CD 运行程序架构)。

我像@jesse的答案一样解决了这个问题,但想包含一个完整的示例,因为我对在哪里获取交叉编译器以及要使用其中的哪些文件感到困惑。以下是在容器用户的主目录中下载/解压 CC 并在基于 /usr/src/example 的 go 构建中使用它的示例。生成一个名为 exampleApp 的可执行文件。

wget -P ~ https://musl.cc/aarch64-linux-musl-cross.tgz
tar -xvf ~/aarch64-linux-musl-cross.tgz -C ~
cd /usr/src/example
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=~/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc go build -o exampleApp -a -ldflags=-extldflags=-static . 

正在运行file关于exe输出验证它是静态链接的 aarch64。然后我就可以在其他地方的 arm64 alpine 容器中运行它。

关于linux - cgo从amd64(linux)交叉编译到arm64(linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51475992/

相关文章:

c++ - 是否有基于 C++ 的 Debian Linux Web 应用程序框架,如 .NET 框架

linux - 是否可以在 Linux 上为其他平台创建二进制文件?

javascript - 将 Flex/Flash 交叉编译为 Javascript

linux - 在 Linux 上,如何确保解锁锁定在死亡/终止线程中的互斥量?

linux - 在 bash 中替换太多的 if 语句

c++ - 以编程方式 LD_PRELOAD

c++ - 交叉编译时CMake GTest fatal error (缺少stdlib.h)

c - 从 Go 初始化灵活数组 C 结构成员

通过 go 模块的内存地址从 .so 文件调用 C 函数。 (cgo)

c - 为什么cgo的性能这么慢?我的测试代码有问题吗?