Skip to content

Plan 9で最初からGoをビルドする

Plan 9にGoをインストールするで書いた内容に従って、2025年夏の最新バージョンまでビルドしていく。

C言語でビルドする。素のPlan 9ではうまく証明書が扱えないのでLinux等でダウンロードしておく。

Terminal window
curl -LO https://go.dev/dl/go1.4.3.src.tar.gz

あとはPlan 9でバイナリだけビルド。

Terminal window
gunzip -c go1.4.3.src.tar.gz | tar x
mv go go1.4
cd go1.4/src
./make.rc

一足飛びにGo 1.17やGo 1.11まで上げると runtime: garbage collector found invalid heap pointer というエラーになったので、一旦Go 1.9を経由する。これはGo 1.4.3を使ってビルドする。

Terminal window
curl -LO https://go.dev/dl/go1.9.7.src.tar.gz

ビルドの手順はGo 1.4と同じなので省略。

Go 1.9.7を使ってビルドする。バージョンが手元にあったのでビルドしたが、これは飛ばしてGo 1.17まで上げてもいいかもしれない。

Terminal window
curl -LO https://go.dev/dl/go1.11.13.src.tar.gz

GOROOT_BOOTSTRAP を明示的に与える必要がある。

Terminal window
gunzip -c go1.11.13.src.tar.gz | tar x
mv go go1.11
cd go1.11/src
GOROOT_BOOTSTRAP=$home/go1.9 ./make.rc -v

ソースコードの履歴によると、Go 1.10.0で make.rc の出力が

Building Go cmd/dist using /usr/glenda/go1.9. (go1.9.7 plan9/amd64)
Building Go toolchain1 using /usr/glenda/go1.9.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.

のようにシンプルなスタイルに変わってしまったが、make.rc-v オプションを渡せるようになっていて、これを渡すと従来のスタイルで細かい進捗が出力されるようになる。Plan 9でビルドすると非常に遅く、特に1.20以降は数時間必要なので、基本的には -v オプションを設定するといい。

Go 1.11を使ってビルドする。

Terminal window
curl -LO https://go.dev/dl/go1.17.13.src.tar.gz

GOROOT_BOOTSTRAP を明示的に与える必要がある。

Terminal window
gunzip -c go1.17.13.src.tar.gz | tar x
mv go go1.17
cd go1.17/src
GOROOT_BOOTSTRAP=$home/go1.11 ./make.rc -v

Go 1.17を使ってビルドする。次のバージョンをビルドするために必要な最小バージョンは1.20だが、新しい方がなにかと良いだろうと思って、Go 1.17でビルド可能な中での最も新しいバージョンを選択した。

Terminal window
curl -LO https://go.dev/dl/go1.21.13.src.tar.gz

GOROOT_BOOTSTRAP を明示的に与える必要がある。この辺りから pkg/$GOOS_$GOARCH に直接出力せず、/tmp/go-build-xxx 以下へバイナリを書き出して、その参照を pkg/obj/go-build に置くような構造に変わっているので ramfs すると多少早くなるかもしれない。

Terminal window
gunzip -c go1.21.13.src.tar.gz | tar x
mv go go1.21
cd go1.21/src
GOROOT_BOOTSTRAP=$home/go1.17 ./make.rc -v

Go 1.21を使ってビルドする。

Terminal window
curl -LO https://go.dev/dl/go1.22.12.src.tar.gz

これまでと変わらない。

Terminal window
gunzip -c go1.21.13.src.tar.gz | tar x
mv go go1.22
cd go1.22/src
GOROOT_BOOTSTRAP=$home/go1.21 ./make.rc -v

Go 1.22を使ってビルドする。

Terminal window
curl -LO https://go.dev/dl/go1.24.5.src.tar.gz

これまでと変わらないが、現時点ではこれが最新なのでリネームしない。

Terminal window
gunzip -c go1.24.5.src.tar.gz | tar x
cd go/src
GOROOT_BOOTSTRAP=$home/go1.22 ./make.rc -v

落ちた

Building Go toolchain3 using go_bootstrap and Go toolchain2.
M structure uses sizeclass 1792/0x700 bytes; incompatible with mutex flag mask 0x3ff
fatal error: runtime.m memory alignment too small for spinbit mutex
runtime: panic before malloc heap initialized
runtime stack:
runtime.throw({0xc675e7?, 0x0?})
runtime/panic.go:1101 +0x49 fp=0x7fffffffee78 sp=0x7fffffffee48 pc=0x273529
runtime.lockVerifyMSize()
runtime/lock_spinbit.go:97 +0xc5 fp=0x7fffffffeea0 sp=0x7fffffffee78 pc=0x2175c5
runtime.schedinit()
runtime/proc.go:818 +0x34 fp=0x7fffffffef00 sp=0x7fffffffeea0 pc=0x244c74
runtime.rt0_go()
runtime/asm_amd64.s:349 +0x128 fp=0x7fffffffef08 sp=0x7fffffffef00 pc=0x278a28
go: error obtaining buildID for go tool compile: exit status: 'compile 17771: 2'
go tool dist: FAILED: /usr/glenda/go/pkg/tool/plan9_amd64/go_bootstrap install -v -a cmd/asm cmd/cgo cmd/compile cmd/link cmd/preprofile: exit status: 'go_bootstrap 17767: 1'

似た話題はruntime: panic before malloc heap initialized on plan9/amd64で見つかったけどクローズされている。

Go 1.22を使ってビルドするが、masterを拾ってきた。そうすると .git がなくてうまく動かないので手作業で VERSION を作成する。

go1.25rc2
time 2025-07-29T12:08:00Z

Go 1.24.5と同様に、現時点ではこれが最新なのでリネームしない。

Terminal window
unzip go-master.zip
mv go-master go
cd go/src
GOROOT_BOOTSTRAP=$home/go1.22 ./make.rc -v