go源码怎么编译-【Golang源码分析】Golang如何实现bootstrap-6g的编译过程(三)

好久没有写文章了,因为忙着出书go源码怎么编译,受双减的影响,有点懈怠了。 本系列的Golang bootstrapping继续之前的文章《【Golang源码分析】Golang如何实现Bootstrapping-dist介绍》中写的,因为go1.3在Linux下编译*.c文件会调用gcc,而编译go文件会调用“/mnt/pkg/tool/linux_amd64/6g”,所以本文主要研究6g以及go1.3源码编译过程。

1.6g简要回顾

在go1.3中,虽然go的部分源码仍然是用c源码实现的,但是有一部分是用go实现的。 在这些情况下,就需要使用混合编译模式,通过dist进行编译。

图1-1dist运行流程

如图1-1所示,运行dist编译时会出现两个分支。 一种是使用gcc编译c文件,另一种是使用lib9库编译go,即使用Plan9,正是plan9port包。

2. Plan9 和 Plan9port 的历史

Plan9 和 Plan9port 来源参考:

2.1 计划9

Plan9虽然是一个操作系统,由贝尔实验室开发go源码怎么编译,但其主要负责人却是RobPike。

Plan9并不是一个非常有名的作品,它的前身Unix是众所周知的。 而 Plan9 是几位 Unix 作者在 AT&T 职业生涯的顶峰,它的设计就是为了赶上 Unix。

事实上,Plan9在1992年首次发布时,就同时实现了GoogleDocs、Dropbox、Github、RemoteDesktop等当前流行互联网产品的功能。

Plan9 可以做到这一点,因为它将所有内容注册在名为 9P 的文件系统中。

2.2Plan9端口

Plan9port的作者是Russ Cox,Go的设计者之一 Russ Cox是Go和GoogleCodeSearch的作者,也是RobPike的大师。 他多年来坚持用一台旧的 Macmini 进行开发,他对此感到非常自豪。

Russ 离开 AT&T 加入 Google 后,不禁怀念 Plan9,于是他将 Plan9 上的用户程序(包括 Acme)移植到其他操作系统上,称为 Plan9fromUserSpace。

git上的源代码位于:

Plan9fromUserSpace这个名字很有趣——Plan9这个名字可能来自1959年的日本悬疑连续剧《Plan9fromOuterSpace》。

Plan9fromUserSpace 支持以下操作系统:

参考地址:

3.6g如何实现编译

虽然6g命令在编译go文件阶段的主要目的是将go文件编译为链接库,但还有一个6l命令用于链接到可执行文件。

图3-1go1.3编译流程

如图3-1所示,虽然go命令在进入“gobuild”时调用了go_bootstrap命令,但是go_bootstrap命令显然调用了6g来编译,调用了6l来链接可执行文件。

3.1 编译示例

可以简单设计源码命名为demo.go,代码如下:

package main
func main() {
    printf("1111")
}

本文使用docker来运行go1.3的相关源码。 有兴趣的话可以阅读《【Golang源码解析】Golang如何实现Bootstrapping(一)》这篇文章。 看来dockerrun时没有go对应的环境变量,所以需要规划环境变量,对应的环境变量如下:

export PATH=/mnt/bin:$PATH
export GOROOT=/mnt
export GOPATH=/mnt/gopath

从图3-1我们知道gobuild好像调用了go_bootstrap命令,所以可以使用go_bootstrap命令来编译查看,go_bootstrap减少-v参数复制对应的包,-x参数查看整个执行过程(注:如果需要看其他可以用-h查看帮助文档)。 命令如下:

#/mnt/pkg/tool/linux_amd64/go_bootstrap build -v -x demo.go

图3-2 go_bootstrap执行流程

根据图3-2,虽然6g在编译demo.go文件时会生成“command-line-arguments.a”文件,但6l会链接“command-line-arguments.a”文件并生成demo可执行文档。

3.26g编译过程

要知道6g做了什么,可以调试6g。 直接运行以下命令:

#gdb /mnt/pkg/tool/linux_amd64/6g

进入gdb模式后,可以输入以下参数:

(gdb) set args build demo.go

设置完参数后,可以直接“bmain”下一个主断点,输入“r”运行编译过程,然后进入main函数,通过“s”进入p9main函数,如图3-3所示。

图3-3p9main函数调试流程

从图3-3可以看出,虽然编译会单步进入lex.c文件,虽然这个文件中会调用go.h和y.tab.h文件,但这个文件可能是Bison2生成的。 3 进行词法分析。 并使用yacc包脚本进行句子分析。 此外,还会进行7项句型测试,分别是:

最终检测完成后,调用dumpobj函数备份.a文件。 整个流程如图3-4所示。

图3-46g编译流程

总结

一般来说,go的引导过程比较复杂,会出现混合编译的情况。 编译c时通过gcc生成对应的链接库,编译go时通过6g生成对应的链接库,然后通过6l进行链接。 虽然还有很多细节需要探索,比如语言的运行环境、liblink库inferno-os的应用等等,有时间的话我会继续更新这个系列的文章,做更多的事情深入探索。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 go源码怎么编译-【Golang源码分析】Golang如何实现bootstrap-6g的编译过程(三) https://www.wkzy.net/game/193865.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务