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

news/2024/9/7 23:36:21

文章目录

  • 前置知识
    • 交叉编译
    • Go 支持的所有操作系统和体系结构组合
      • 列出 Go 支持的所有操作系统和体系结构组合
    • 大端、小端
    • minio使用的go版本
      • ABI
  • 官方下载
  • 目标
  • 编译loongarch架构下的minio
  • 编译mipsle架构下的minio
  • 编译sw64架构下的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=loong64export GO111MODULE=onexport CGO_ENABLE=0
export PATH=/usr/local/go/bin:$PATHgo version
go env -w GOPROXY=https://goproxy.cncd minio#go build -o minio-mips64el
go build -o minio-loongarch-2echo  "build over"

在这里插入图片描述

在这里插入图片描述


编译mipsle架构下的minio


#!/bin/bash
export GOOS=linux
export GOARCH=mips64leexport GO111MODULE=on
export CGO_ENABLE=0
export PATH=/usr/local/go/bin:$PATHgo version
go env -w GOPROXY=https://goproxy.cncd miniogo build -o minio-mips64echo  "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=sw64export GO111MODULE=onexport CGO_ENABLE=0
export PATH=/usr/local/go/bin:$PATHgo version
go env -w GOPROXY=https://goproxy.cncd minio
go build -o minio-sw64echo  "build over"

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/8684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

C语言推荐书籍

本书详细讲解了C语言的基本概念和编程技巧。全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章~第15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串…

【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)

文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…

入门【网络安全/黑客】启蒙教程

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题: 什么样的人适合学习网络安全?我适不适合学习网络安全? 当然,产生这样的疑惑并不奇怪,毕竟网络安全这个专业在2017年才调整为国家一级学…

STM32单片机基本原理与应用(八)

温度传感器实验 实验内容: 单片机通过代码模拟1-Wire总线并对DS18B20进行读写,并在TFTLCD屏幕上显示当前实时温度。 电路原理图: 1-Wire总线 1-Wire总线:即单总线协议,采用单根信号线,既传输时钟&#…

C语言-指针详解速成

1.指针是什么 C语言指针是一种特殊的变量,用于存储内存地址。它可以指向其他变量或者其他数据结构,通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存,以及进行复杂的数据操作。在C语言中&#…

MongoDB实战 – 用Python访问MongoDB数据库

MongoDB实战 – 用Python访问MongoDB数据库 MongoDB in Action – Access MongoDB Databases with Python By JacksonML Python语言功能强大众所周知,在数据库管理领域也无所不能。MongoDB是文档数据库,属于NoSQL数据库的一种,在业界也非常…