Goプロダクションビルドからシンボル情報とデバッグ情報を除去
プロダクション向けのGoビルドに -s -w フラグを追加し、シンボル情報とDWARFデバッグ情報をバイナリから除去するようになりました。これにより、配布するバイナリのサイズが削減されます。
背景
Goのビルドにおいて、デフォルトではシンボルテーブルと DWARF(Debugging With Attributed Record Formats)デバッグ情報がバイナリに含まれます。これらはデバッガやプロファイラが利用する情報であり、開発・デバッグ時には有用ですが、エンドユーザーへ配布するプロダクションバイナリには不要です。バイナリサイズの削減と、リバースエンジニアリングに利用されうる情報の排除という観点から、プロダクションビルドでの除去が一般的なプラクティスとされています。
技術的な変更
Makefile の LDFLAGS に -s -w の2つのリンカフラグが追加されました。
変更前:
LDFLAGS := -ldflags "-X 'github.com/basecamp/once/internal/version.Version=$(VERSION)'"
変更後:
LDFLAGS := -ldflags "-s -w -X 'github.com/basecamp/once/internal/version.Version=$(VERSION)'"
各フラグの役割は以下のとおりです:
-
-s: シンボルテーブルとデバッグ情報を除去する -
-w: DWARFデバッグ情報の生成を無効化する
バージョン文字列を埋め込む -X フラグはそのまま維持されており、version.Version による実行時のバージョン参照は引き続き機能します。
設計判断
既存の -X フラグとの組み合わせという形で変更が加えられており、ビルドプロセス全体への影響は最小限です。-s と -w はGoツールチェーンが標準で提供するリンカオプションであり、外部ツールへの依存を追加せずに済む点でシンプルな選択といえます。なお、これらのフラグを指定したバイナリは dlv 等のデバッガによるシンボル解決が困難になるため、プロダクションビルドとデバッグビルドを明確に区別する運用が前提となります。
まとめ
1行の変更でありながら、プロダクションバイナリとしての適切な設定が整いました。シンボル情報とデバッグ情報の除去はGoの配布バイナリにおける標準的なプラクティスであり、この変更によってリリース成果物としての品質が向上します。