go/src/make.bash阅读

本文解析了通过make.bash进行Go源码的编译过程,介绍了关键环境变量如GOROOT_FINAL、GOARCH等的作用,并解释了交叉编译概念及go_bootstrap工具的生成流程。

今天看到@polaris1119的这篇分析源码安装Go的过程(初稿)

至今还没仔细看过make.bash的内容。这篇算是阅读笔记了。

环境变量

首先是make.bash中用到的环境变量:

GOROOT_FINAL:Go源码的根目录,这个变量的是在gcc的时候使用的,如果你设置了这个,gcc的-D参数就是你设置的

GOHOSTARCH:Go所在的宿主机器的架构,当然这里指的是CPU的架构

GOARCH:安装包和工具所在的机器的架构。

GOOS:安装包和工具所在的机器的操作系统。

GO_GCFLAGS:是否要在编译的时候需要带上5g/6g/8g的参数

GO_LDFLAGS:是否要在链接的时候带上5l/6l/8l的参数

CGO_ENABLED:是否能使用cgo

 

对于环境变量,你可以在编译完成后使用dist工具来查看,比如:

yejianfengtekiMacBook-Air:darwin_amd64 yejianfeng$ ./dist env

GOROOT="/Users/yejianfeng/software/go"

GOBIN="/Users/yejianfeng/software/go/bin"

GOARCH="amd64"

GOOS="darwin"

GOHOSTARCH="amd64"

GOHOSTOS="darwin"

GOTOOLDIR="/Users/yejianfeng/software/go/pkg/tool/darwin_amd64"

GOCHAR="6"

 

为什么有GOARCH和GOHOSTARCH的分别?

下面一个情境:amd64的机器上,下载了一份源码,所以GOHOSTARCH是设置成为AMD64,但是我现在想写的是Intel X86-32的Go可执行文件,所以设置GOARCH为Intel86。这就是交叉编译的概念。

当然这两个环境变量是在编译出go工具的时候才有用,具体的编译go代码就没用了。

 

GOTOOLDIR是什么?

go tool命令后面可以跟其他的工具,比如pprof, yacc, api等。go tool实质上只是一个转发命令给这些工具,这些工具的源代码是放在goroot/src/cmd下面,这些工具的源码编译之后生成的二进制可执行文件就放在$GOTOOLDIR里面,具体的路径就在goroot/pkg/tool/(darwin_amd64)/下。

这个变量是在这句话中设置的

eval $(./cmd/dist/dist env -p)

go_bootstrap是什么?

 

我们可以看到go_bootstrap这个工具是使用dist工具bootstrap生成的。然后再使用go_bootstrap install来编译go的包。最后又悄悄地把go_bootstrap删掉。

我们还原一下,进入GOTOOLDIR,调用./dist bootstrap重新生成go_bootstrap

运行下你会发现,原来就是bin/go嘛,但是再看看大小,只有3M多,而完整的bin/go有5.6M。

所以可以推断go_bootstrap是包含了基本的go代码编译能力的工具。

整个make的流程是什么样的?

其实也是几句话就能说清楚:

1 先gcc编译出dist

2 dist编译出go代码基本编译器go bootstrap

3 用go bootstrap编译出go的src中的其他go源码

4 将其他所有工具生成放在src/cmd下供bin/go使用

2025/06/17 13:47:38 [Recovery] 2025/06/17 - 13:47:38 panic recovered: plugin_daemon-1 | runtime error: invalid memory address or nil pointer dereference plugin_daemon-1 | /usr/local/go/src/runtime/panic.go:262 (0x4768b8) plugin_daemon-1 | /usr/local/go/src/runtime/signal_unix.go:917 (0x476888) plugin_daemon-1 | /app/internal/core/plugin_manager/local_runtime/stdio.go:85 (0xdb28d2) plugin_daemon-1 | /app/internal/core/plugin_manager/local_runtime/io.go:16 (0xdb023a) plugin_daemon-1 | /app/internal/core/plugin_daemon/generic.go:28 (0xfb9b36) plugin_daemon-1 | /app/internal/core/plugin_daemon/model_service.go:159 (0xfe15eb) plugin_daemon-1 | /app/internal/service/invoke_model.go:191 (0xfe15d2) plugin_daemon-1 | /app/internal/service/base_sse.go:116 (0xff1d3a) plugin_daemon-1 | /app/internal/service/base_sse.go:44 (0xff1f9e) plugin_daemon-1 | /app/internal/service/base_sse.go:114 (0xff1c84) plugin_daemon-1 | /app/internal/service/invoke_model.go:189 (0xfe1591) plugin_daemon-1 | /app/internal/server/controllers/model.go:163 (0x1cf5f90) plugin_daemon-1 | /app/internal/server/controllers/base.go:53 (0x10181b4) plugin_daemon-1 | /app/internal/server/controllers/base.go:31 (0x1018634) plugin_daemon-1 | /app/internal/server/controllers/base.go:37 (0x10180b5) plugin_daemon-1 | /app/internal/server/controllers/model.go:160 (0x1cf5ed3) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf6ee6a) plugin_daemon-1 | /app/internal/server/middleware.go:170 (0x1cf7413) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf6ee6a) plugin_daemon-1 | /app/internal/server/middleware.go:97 (0x1cf74b3) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf6ee6a) plugin_daemon-1 | /app/internal/server/middleware.go:66 (0x1cfb2b1) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf6ee6a) plugin_daemon-1 | /app/internal/server/middleware.go:24 (0x1cf4cf4) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf7c9ce) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/recovery.go:102 (0xf7c9bb) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf7bb04) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/logger.go:249 (0xf7baeb) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/context.go:185 (0xf7aef1) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/gin.go:633 (0xf7a960) plugin_daemon-1 | /go/pkg/mod/github.com/gin-gonic/gin@v1.10.0/gin.go:589 (0xf7a491) plugin_daemon-1 | /usr/local/go/src/net/http/server.go:3210 (0x7e062d) plugin_daemon-1 | /usr/local/go/src/net/http/server.go:2092 (0x7bfb4f) plugin_daemon-1 | /usr/local/go/src/runtime/asm_amd64.s:1700 (0x47caa0)
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值