Golang - 从源码到二进制:探索在国产CPU架构上交叉编译Minio的方法

在这里插入图片描述


前置知识

交叉编译

交叉编译是指在一台主机上为另一种不同架构或操作系统的目标平台生成可执行程序或库。在C++中,交叉编译通常用于在开发机器上编译目标平台的程序,例如在使用x86架构的开发机器上编译ARM架构的程序。

交叉编译的原理包括以下几个关键步骤:

  1. 选择交叉编译工具链: 首先需要选择目标平台的交叉编译工具链,包括交叉编译器、链接器和标准库等。这些工具链需要能够将源代码编译成目标平台可执行的二进制文件。

  2. 配置环境: 在进行交叉编译之前,需要配置开发环境,以确保编译器和链接器能够正确识别目标平台的架构和操作系统。这可能涉及设置环境变量、配置编译器选项等。

  3. 编译源代码: 使用交叉编译工具链编译源代码。在编译过程中,编译器会根据目标平台的架构和操作系统生成相应的机器码。

  4. 链接生成可执行文件: 编译完成后,使用交叉链接器将编译生成的目标文件链接成可执行文件。链接器需要确保将目标平台特定的库链接到可执行文件中,以确保程序在目标平台上能够正确运行。

  5. 测试和调试: 完成交叉编译后,需要在目标平台上进行测试和调试,以确保生成的可执行文件能够正常运行并符合预期的行为。

总的来说,交叉编译的原理是通过选择合适的交叉编译工具链,并配置正确的环境,将源代码编译成适用于目标平台的可执行文件或库。这样可以在开发机器上方便地开发和调试针对不同平台的程序,提高了开发效率。

Go 交叉编译 (跨平台编译)


Go 支持的所有操作系统和体系结构组合

Go 中的 GOARCH 环境变量用于指定目标体系结构(Architecture),具体取决于要编译的目标平台。

以下是一些常见的可用值:

  1. 386:Intel x86 32 位架构。
  2. amd64:Intel x86 64 位架构(也称为 x86-64 或者 AMD64)。
  3. arm:ARM 32 位架构。
  4. arm64:ARM 64 位架构。
  5. ppc64:IBM PowerPC 64 位架构。
  6. ppc64le:IBM PowerPC 64 位小端架构。
  7. mips:MIPS 大端架构。
  8. mipsle:MIPS 小端架构。
  9. mips64:MIPS 64 位大端架构。
  10. mips64le:MIPS 64 位小端架构。
  11. s390x:IBM System z 64 位架构。
  12. wasm:WebAssembly 架构。
  13. loong64:LoongArch架构
  14. sw64: 申威架构

这些是一些常见的架构,实际上还有更多的架构可供选择,具体取决于 Go 编译器的支持和目标平台的要求。


列出 Go 支持的所有操作系统和体系结构组合

[root@VM-24-3-centos ~]# go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
freebsd/riscv64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/loong64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
wasip1/wasm
windows/386
windows/amd64
windows/arm
windows/arm64
[root@VM-24-3-centos ~]#

go tool dist list 是一个 Go 工具命令,用于列出 Go 支持的所有操作系统和体系结构组合。这个命令可以帮助开发者了解当前 Go 版本支持的目标平台,以便于进行交叉编译或者选择正确的目标平台。

当执行 go tool dist list 命令时,它会输出一系列的操作系统和体系结构组合,每个组合代表着 Go 可以编译运行的一个目标平台。这些组合通常以 GOOS/GOARCH 的形式列出,其中 GOOS 是操作系统的名称,GOARCH 是体系结构的名称。例如,linux/amd64 表示 Linux 操作系统上的 x86-64 体系结构。

下面是一个示例输出:

android/386
android/amd64
android/arm
android/arm64
darwin/386
darwin/amd64
darwin/arm
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
...

这些组合列出了 Go 可以编译运行的各种操作系统和体系结构,可以根据需要选择合适的组合来进行编译。


大端、小端

每日一博 - 大端(Big Endian)和小端(Little Endian)


minio使用的go版本

在这里插入图片描述


ABI

ABI(Application Binary Interface,应用二进制接口)是定义了应用程序与操作系统、库之间交互的规范。ABI版本指的是这个规范的不同版本,通常随着系统的发展和升级而更新。


官方下载

https://dl.min.io/server/minio/release/

在这里插入图片描述

官方提供了部分架构的minio二进制,但有些国产CPU架构下的包,是没有提供的,因此需要自行编译。


目标

我们要通过minio的源码 在x86上编译出来 能够在mips64 和 loongarch64架构下运行的minio的二进制包 。

顺便提一下: 如果仅仅是在特定的架构下编译特定的二进制包,直接使用 make命令即可 (make命令调用Makefile 文件中,也是调用了go build 编译工具链 )

在这里插入图片描述

在这里插入图片描述


编译loongarch架构下的minio

http://www.loongnix.cn/zh/toolchain/Golang/downloads-Go1.21/index.html

在这里插入图片描述

第一步:安装GO的运行环境: Golang - 使用CentOS 7 安装Golang环境


第二步:下载好minio的源码,这里我们选择 在这里插入图片描述 当然你也可以直接git clone .


第三部:编写build.sh

在这里插入图片描述

#!/bin/bash
export GOOS=linux
#export GOARCH=mips641e
export GOARCH=loong64

export GO111MODULE=on

export CGO_ENABLE=0
export PATH=/usr/local/go/bin:$PATH


go version
go env -w GOPROXY=https://goproxy.cn


cd minio


#go build -o minio-mips64el
go build -o minio-loongarch-2

echo  "build over"

在这里插入图片描述

在这里插入图片描述


编译mipsle架构下的minio


#!/bin/bash
export GOOS=linux
export GOARCH=mips64le

export GO111MODULE=on
export CGO_ENABLE=0
export PATH=/usr/local/go/bin:$PATH

go version
go env -w GOPROXY=https://goproxy.cn

cd minio

go build -o minio-mips64

echo  "build over"

在这里插入图片描述

静态链接 ,没有压缩


编译sw64架构下的minio

https://developer.wxiat.com/understand/ecologial/8

在这里插入图片描述
在这里插入图片描述

因为sw只提供了 1.16版本的 go . 所以 新版本使用了1.21 go版本的 minio ,无法编译。

故申威架构下只能支持低版本的minio .

编译方式同上。


#!/bin/bash
export GOOS=linux 
export GOARCH=sw64

export GO111MODULE=on

export CGO_ENABLE=0
export PATH=/usr/local/go/bin:$PATH


go version
go env -w GOPROXY=https://goproxy.cn

cd minio
go build -o minio-sw64

echo  "build over"

在这里插入图片描述

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值