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

文章目录

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

在这里插入图片描述

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

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

相关文章

ComfyUI 基础教程(十二):AI换脸神器 InstantID ComfyUI, 保姆级安装与使用测评

AI换脸技术发展迅速,roop,Reactor,ipadapter-faceid,photomaker,InstantID,换脸神器更新非常快。 对比lora训练,faceID,intantID,IPA,在人脸风格的迁移上,是目前AI换脸的主要方式。而最新出的InstantID,只需单个图像即可实现ID保留生成,相似度极高。 instantid特…

springboot项目之java.lang.NullPointerException: null问题

没有任何提示,只有一行报错: RuntimeException-[java.lang.NullPointerException] 问题定位: 最后发现是 controller文件,service定义一行少加了关键字 final 导致的, 补充之后就完美解决啦! 参考 springboot项目之java.lang.Nu…

基于vue的个性化推荐餐饮系统Springboot

项目:基于vue的个性化推荐餐饮系统Springboot 摘要 现代信息化社会下的数据管理对活动的重要性越来越为明显,人们出门可以通过网络进行交流、信息咨询、查询等操作。网络化生活对人们通过网上购物也有了非常大的考验,通过网上进行点餐的人也…

软件实例分享,饭店餐饮会员卡管理系统怎么弄会员充值怎么记账

软件实例分享,饭店餐饮会员卡管理系统怎么弄会员充值怎么记账 一、前言 以下软件教程以 佳易王餐饮会员管理系统软件V16为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、会员可以登记电子会员卡或使用vip卡片 2、卡类型可以自由…

SICTF Round#3 Web方向 题解WP

100%_upload 题目描述:小茂夫说:一直上传恶意文件尊嘟要生气了,世事莫固守,转变思路求突破 开题,注意有个文件包含 题目把后缀过滤死了,无法上传php后缀文件。文件内容些许过滤,短…

微信小程序uniapp校园在线报修系统维修系统java+python+nodejs+php

管理员的主要功能有: 1.管理员输入账户登陆后台 2.个人中心:管理员修改密码和账户信息 3.用户管理:对注册的用户信息进行删除,查询,添加,修改 4.维修工管理:对维修工信息进行添加,修…

【递归】【后续遍历】【迭代】【队列】Leetcode 101 对称二叉树 100. 相同的树

【递归】【后续遍历】Leetcode 101 对称二叉树 100 相同的树 101. 对称二叉树解法一: 递归:后序遍历 左右中解法二: 迭代法,用了单端队列 100. 相同的树解法一:深度优先 ---------------🎈🎈对称…

关于Windows 11中的Microsoft Defender,看这篇就差不多了

Windows内置的安全应用程序Microsoft Defender可保护你的计算机免受恶意代理和病毒的攻击。然而,在某些情况下,你可能想要禁用它,例如在测试第三方安全应用程序时。我们将向你展示如何在Windows 11上永久禁用Microsoft Defender。 何时应永久禁用Microsoft Defender防病毒 …

vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style

当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现 1. 使用的插件 : sheet.js-xlsx 文档地址:https://docs.sheetjs.com/ 中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md xlsx-style&#…

【8】证书公钥替换

0x01 问题描述 存在一个前置系统,数据包有登录信息。登录需要填入用户名,证书上传,私钥。如图: 提供数据包如下: POST /api/certLogin HTTP/1.1 Host: 192.168.11.153 Connection: keep-alive Content-Length: 934…

srs集群下行edge处理逻辑

官方关于源站集群的介绍: Origin Cluster | SRS 下行边缘是指观众端从边缘edge拉流,边缘edge回源到源站origin节点拉流,然后再 把流转给客户端 边缘处理类SrsPlayEdge 当服务器收到播放请求时,创建对应的consumer消费者。在创…

【保真】揭秘目前唯一能使用Sora的官方渠道 —— OpenAI Red Teaming Network

原文链接:【保真】揭秘目前唯一能使用Sora的官方渠道 —— OpenAI Red Teaming Network 前几天OpenAI推出的Sora模型着实太火了,不仅让圈内人热血封腾,也给圈外人点了一把AGI的热情之火。 Sora的大火,也有不少小伙伴开始问一个问…

2.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-项目搭建

内容参考于:易道云信息技术研究院VIP课 上一个内容:1.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-测试需求与需求拆解-CSDN博客 代码以提交到码云:https://gitee.com/dye_your_fingers/titan 开始搭建环境 创建之前:HOOK引擎…

集成厂家服务的核心内容

一、关系定义 集成商是指将多个不同的产品或服务集成在一起,形成一个整体解决方案,满足客户需求的企业或个人。 厂家产品商是指生产和销售产品的企业或个人,他们制造和提供各种产品,供集成商使用。 客户关系是指集成商和厂家产…

爬虫在网页抓取的过程中可能会遇到哪些问题?

在网页抓取(爬虫)过程中,开发者可能会遇到多种问题,以下是一些常见问题及其解决方案: 1. IP封锁: 问题:封IP是最常见的问题,抓取的目标网站会识别并封锁频繁请求的IP地址。 解决方案…

git push 使用 --mirror 参数复制仓库

迁移一个 Git 仓库并且保留原有的提交记录和分支 克隆原始仓库到本地 git clone <原始仓库URL> <新仓库目录>添加新的远程仓库&#xff1a;git remote add new-origin <新仓库URL>推送所有分支和标签到新的远程仓库&#xff1a;git push new-origin --mirro…

Vue封装全局公共方法

有的时候,我们需要在多个组件里调用一个公共方法,这样我们就能将这个方法封装成全局的公共方法。 我们先在src下的assets里新建一个js文件夹,然后建一个common.js的文件,如下图所示: 然后在common.js里写我们的公共方法,比如这里我们写了一个testLink的方法,然后在main…

计算机设计大赛 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

微信小程序uniapp校园租房指南房屋租赁系统java+python+nodejs+php

语言&#xff1a;javapythonnodejsphp均支持 框架支持:Ssm/django/flask/thinkphp/springboot/express均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 数据库 mysql 数据库工具&#xff1a;Navicat等 前端开发:vue 小程序端运行软件 微信开发者工具/hbuiderx uni-…

金三银四即将到来,该准备简历和面试了!

一直以来找讲师帮忙看简历的人很多&#xff0c;但是很少会有人问讲师&#xff1a;根据简历该如何准备面试&#xff1f; 还有一些人简历是达标的&#xff0c;但是面试不通过的&#xff0c;却简单地认为是简历问题&#xff0c;不会认为是自己的掌握问题。 一年一度的金三银四即…