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

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

このコミットは、Goランタイムのテストコードにおけるgo tool nmコマンドの引数修正に関するものです。具体的には、nmコマンドのオプションが-Sから-sizeに変更されたことによるテストの修正を行っています。これは、以前の変更(nm CL)で導入されるべきだった修正が漏れていたため、その修正を適用するものです。

コミット

commit a392cf4fd36728efe852d422d702cb23f5ba6d73
Author: Russ Cox <rsc@golang.org>
Date:   Mon Dec 16 12:59:30 2013 -0500

    runtime: fix test
    
    Was supposed to be in the nm CL.
    
    TBR=r
    CC=golang-dev
    https://golang.org/cl/42870043

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

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

元コミット内容

このコミットの元々の意図は、「runtime: fix test」(ランタイム:テストを修正)という簡潔なものです。コミットメッセージの本文には、「Was supposed to be in the nm CL.」(nm CLに含まれるべきだった)とあり、これは以前の変更セット(Change List、GoコミュニティではCLと呼ばれる)で導入されるべきだった修正が、何らかの理由で漏れてしまったことを示唆しています。nm CLとは、go tool nmコマンドに関連する変更を指していると考えられます。

変更の背景

この変更の背景には、go tool nmコマンドのオプション変更があります。コミットメッセージにある「Was supposed to be in the nm CL.」という記述から、go tool nmコマンドの機能拡張または変更が行われ、その際に使用するオプション名が変更されたことが推測されます。

具体的には、以前はシンボルのサイズを表示するために-Sオプションが使用されていたものが、新しいnm CLの変更によって-sizeオプションに置き換えられたと考えられます。この変更に伴い、src/pkg/runtime/runtime_test.go内のテストコードが古いオプション-Sを使用していたため、新しい-sizeオプションに更新する必要が生じました。この更新がnm CLに含められなかったため、このコミットで別途修正が行われたという経緯です。

前提知識の解説

go tool nmコマンド

go tool nmは、Go言語のツールチェインに含まれるユーティリティの一つで、Goのオブジェクトファイル、アーカイブ、または実行可能ファイルに含まれるシンボル(関数、グローバル変数など)をリスト表示するために使用されます。これはUnix系のnmコマンドに似ていますが、Goバイナリに特化しています。

go tool nmの出力は通常、シンボルのアドレス、タイプ(T: テキスト、D: データなど)、および名前の3つのフィールドで構成されます。

go tool nmのオプション

  • -Sオプション (旧): このコミット以前に存在したオプションで、シンボルのサイズをアドレスとタイプの間に出力するために使用されていました。
  • -sizeオプション (新): -Sオプションに代わって導入された新しいオプションで、同様にシンボルのサイズをアドレスとタイプの間に出力します。この変更は、オプション名がより直感的で分かりやすくなるように行われた可能性があります。

Goのテストフレームワーク

Go言語には標準でtestingパッケージが提供されており、これを用いてユニットテストやベンチマークテストを記述します。テストファイルは通常、テスト対象のGoファイルと同じディレクトリに_test.goというサフィックスを付けて配置されます。テスト関数はTestで始まり、*testing.T型の引数を取ります。

このコミットで修正されているsrc/pkg/runtime/runtime_test.goは、Goランタイムのテストコードであり、exec.Commandを使用して外部コマンド(この場合はgo tool nm)を実行し、その出力を検証することでランタイムの特定の動作をテストしています。

技術的詳細

このコミットの技術的な核心は、go tool nmコマンドのオプション変更への対応です。

src/pkg/runtime/runtime_test.go内のTestRuntimeGogoBytes関数は、Goプログラムをビルドし、そのバイナリに対してgo tool nmを実行して、特定のシンボル情報(この場合はサイズ)を検証するテストです。

元のコードでは、exec.Command("go", "tool", "nm", "-S", dir+"/hello").CombinedOutput()という形で-Sオプションを使用していました。しかし、nm CLによってgo tool nmのシンボルサイズ表示オプションが-Sから-sizeに変更されたため、このテストコードもそれに合わせて更新する必要がありました。

この変更は、単にオプション名を置き換えるだけの単純な修正ですが、テストの正確性を保つ上で非常に重要です。もしこの修正が行われなければ、go tool nmコマンドが新しいバージョンで実行された際に、古い-Sオプションが認識されず、テストが失敗する可能性がありました。これは、Goツールチェインの内部的な変更が、それをテストするコードにも影響を与える典型的な例です。

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

--- a/src/pkg/runtime/runtime_test.go
+++ b/src/pkg/runtime/runtime_test.go
@@ -104,7 +104,7 @@ func TestRuntimeGogoBytes(t *testing.T) {
 		t.Fatalf("building hello world: %v\n%s", err, out)
 	}
 
-	out, err = exec.Command("go", "tool", "nm", "-S", dir+"/hello").CombinedOutput()
+	out, err = exec.Command("go", "tool", "nm", "-size", dir+"/hello").CombinedOutput()
 	if err != nil {
 		t.Fatalf("go tool nm: %v\n%s", err, out)
 	}

コアとなるコードの解説

変更された行はsrc/pkg/runtime/runtime_test.goファイルの106行目です。

  • 変更前:

    out, err = exec.Command("go", "tool", "nm", "-S", dir+"/hello").CombinedOutput()
    

    この行では、go tool nmコマンドを-Sオプション付きで実行し、dir+"/hello"で指定されたバイナリのシンボル情報を取得していました。-Sオプションはシンボルのサイズを表示するためのものでした。

  • 変更後:

    out, err = exec.Command("go", "tool", "nm", "-size", dir+"/hello").CombinedOutput()
    

    この行では、-Sオプションが新しい-sizeオプションに置き換えられています。これにより、go tool nmコマンドが正しくシンボルサイズ情報を出力し、テストが期待通りに動作するようになります。

この修正は、go tool nmコマンドのインターフェース変更にテストコードを適応させるためのものであり、Goツールチェインの進化に伴うメンテナンス作業の一環です。

関連リンク

  • 関連するChange List (CL): https://golang.org/cl/42870043 このリンクは、このコミットが本来含まれるべきだったnm CLを指していると考えられます。このCLを調査することで、go tool nmコマンドの具体的な変更内容や、なぜ-S-sizeに変わったのかといった詳細な背景を理解することができます。

参考にした情報源リンク