修改并编译golang源码的操作步骤


Posted in Golang onJuly 25, 2021

修改并编译golang源码的操作步骤

最近为了做Hyperledger Fabric国密改造,涉及到了golang源码的改动。特将操作过程整理如下,以供参考:

golang的源码安装其实比较简单,只需运行源码包中的脚本src/all.bash,等到出现类似以下字样就安装好了:

Installed Go for linux/amd64 in xxx(目录地址)
Installed commands in xxx(目录地址)

但是在源码安装1.5版本以上的go时会报以下的错误 :

##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find /home/fabric/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.

这是由于go 1.5版以后的编译安装需要1.4版本go,所以如果想要通过源码方式安装高版本go,必须先安装好1.4版本的go。

其实这里不限定使用go1.4版本,如果你需要得到1.10版本的golang,你也可以用1.9(<1.10)版本的golang来编译。

让我们开始操作吧!

为了方便修改调试,可以fork官方的仓库(https://github.com/golang/go.git),然后拉取自己仓库中的代码,例如我的用户名是Mango

第一步、安装golang 1.4

主要操作如下:

为了方便操作,我们切换到root用户

fabric@fabric-VirtualBox:~$ su root

为了方便统一管理,将golang源码放入GOPATH中

root@fabric:~# export GOPATH=/opt/gopath
root@fabric:~# cd $GOPATH/src/github.com/Mango/
root@fabric:/opt/gopath/src/github.com/Mango# git clone https://github.com/Mango/go.git
Cloning into 'go'...
remote: Counting objects: 322777, done.
remote: Compressing objects: 100% (73/73), done.
remote: Total 322777 (delta 32), reused 54 (delta 28), pack-reused 322675
Receiving objects: 100% (322777/322777), 147.71 MiB | 3.49 MiB/s, done.
Resolving deltas: 100% (255582/255582), done.

友情提醒下,虽然可能有点??拢???ango/go这个仓库其实是不存在的,这里只是为了方便举例子,大家可以自行从官方仓库fork分支...

切换为go 1.4分支

root@fabric:/opt/gopath/src/github.com/Mango# cd go
root@fabric:/opt/gopath/src/github.com/Mango/go# git checkout release-branch.go1.4
Branch release-branch.go1.4 set up to track remote branch release-branch.go1.4 from origin.
Switched to a new branch 'release-branch.go1.4'

进入src目录,并运行all.bash 安装脚本,稍等片刻即可安装成功:

root@fabric:/opt/gopath/src/github.com/Mango/go# cd src
root@fabric:/opt/gopath/src/github.com/Mango/go/src# ./make.bash
   # Building C bootstrap tool.
   cmd/dist
    
   # Building compilers and Go bootstrap tool for host, linux/amd64.
   lib9
   libbio
   liblink
   cmd/cc
   cmd/gc
   cmd/6l
   
   ....
    
   # Checking API compatibility.
   Skipping cmd/api checks
    
   real	0m0.538s
   user	0m0.310s
   sys	0m0.191s
    
   ALL TESTS PASSED
    
   ---
   Installed Go for linux/amd64 in /root/software/go
   Installed commands in /root/software/go/bin
   *** You need to add /root/software/go/bin to your PATH.

如果遇到报错

cannot load DWARF output from $WORK/os/user/_obj//_cgo_.o: decoding dwarf section info at offset 0x4: unsupported version 0

需要关闭cgo支持,重新编译

root@fabric:/opt/gopath/src/github.com/Mango/go/src# export CGO_ENABLED=0 
root@fabric:/opt/gopath/src/github.com/Mango/go/src# ./make.bash

最后,我们将编译好的go 1.4复制到/usr/local下方便以后使用

root@fabric:/opt/gopath/src/github.com/Mango/go/src# cp -rp ../../go /usr/local/go1.4

这样你就能得到1.4版本的go了。

第二步、安装golang 1.9

主要操作如下:

我们需要编译好的golang环境支持c语言的文件,所以需要开启cgo

root@fabric:/opt/gopath/src/github.com/Mango/go/src# export CGO_ENABLED=1

我们需要指定由go 1.4进行编译,所以得设置以下环境变量

root@fabric:/opt/gopath/src/github.com/Mango/go/src# export GOROOT_BOOTSTRAP=/usr/local/go1.4

这里就用到了前面复制得到的go 1.4目录

回到go源码根目录,并切换分支至1.9

root@fabric:/opt/gopath/src/github.com/Mango/go/src# cd ../
root@fabric:/opt/gopath/src/github.com/Mango/go# git checkout release-branch.go1.9
Branch release-branch.go1.9 set up to track remote branch release-branch.go1.9 from origin.
Switched to a new branch 'release-branch.go1.9'

下面的过程就和编译go1.4很类似,不再赘述

root@fabric:/opt/gopath/src/github.com/Mango/go# cd src
root@fabric:/opt/gopath/src/github.com/Mango/go# ./make.bash
...

这里的make.bash在一些版本中,也可能是all.bash

最后将编译好的go 1.9复制到/usr/local下,作为默认的golang标准库目录

root@fabric:/opt/gopath/src/github.com/Mango/go/src# cp -rp ../../go /usr/local/go

结语:

上述操作结束之后,当然还是要设置GOROOT之类的环境变量才可以,这样的文章很多,不再赘述。

而且,相信都能改golang源码的你,这些已经不在话下了。

到此这篇关于修改并编译golang源码的文章就介绍到这了,更多相关golang源码编译内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
为什么不建议在go项目中使用init()
Apr 12 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
Go语言应该什么情况使用指针
Jul 25 #Golang
基于Go语言构建RESTful API服务
Jul 25 #Golang
go goroutine 怎样进行错误处理
Jul 16 #Golang
go开发alertmanger实现钉钉报警
Jul 16 #Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 #Golang
入门学习Go的基本语法
Jul 07 #Golang
golang中字符串MD5生成方式总结
Jul 04 #Golang
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
文秘应聘自荐书范文
2014/02/18 职场文书
植树节标语
2014/06/27 职场文书
工作所在部门证明
2014/09/21 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
初中毕业生自我评价
2015/03/02 职场文书
小学感恩节活动总结
2015/03/24 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
Java版 简易五子棋小游戏
2022/05/04 Java/Android
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL