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

news2025/1/6 18:15:51

文章目录

  • 前置知识
    • 交叉编译
    • 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=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"

在这里插入图片描述

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

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

相关文章

IP详细地理位置查询:技术原理与应用实践

IP地址是互联网上设备的唯一标识,在网络安全、个性化服务等领域具有重要意义。通过IP详细地理位置查询,可以获取到IP地址所在地的具体信息,为网络管理、定位服务等提供支持。IP数据云将深入探讨IP详细地理位置查询的技术原理、应用实践以及相…

【JavaEE】_form表单构造HTTP请求

目录 1. form表单的格式 1.1 form表单的常用属性 1.2 form表单的常用搭配标签:input 2. form表单构造GET请求实例 3. form表单构造POST请求实例 4. form表单构造法的缺陷 对于客户端浏览器,以下操作即构造了HTTP请求: 1. 直接在浏览器…

CTR之行为序列建模用户兴趣:DIN

在前面的文章中,已经介绍了很多关于推荐系统中CTR预估的相关技术,今天这篇文章也是延续这个主题。但不同的,重点是关于用户行为序列建模,阿里出品。 概要 论文:Deep Interest Network for Click-Through Rate Predict…

前端|Day5:盒子模型(黑马笔记)

Day5:盒子模型 目录 Day5:盒子模型一、选择器1.结构伪类选择器基本使用 2. :nth-child(公式)3.伪元素选择器 二、PxCook三、盒子模型1.盒子模型-组成2.边框线四个方向单方向边框线 3.内边距4.尺寸计算5.外边距6.版心居中7.清除默认样式8.元素溢出9.外边距问题合并现象外边距塌陷…

14. UE5 RPG使用GameplayTag

GameplayTag本来是应用在GAS游戏技能系统里面的,后来UE直接将其抽离出来,作为一个模块,现在可以不在GAS里也可以使用这个模块。比如,我需要判断一个射线拾取的物体,首先我需要判断这个actor是否存在,然后判…

K8S实战:Centos7部署Kubernetes1.20.0集群

目录 一、准备工作1.1、创建3台虚拟机1.1.1、下载虚拟机管理工具1.1.2、安装虚拟机管理工具1.1.3、下载虚Centos镜像1.1.4、创建3台虚拟机1.1.5、设置虚拟机网络环境 1.2、虚拟机基础配置(3台虚拟机进行相同处理)1.2.1、配置host1.2.2、关闭防火墙1.2.3、…

区块链游戏解说:什么是 Planet IX

作者:lesleyfootprint.network 编译:cicifootprint.network 数据源:Planet IX Dashboard 什么是 Planet IX Planet IX,一个由原生 IX TOKEN 推动的 Web3 玩赚平台。作为一款 GameFi 策略游戏, Planet IX 上的每项资…

python毕设选题 - 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析:总体流程:1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到…

【C++语法基础】3.常用数学运算和位运算技巧(✨新手推荐阅读)

前言 在C编程中,数学运算是非常基础和常用的功能。C提供了多种数学运算符和函数,用于执行基本的数学计算,如加减乘除、取模运算以及位运算等。 一、加减乘除四则运算 C中的基本算术运算符包括加法()、减法(-)、乘法(*)、除法(/)。这些运算…

C++ bfs建模(六十一)【第八篇】

今天我们来学习一下bfs建模 1.bfs建模 BFS 建模 广度优先搜索是从某个起点由内向外逐层搜索(多起点 BFS 中所有起点拥有同样的搜索特性)。 搜索顺序为:1→2→3→4→5→6→7→8。 之前的课程中,我们学习过搜索树中的每个结点均表…

C++ 之LeetCode刷题记录(三十三)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 目标:执行用时击败90%以上使用 C 的用户。 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,…

汽车电子论文学习---电动汽车用高功率密度碳化硅电机控制器研究

关键重点: sic的特点:耐压高、开关速度快、开关损耗小;采用sic的控制器,损耗降低70%,续航里程提高5%。sic的模块并联设计难度高于IGBT模块;多芯片并联导致热耦合问题、温升不均,导致部分芯片率…

【C++】类和对象---const成员,取地址及const取地址操作符重载,static成员

目录 ⭐const成员 ⭐取地址及const取地址操作符重载 ⭐static成员 ⭐概念 ⭐特性 ⭐const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何…

字符串相乘

43. 字符串相乘https://leetcode.cn/problems/multiply-strings/ 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整…

快速学习springsecurity最新版 (版本6.2)---用户认证

简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。目前比较主流的是另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富,但是shiro并不简便,这里轻量级安全框架更推荐国产安全框架satokensatoken官网 ​ 一般大型的项目都…

Normalization,LayerNormalization和BatchNormalization

前言 假设我们的损失函数在空间中是一个曲面,这个曲面可以被我们人为的切出等高线,在采用梯度下降算法的时候,我们沿着梯度反方向迭代(梯度方向与等高线垂直),到最后我们会抵达上图曲面的最低点。 在上面的…

strings.xml补充知识

复数名词 <plurals name"book"><item name"one">book</item><item name"others">books</item> </plurals>int bookCount 4; Resources res getResources(); String bookCount res.getQuantityString(R.…

数据结构与算法:队列

在上篇文章讲解了栈之后&#xff0c;本篇也对这一章进行收尾&#xff0c;来到队列&#xff01; 队列 队列的介绍队列的存储结构队列顺序存储的不足之处 循环队列的定义队列的链式存储结构链队列的构建链队列的初始化队尾入队队头出队获取队头队尾元素判断队列是否为空获取队列元…

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x

【MySQL】报错 Incorrect string value: ‘\xE5\xA4\xA9\xE5\x96\x9C‘ for column的解决方法

目录 解决方法如下&#xff1a;例如&#xff1a; 在向数据库中插入中文时遇到报错Incorrect string value: \xE5\xA4\xA9\xE5\x96\x9C for column &#xff0c;此时为数据库的编码格式有问题&#xff0c;可以按照如下方法修改 解决方法如下&#xff1a; 使用show create table…