[インデックス 12593] ファイルの概要
このコミットは、Go言語のビルドスクリプト src/make.bash
内のコメントを更新し、GO_LDFLAGS
環境変数の説明を修正するものです。具体的には、GO_LDFLAGS
がパッケージのビルドには関与せず、コマンドのビルドにのみ影響するという点を明確にしています。これは、Goのビルドシステムにおけるリンカーの役割と、5l/6l/8l
といった古いリンカーの概念が、パッケージビルドとは直接関係しないことを反映しています。
コミット
commit fa6d3ab6bec591fcd8ac7e979677e147c83a754f
Author: David Symonds <dsymonds@golang.org>
Date: Tue Mar 13 12:52:15 2012 +1100
build: update comment about GO_LDFLAGS.
(5l/6l/8l aren't involved in building packages)
R=golang-dev, robert.hencke
CC=golang-dev
https://golang.org/cl/5798071
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fa6d3ab6bec591fcd8ac7e979677e147c83a754f
元コミット内容
build: update comment about GO_LDFLAGS. (5l/6l/8l aren't involved in building packages)
変更の背景
この変更は、Go言語のビルドプロセスに関するドキュメントの正確性を向上させるために行われました。GO_LDFLAGS
はリンカーフラグをGoのビルドプロセスに渡すための環境変数ですが、その影響範囲について誤解を招く可能性のある記述が src/make.bash
内のコメントに存在していました。
以前のコメントでは、GO_LDFLAGS
が「パッケージとコマンドのビルド時」に使用されると記述されていましたが、実際にはリンカーフラグは主に最終的な実行可能ファイル(コマンド)のリンク時に適用されるものであり、個々のパッケージ(ライブラリ)のビルド時には直接関与しません。Goのビルドシステムでは、パッケージは中間オブジェクトファイルとしてコンパイルされ、それらが最終的にリンカーによって結合されて実行可能ファイルが生成されます。このプロセスにおいて、リンカーフラグは最終的なリンクフェーズで意味を持つため、パッケージのビルドとは区別されるべきでした。
このコミットは、この誤解を解消し、GO_LDFLAGS
の実際の役割をより正確に反映させることを目的としています。また、5l/6l/8l
といった古いリンカーの名称がコメント内で言及されていることから、当時のGoのビルドツールチェーンの進化と、それらのツールがパッケージビルドに直接関与しないという理解が深まった背景も考えられます。
前提知識の解説
Go言語のビルドプロセス
Go言語のビルドプロセスは、ソースコードをコンパイルし、リンクして実行可能ファイルを生成する一連のステップです。大まかには以下のようになります。
- コンパイル:
.go
ソースファイルがコンパイラによって中間オブジェクトファイルに変換されます。各パッケージは独立してコンパイルされます。 - リンク: コンパイルされたオブジェクトファイルと、必要なライブラリ(標準ライブラリやサードパーティライブラリ)がリンカーによって結合され、単一の実行可能ファイルが生成されます。
go build
コマンドは、これらのステップを自動的に処理します。
GO_LDFLAGS
GO_LDFLAGS
は、Goのビルド時にリンカーに渡される追加のフラグ(オプション)を指定するための環境変数です。これは go build -ldflags="..."
と同等の機能を提供します。GO_LDFLAGS
を使用することで、以下のようなリンカーの挙動をカスタマイズできます。
- バージョン情報の埋め込み:
-X
フラグを使用して、ビルド時のバージョン情報、コミットハッシュ、ビルド日時などを実行可能ファイルに埋め込むことができます。 - バイナリサイズの最適化:
-s
(デバッグ情報を除去) や-w
(DWARFデバッグ情報を無効化) などのフラグを使用して、生成される実行可能ファイルのサイズを削減できます。 - シンボルの可視性制御: 特定のシンボルを外部からアクセスできないように設定できます。
- 外部ライブラリのリンク: Go以外の言語で書かれたライブラリをリンクする場合に、追加のリンカーオプションが必要になることがあります。
これらのリンカーフラグは、最終的な実行可能ファイルを生成する「リンク」フェーズで適用されるため、個々のパッケージがコンパイルされる段階では直接的な影響を与えません。
5l
, 6l
, 8l
(古いGoリンカー)
5l
, 6l
, 8l
は、Go言語の初期のツールチェーン(通称「gc」ツールチェーン)で使用されていたリンカーの名称です。これらの名称は、Goのツールチェーンが影響を受けたPlan 9オペレーティングシステムのツールチェーンに由来しています。
- 5l: ARMアーキテクチャ用のリンカー
- 6l: AMD64 (x86-64) アーキテクチャ用のリンカー
- 8l: 386 (x86) アーキテクチャ用のリンカー
同様に、コンパイラには 5g
, 6g
, 8g
、アセンブラには 5a
, 6a
, 8a
といった名称がありました。
Go 1.5以降、Goコンパイラ自体がGo言語で再実装され、これらの具体的なリンカー名を意識することは少なくなりました。現在では、go build
コマンドがこれらの低レベルなツールを抽象化し、適切なリンカーを自動的に呼び出します。しかし、このコミットが作成された2012年当時は、これらのリンカー名がGoのビルドプロセスを理解する上で一般的な知識でした。
このコミットの文脈では、5l/6l/8l
といったリンカーが、個々のパッケージをビルドするのではなく、最終的な実行可能ファイル(コマンド)をリンクする役割を担っているという点が重要です。
技術的詳細
このコミットは、Goのビルドスクリプト src/make.bash
内のコメントの修正に限定されており、Goのビルドシステムの動作そのものを変更するものではありません。しかし、ドキュメントの正確性を高めるという点で重要な意味を持ちます。
src/make.bash
は、GoのソースコードからGoツールチェーン全体をビルドするためのシェルスクリプトです。このスクリプトは、Goの開発者がGoの新しいバージョンをコンパイルしたり、特定の環境でGoをセットアップしたりする際に使用されます。
修正されたコメントは、GO_LDFLAGS
環境変数の説明部分です。
修正前:
# GO_LDFLAGS: Additional 5l/6l/8l arguments to use when
# building the packages and commands.
修正後:
# GO_LDFLAGS: Additional 5l/6l/8l arguments to use when
# building the commands.
この変更により、GO_LDFLAGS
が「パッケージとコマンド」ではなく、「コマンド」のビルド時にのみ追加のリンカー引数として使用されることが明確になりました。これは、リンカーが最終的な実行可能ファイルを生成する段階で機能するというGoのビルドプロセスの実態を正確に反映しています。パッケージはコンパイルされますが、それ自体がリンカーフラグの影響を受けることはありません。リンカーフラグは、それらのコンパイル済みパッケージが結合されて最終的な実行可能ファイルになる際に適用されます。
この修正は、Goのビルドシステムを理解しようとする開発者にとって、GO_LDFLAGS
の適用範囲に関する混乱を避けるのに役立ちます。特に、Goのビルドプロセスにおけるコンパイルとリンクのフェーズの区別を明確にする上で重要です。
コアとなるコードの変更箇所
diff --git a/src/make.bash b/src/make.bash
index b3db71a6bd..080e0d6e1d 100755
--- a/src/make.bash
+++ b/src/make.bash
@@ -21,7 +21,7 @@
# building the packages and commands.
#
# GO_LDFLAGS: Additional 5l/6l/8l arguments to use when
-# building the packages and commands.
+# building the commands.
#
# CGO_ENABLED: Setting this to 0 disables the use of cgo
# in the built and installed packages and tools.
コアとなるコードの解説
変更は src/make.bash
ファイルの22行目と23行目(修正前)にあります。
元のコメントでは、GO_LDFLAGS
が「building the packages and commands.」(パッケージとコマンドのビルド時)に使用されると説明されていました。
このコミットでは、この行が「building the commands.」(コマンドのビルド時)に修正されています。
この修正は、GO_LDFLAGS
がリンカーフラグであり、リンカーは最終的な実行可能ファイル(Goの文脈では「コマンド」と呼ばれることが多い)を生成する際に機能するという事実を反映しています。Goの「パッケージ」は、コンパイルされて中間オブジェクトファイルやアーカイブファイルになりますが、それ自体がリンカーフラグによって直接影響を受けることはありません。リンカーフラグは、これらのパッケージが結合されて最終的な実行可能ファイルが作成されるリンクフェーズで適用されます。
したがって、この変更は、Goのビルドプロセスにおける GO_LDFLAGS
の役割に関するドキュメントの正確性を向上させるための、小さくも重要な修正です。
関連リンク
- Go CL 5798071: https://golang.org/cl/5798071
参考にした情報源リンク
- Go
ldflags
の使用例: https://medium.com/@ardasevinc/go-ldflags-a-practical-guide-to-embedding-build-information-in-your-binaries-3212292122e - Go
ldflags
の詳細: https://codingexplorations.com/blog/go-ldflags-explained - Go
ldflags
を使ったバージョン情報の埋め込み: https://www.digitalocean.com/community/tutorials/how-to-embed-version-information-in-go-applications-using-ldflags - Goの古いリンカー (
5l
,6l
,8l
) について: https://cheney.net/go-compilers-and-assemblers - Goのコンパイラとリンカーの歴史: https://willnewton.name/blog/2015/08/05/go-1.5-compiler-written-in-go/
- Goのビルドプロセスとツールチェーン: https://medium.com/@jason_777/go-compiler-internals-a-deep-dive-into-the-go-toolchain-1f2b3c4d5e6f