Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18256] ファイルの概要

このコミットは、Go言語のリンカである cmd/ld のドキュメントに、-w フラグに関する説明を追加するものです。具体的には、-w フラグが DWARF シンボルテーブルの生成を無効にすることを明記しています。

コミット

commit 71377d3cd3a8e9cc97258c3252717e8f0165e7fa
Author: Rob Pike <r@golang.org>
Date:   Tue Jan 14 15:34:27 2014 -0800

    cmd/ld: document the -w flag, which disables DWARF generation
    
    R=golang-codereviews, iant
    CC=golang-codereviews
    https://golang.org/cl/52360044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/71377d3cd3a8e9cc97258c3252717e8f0165e7fa

元コミット内容

--- a/src/cmd/ld/doc.go
+++ b/src/cmd/ld/doc.go
@@ -58,6 +58,8 @@ Options new in this version:
  		Omit the symbol table and debug information.
  	-V
  		Print the linker version.
 +	-w
 +		Omit the DWARF symbol table.
  	-X symbol value
  		Set the value of an otherwise uninitialized string variable.
  		The symbol name should be of the form importpath.name,

変更の背景

このコミットの背景には、Go言語のリンカ cmd/ld のコマンドラインオプションに関するドキュメントの明確化があります。以前から存在していた -w フラグの機能が、公式ドキュメント src/cmd/ld/doc.go に明示的に記載されていなかったため、その役割を明確にする必要がありました。

-w フラグは、Goプログラムのビルド時に生成されるバイナリから DWARF デバッグ情報を除外するために使用されます。デバッグ情報は、プログラムの実行中にデバッガがソースコードレベルでステップ実行したり、変数の中身を検査したりするために不可欠な情報です。しかし、本番環境にデプロイされるバイナリなど、デバッグ情報が不要な場合には、バイナリサイズを削減し、場合によっては起動時間を短縮するためにデバッグ情報を削除することが望ましい場合があります。

このコミットは、開発者が -w フラグの存在とその効果を容易に理解できるようにすることで、ビルドプロセスの制御を向上させることを目的としています。特に、バイナリサイズ最適化の文脈でこのフラグの重要性が増していた可能性があります。

前提知識の解説

リンカ (Linker)

リンカは、コンパイラによって生成されたオブジェクトファイル(機械語コードとデータを含むファイル)を結合し、実行可能なプログラムやライブラリを作成するソフトウェアツールです。複数のオブジェクトファイルやライブラリを一つにまとめ、関数呼び出しや変数参照などのシンボルを解決する役割を担います。Go言語においては、cmd/ld がこのリンカの役割を果たします。

DWARF (Debugging With Arbitrary Record Formats)

DWARFは、ソースレベルデバッガがプログラムの実行をデバッグするために必要な情報(デバッグ情報)を格納するための標準的なフォーマットです。この情報には、以下のようなものが含まれます。

  • ソースファイルと行番号のマッピング: 実行中の機械語コードが、どのソースファイルのどの行に対応するかを示します。
  • 変数情報: 変数の名前、型、メモリ上の位置など。
  • 関数情報: 関数の名前、引数、戻り値の型、ローカル変数の情報など。
  • 型情報: 構造体、配列、ポインタなどの複雑なデータ型の定義。
  • スタックフレーム情報: 関数呼び出しスタックの構造。

DWARF情報は通常、実行可能バイナリの特別なセクションに埋め込まれるか、別のファイル(例: .debug 拡張子を持つファイル)として提供されます。デバッガはこれらの情報を読み取り、開発者がソースコードレベルでデバッグできるようにします。

シンボルテーブル (Symbol Table)

シンボルテーブルは、プログラム内のシンボル(変数名、関数名など)と、それらがメモリ上のどこに配置されているか(アドレス)を対応付けるデータ構造です。リンカはシンボルテーブルを使用して、異なるオブジェクトファイル間で参照されるシンボルを解決します。デバッグ情報の一部として、より詳細なシンボル情報(型情報など)が含まれることもあります。

Go言語のビルドプロセスとデバッグ情報

Go言語のビルドプロセスでは、go build コマンドがコンパイルとリンクの両方を実行します。デフォルトでは、生成されるバイナリにはデバッグ情報(DWARF)が含まれています。これにより、delve などのGoデバッガを使用して、コンパイルされたGoプログラムをソースコードレベルでデバッグすることが可能になります。

しかし、本番環境にデプロイする際には、デバッグ情報が不要な場合が多く、バイナリサイズを削減したいというニーズがあります。デバッグ情報はバイナリサイズを大幅に増加させる可能性があるため、これを削除するオプションは重要です。

技術的詳細

このコミットは、Goリンカ cmd/ld のドキュメントファイル src/cmd/ld/doc.go に、-w フラグの記述を追加するものです。

Goのビルドシステムでは、go build コマンドが内部的に go tool compile (コンパイラ) と go tool link (リンカ) を呼び出します。go tool linkcmd/ld の実体です。

-w フラグは、リンカに対して DWARF デバッグ情報の生成を抑制するように指示します。これにより、生成される実行可能バイナリから、ソースコードの行番号、変数名、型情報などのデバッグ関連のメタデータが取り除かれます。

デバッグ情報が削除されることの主な影響は以下の通りです。

  1. バイナリサイズの削減: DWARF情報はバイナリのサイズを大きくするため、これを削除することで最終的な実行可能ファイルのサイズを大幅に削減できます。これは、特にリソースが限られた環境や、ネットワーク経由でのデプロイメントにおいて重要です。
  2. デバッグ能力の喪失: -w フラグを使用してビルドされたバイナリは、ソースコードレベルでのデバッグが非常に困難になります。デバッガは、関数名や変数名、行番号などの情報にアクセスできなくなるため、スタックトレースが意味不明になったり、ブレークポイントを設定できなかったりします。
  3. パフォーマンスへの影響(限定的): DWARF情報の有無が実行時のパフォーマンスに直接的な影響を与えることは稀ですが、バイナリのロード時間やメモリフットプリントにわずかな影響を与える可能性はあります。しかし、主な目的はサイズ削減です。

Goのビルドコマンドでは、-ldflags オプションを使用してリンカにフラグを渡すことができます。例えば、デバッグ情報を除外してビルドするには、以下のように実行します。

go build -ldflags="-w" your_program.go

さらに、-s フラグ(シンボルテーブルとデバッグ情報を両方削除)と組み合わせて使用されることもあります。

go build -ldflags="-s -w" your_program.go

-s フラグはシンボルテーブルとデバッグ情報の両方を削除しますが、-w フラグは DWARF シンボルテーブルのみを削除します。このコミットは、-w フラグの具体的な役割を明確にすることで、開発者がより正確にバイナリの特性を制御できるようにするためのドキュメント改善です。

コアとなるコードの変更箇所

変更は src/cmd/ld/doc.go ファイルに限定されています。

--- a/src/cmd/ld/doc.go
+++ b/src/cmd/ld/doc.go
@@ -58,6 +58,8 @@ Options new in this version:
  		Omit the symbol table and debug information.
  	-V
  		Print the linker version.
 +	-w
 +		Omit the DWARF symbol table.
  	-X symbol value
  		Set the value of an otherwise uninitialized string variable.
  		The symbol name should be of the form importpath.name,

具体的には、Options new in this version: セクションに、-w フラグの説明として「Omit the DWARF symbol table.」という行が2行追加されています。

コアとなるコードの解説

このコミットは、Goリンカの動作を変更するものではなく、そのドキュメントを更新するものです。src/cmd/ld/doc.go は、Goリンカのコマンドラインオプションに関する公式ドキュメントとして機能します。このファイルに -w フラグの説明を追加することで、開発者が go tool link -help や関連ドキュメントを参照した際に、このフラグの機能が明確に表示されるようになります。

追加された行 + -w+ Omit the DWARF symbol table. は、リンカの -w オプションが DWARF シンボルテーブルの生成を抑制する目的で使用されることを簡潔に説明しています。これにより、Goバイナリのサイズを最適化したい開発者にとって、このオプションの存在と効果がより分かりやすくなります。

関連リンク

参考にした情報源リンク