首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang - 从源码到二进制:探索在国产CPU架构上交叉编译Minio的方法

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

作者头像
小小工匠
发布于 2024-05-26 04:31:54
发布于 2024-05-26 04:31:54
1.1K00
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

前置知识

交叉编译

交叉编译是指在一台主机上为另一种不同架构或操作系统的目标平台生成可执行程序或库。在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 支持的所有操作系统和体系结构组合
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 体系结构。

下面是一个示例输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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版本指的是这个规范的不同版本,通常随着系统的发展和升级而更新。


官方下载

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


目标

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

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


编译loongarch架构下的minio

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


第二步:下载好minio的源码,这里我们选择

当然你也可以直接git clone .


第三部:编写build.sh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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

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

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

编译方式同上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言交叉编译工具gox
交叉编译是为了在不同平台编译出其他平台的程序,比如在Linux编译出Windows程序,在Windows能编译出Linux程序,32位系统下编译出64位程序,今天介绍的gox就是其中一款交叉编译工具。
平也
2020/04/03
1.8K0
Go语言交叉编译,跨平台执行
程序交叉编译后就可以在各操作系统执行,非Java或Python依赖虚拟机,Go编译后不依赖虚拟机。
助安社区
2023/03/05
1.8K0
深入了解 Golang 多架构编译:交叉编译最佳实践
随着软件开发领域的不断发展,我们面临着越来越多的挑战,其中之一是如何在不同的平台和架构上部署我们的应用程序。Golang(Go)作为一种现代化的编程语言,具有出色的跨平台支持,通过其强大的多架构编译功能,可以轻松实现在各种操作系统和硬件架构上的部署。本文将深入探讨 Golang 多架构编译的原理、方法以及示例。
xcbeyond
2024/06/05
2.1K0
深入了解 Golang 多架构编译:交叉编译最佳实践
原 Golang 的跨平台交叉编译浅析
什么是跨平台交叉编译 交叉编译 通俗地讲就是在一种平台上编译出其他几个平台能够运行的程序(通常指系统和CPU架构的不同) 交叉编译通常使用在分发时,编译出多个平台可用的二进制程序,比如在Linux下编译出可以在Win下可以使用的EXE程序。 本地编译 本地编译是指当前系统所配置编译器根据当前系统配置编译出在当前系统所适用的执行程序(部分其他语言本地编译时可能会由于扩展包含的问题,无法在同平台其他机器运行)。 所以如果要生成在非本机的其他平台和系统的程序,就需要用到交叉编译(交叉编译工具链)。 交叉编译工具链
霡霂
2018/06/04
2.3K0
golang交叉编译和条件编译的实际应用
虽然维基百科上只有交叉编译器的解释,但是结合百度百科来看,其实意思是一致的,就是可以在A平台编译出B或者C平台的可执行程序。
阿珍
2025/07/22
1190
golang交叉编译和条件编译的实际应用
在腾讯云CVM上使用Go语言编译软件
Go 语言强大之处在于其能够快速编译为机器能识别的可执行文件,Go 语言有完整的开发体系,使其能够简单的获取包及编译。go语言编译的软件全平台通用,没必要再去给专门的平台开发相关的软件。
彼岸轮回
2018/07/12
2.5K0
Golang交叉编译
Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下。
潇洒哥和黑大帅
2019/04/01
2.8K0
go 编译执行文件分发
今天咱们不说go的语法知识,为什么不说语法了呢?因为咱们做了这么就的go东西全是在编辑器中运行的,大家是不是很想知道怎么在编辑器之外去执行go程序呢?(win的.exe文件 linux ./xx)…
大话swift
2019/07/19
1.7K0
[Go] Windows/Linux/Mac交叉编译成指定系统的二进制可执行文件
一般我们在windows获取mac开发代码 , 编译的时候如果要编译成指定系统的二进制文件 , 这时就需要使用交叉编译
唯一Chat
2021/04/20
7K0
由一条编译报错信息,引出两个Go编译的重要知识
最近调研了一下某个做 APM 的厂商的 Go 探针程序,说是引入一个包,全程不用再修改其他代码就能在项目里引入探针。没想到在刚引入包试着构建了一下就翻车了。
KevinYan
2021/11/30
1.1K0
由一条编译报错信息,引出两个Go编译的重要知识
我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
今天继续关于Go开发经验的分享,这次的主题是关于Go的交叉编译和条件编译,伴随着我对自己打不过、惹不起的壕同事小张还有运维们的碎碎念。
KevinYan
2020/09/27
2.9K0
我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
go build 交叉编译
作者:matrix 被围观: 10 次 发布时间:2023-02-10 分类:Golang | 无评论 »
HHTjim 部落格
2023/02/13
2.4K0
【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践
在现代计算机系统中,X86和ARM64是两种常见的处理器架构。为了满足不同架构的需求,Docker镜像也需要支持双架构编包形式。本文将介绍Docker镜像双架构编包统一的实践
粲然
2023/10/12
2.4K0
【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践
【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践
在现代计算机系统中,X86和ARM64是两种常见的处理器架构。为了满足不同架构的需求,Docker镜像也需要支持双架构编包形式。本文将介绍Docker镜像双架构编包统一的实践
粲然
2023/04/01
9.4K0
【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践
The Things Network LoRaWAN Stack V3 学习笔记 1.3 交叉编译生成Linux程序
为了测试 NS,本尊在腾讯云上买了一个CVM,1核1G。编译的时候发现居然出现了内存溢出,不得不琢磨下交叉编译。顺便感受下 GO 跨平台的亮点特色。
twowinter
2020/04/17
5760
Golang交叉编译(跨平台编译)的使用
存在交叉编译的情况时,cgo 工具是不可用的。在标准 go 命令的上下文环境中,交叉编译意味着程序构建环境的目标计算架构的标识与程序运行环境的目标计算架构的标识不同,或者程序构建环境的目标操作系统的标识与程序运行环境的目标操作系统的标识不同
微客鸟窝
2022/05/24
4.5K0
申威(神/声)(SW)1621 + UOS 20 编译安装 Docker | 容器国产化适配
1.解压 runc 源码至 ~/go/src/github.com/opencontainers 目录;
宋天伦
2023/10/20
1.7K0
golang预定义的系统名称
Golang syslist Golang预定义的OS列表 aix android darwin dragonfly freebsd hurd js linux nacl netbsd openbsd plan9 solaris windows zos Golang预定义的Arch(架构)列表 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le p
老高的技术博客
2022/12/28
9350
Go学习笔记:golang交叉编译
(1)首先进入go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件。 $ cd /usr/local/go/src $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 如果是 Windows 则修改 GOOS 即可。 $ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash (2) 现在可以编译 Linux 和 Windows 平台所需的执行文件了。 $ CGO_ENABLED=0 GOO
李海彬
2018/03/20
1.8K0
Go语言环境搭建详解(2020版)
最近写了很多Go语言的原创文章,其中Go语言实战系列30篇,近15W字,还有最近更新的Go经典库系列,不过通过大家的咨询来看,还是想要一些入门的知识,这一篇文章写于2017年初,这3年多Go更新了很多版本,所以需要更新下这篇文章。
飞雪无情
2020/11/05
6.6K0
相关推荐
Go语言交叉编译工具gox
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验