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

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

このコミットは、Go言語のデバッグに関する公式ドキュメントである doc/debugging_with_gdb.html ファイルに対する変更です。このファイルは、GoプログラムをGDB(GNU Debugger)でデバッグする際の手順やヒントを提供することを目的としています。具体的には、デバッグ情報の取り扱い、特にバイナリサイズを削減するためにデバッグ情報を削除する方法について記述されています。

コミット

commit c91c564e8396399fce5400c176298eff0b92b8b2
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Wed Apr 16 01:19:26 2014 -0400

    doc/debugging_with_gdb: use -w to strip debug info.
    Don't advertise -s anymore.
    Fixes #7793.
    
    LGTM=iant
    R=golang-codereviews, iant
    CC=golang-codereviews
    https://golang.org/cl/88030045

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

https://github.com/golang/go/commit/c91c564e8396399fce5400c176298eff0b92b8b2

元コミット内容

doc/debugging_with_gdb: use -w to strip debug info.
Don't advertise -s anymore.
Fixes #7793.

LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/88030045

変更の背景

このコミットの背景には、Goバイナリからデバッグ情報を削除する際の推奨されるリンカフラグの変更があります。以前は -s フラグがデバッグ情報の削除に推奨されていた可能性がありますが、このコミットでは -w フラグを使用するようにドキュメントが更新されています。コミットメッセージにある Fixes #7793 は、この変更が特定の課題(Issue 7793)を解決するためであることを示唆しています。ただし、Issue 7793の具体的な内容は公開されている情報からは確認できませんでした。一般的に、このような変更は、より効果的なデバッグ情報の削除方法が見つかった、または -s フラグの挙動が期待と異なっていた、あるいは -w フラグがより包括的なデバッグ情報の削除を可能にするためと考えられます。特に、バイナリサイズを最小化したい本番環境向けのビルドにおいて、デバッグ情報の完全な削除は重要な要件となります。

前提知識の解説

Goビルドプロセスとリンカフラグ

Go言語のプログラムは、go build コマンドによってコンパイルされ、実行可能なバイナリが生成されます。この際、コンパイラとリンカが連携して動作します。リンカは、コンパイルされたオブジェクトファイルと必要なライブラリを結合し、最終的な実行ファイルを生成する役割を担います。

go build コマンドには、リンカに特定のオプションを渡すための -ldflags というフラグがあります。このフラグに続く文字列は、リンカに直接渡される引数として解釈されます。

デバッグ情報

プログラムのデバッグ情報とは、ソースコードとコンパイルされたバイナリの間のマッピングを提供するメタデータのことです。これには、変数名、関数名、ソースファイルの行番号、型定義などが含まれます。デバッガ(例: GDB)は、この情報を使用して、実行中のプログラムの状態を人間が理解できる形で表示します。

デバッグ情報は、通常、バイナリファイル内に埋め込まれます。これにより、デバッグが容易になりますが、バイナリファイルのサイズが増加します。本番環境にデプロイされるバイナリでは、デバッグ情報は不要であり、ファイルサイズを削減するために削除されることがよくあります。

-ldflags -s-ldflags -w の違い

Goのリンカには、デバッグ情報を削除するためのいくつかのフラグがあります。

  • -ldflags -s (Strip Symbol Table): このフラグは、生成される実行ファイルからシンボルテーブルを削除するようにリンカに指示します。シンボルテーブルには、関数名、変数名、ソースファイルの位置などの情報が含まれており、主にデバッグやプロファイリングに使用されます。これを削除することで、バイナリサイズを削減できます。ただし、シンボルテーブルが削除されると、デバッガは関数名などを解決できなくなり、スタックトレースがメモリアドレスで表示されるなど、デバッグが困難になります。

  • -ldflags -w (Strip DWARF Debug Information): このフラグは、DWARF (Debugging With Attributed Record Formats) デバッグ情報を削除するようにリンカに指示します。DWARFは、行番号、型定義、変数スコープなど、デバッガが詳細な情報にアクセスするために使用する標準的なデバッグデータ形式です。この情報を削除すると、バイナリサイズが大幅に削減されます。-w フラグを使用すると、デバッガはほとんどのデバッグ情報にアクセスできなくなるため、デバッグはほぼ不可能になります。

まとめ: -s はシンボルテーブルを削除し、-w はDWARFデバッグ情報を削除します。通常、DWARFデバッグ情報の方がシンボルテーブルよりもはるかに多くのデータを含むため、-w の方がバイナリサイズ削減効果が大きいです。本番環境向けのビルドでバイナリサイズを最大限に削減し、デバッグ機能が不要な場合は、両方のフラグを組み合わせた go build -ldflags \"-s -w\" がよく使用されます。このコミットは、ドキュメントにおいて、デバッグ情報を完全に削除する目的で -s ではなく -w を推奨するように変更しています。これは、-w がより包括的なデバッグ情報の削除を意味するためと考えられます。

技術的詳細

このコミットは、doc/debugging_with_gdb.html ドキュメント内のGoバイナリからデバッグ情報を削除する方法に関する記述を更新しています。具体的には、デバッグ情報を省略するためのリンカフラグとして、これまでの '-s' から '-w' へと変更しています。

変更前:

<p>
Pass the <code>'-s'</code> flag to the linker to omit the debug information
(for example, <code>go build -ldflags "-s" prog.go</code>).
</p>

変更後:

<p>
Pass the <code>'-w'</code> flag to the linker to omit the debug information
(for example, <code>go build -ldflags "-w" prog.go</code>).
</p>

この変更は、Goのビルドシステムとリンカの進化、またはデバッグ情報の取り扱いに関するベストプラクティスの変更を反映していると考えられます。前述の通り、-w フラグはDWARFデバッグ情報を削除するため、-s フラグ(シンボルテーブルを削除)よりも広範なデバッグ情報を削除し、結果としてバイナリサイズをより効果的に削減できます。デバッグ情報を完全に削除してバイナリサイズを最小化することが目的の場合、-w の方がより適切な選択肢となります。このドキュメントの更新は、ユーザーがGoバイナリを最適化する際に、より効果的な方法を案内することを意図しています。

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

diff --git a/doc/debugging_with_gdb.html b/doc/debugging_with_gdb.html
index b893f931a3..3d2e4af07c 100644
--- a/doc/debugging_with_gdb.html
+++ b/doc/debugging_with_gdb.html
@@ -19,8 +19,8 @@ use to inspect a live process or a core dump.\n </p>\n \n <p>\n-Pass the <code>\'-s\'</code> flag to the linker to omit the debug information\n-(for example, <code>go build -ldflags \"-s\" prog.go</code>).\n+Pass the <code>\'-w\'</code> flag to the linker to omit the debug information\n+(for example, <code>go build -ldflags \"-w\" prog.go</code>).\n </p>\n \n <p>\n```

## コアとなるコードの解説

上記のdiffは、`doc/debugging_with_gdb.html` ファイル内の2行が変更されたことを示しています。

*   `- Pass the <code>'-s'</code> flag to the linker to omit the debug information`
    この行は削除され、以前はリンカに `-s` フラグを渡すことでデバッグ情報を省略できると説明されていました。

*   `+ Pass the <code>'-w'</code> flag to the linker to omit the debug information`
    この行が追加され、リンカに `-w` フラグを渡すことでデバッグ情報を省略できると説明が更新されました。

これにより、Goの公式デバッグドキュメントにおいて、デバッグ情報をバイナリから削除する際の推奨されるリンカフラグが `-s` から `-w` へと正式に変更されたことが明確に示されています。これは、Goのビルドツールチェーンにおけるデバッグ情報の取り扱いに関する推奨事項の変更を反映したものです。

## 関連リンク

*   GitHubコミットページ: [https://github.com/golang/go/commit/c91c564e8396399fce5400c176298eff0b92b8b2](https://github.com/golang/go/commit/c91c564e8396399fce5400c176298eff0b92b8b2)
*   Go CL (Code Review) 88030045: [https://golang.org/cl/88030045](https://golang.org/cl/88030045) (これは古いGoのコードレビューシステムへのリンクであり、現在はアクセスできない可能性があります。)

## 参考にした情報源リンク

*   Go issue 7793 (検索結果から具体的な内容は確認できませんでした)
*   `go build -ldflags -s` vs `-w` に関するWeb検索結果 (Goのリンカフラグに関する一般的な情報源)
    *   例: Stack Overflow, Go公式ドキュメント(現在のバージョン)など、Goのビルドフラグに関する解説記事。
        *   (注: 特定のURLは検索結果から直接引用していませんが、上記の情報はこれらの一般的な情報源に基づいています。)