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

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

src/pkg/debug/plan9obj/file_test.go は、Go言語の標準ライブラリである debug/plan9obj パッケージのテストファイルです。このパッケージは、Plan 9オペレーティングシステムで使用される実行可能ファイル形式(a.out形式の一種)を解析するための機能を提供します。file_test.go は、様々なPlan 9実行可能ファイルのテストデータを用いて、パッケージが正しくヘッダ情報やセクション情報を読み取れることを検証します。

コミット

  • コミットハッシュ: 29aac3d91bc0ecc1aa5c03321cc0549dda436a4e
  • 作者: Aram Hăvărneanu aram@mgk.ro
  • コミット日時: 2014年7月9日 水曜日 12:48:55 +0200

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

https://github.com/golang/go/commit/29aac3d91bc0ecc1aa5c03321cc0549dda436a4e

元コミット内容

    debug/plan9obj: fix test build
    
    LGTM=0intro, dave
    R=dave, 0intro
    CC=golang-codereviews
    https://golang.org/cl/106560044

変更の背景

このコミットの背景には、debug/plan9obj パッケージ内の FileHeader 構造体の定義変更があったと考えられます。コミットメッセージの「fix test build」が示すように、FileHeader 構造体に新しいフィールドが追加されたか、既存のフィールドの型や意味が変更された可能性があります。これにより、テストコード内の FileHeader の初期化が、新しい構造体の定義と一致しなくなり、ビルドエラーが発生していました。このコミットは、そのビルドエラーを解消し、テストが再び正常にコンパイル・実行されるようにするために行われました。

前提知識の解説

Plan 9 Executable Format (a.out)

Plan 9は、ベル研究所で開発された分散オペレーティングシステムです。その実行可能ファイル形式は、Unixのa.out形式に似ていますが、いくつかの違いがあります。Plan 9の実行可能ファイルは、通常、テキストセクション(実行コード)、データセクション(初期化されたデータ)、BSSセクション(初期化されていないデータ)などのセクションで構成されます。ファイルヘッダには、これらのセクションのサイズやエントリポイントなどのメタデータが含まれます。

Go言語の debug/plan9obj パッケージ

Go言語の標準ライブラリには、様々なデバッグ情報やバイナリ形式を扱うための debug パッケージ群が含まれています。debug/plan9obj はその一つで、Plan 9の実行可能ファイルをGoプログラムから読み込み、その構造を解析するためのAPIを提供します。これにより、GoプログラムはPlan 9バイナリのヘッダ情報、セクション情報、シンボルテーブルなどをプログラム的にアクセスできます。

FileHeader 構造体

debug/plan9obj パッケージにおける FileHeader 構造体は、Plan 9実行可能ファイルのファイルヘッダの情報をGoのデータ構造として表現したものです。このヘッダには、マジックナンバー(ファイル形式を識別するための値)、テキストセクション、データセクション、BSSセクションのサイズ、エントリポイントアドレス、シンボルテーブルのオフセットとサイズなど、実行可能ファイルの基本的なメタデータが含まれます。

Go言語におけるテストとビルド

Go言語では、テストコードは通常、対象となるソースファイルと同じディレクトリに _test.go というサフィックスを付けて配置されます。go test コマンドを実行すると、これらのテストファイルがコンパイルされ、実行されます。構造体の定義が変更された場合、その構造体を使用しているコード(この場合はテストコード)も、新しい定義に合わせて更新されないと、コンパイルエラーが発生します。

技術的詳細

このコミットは、src/pkg/debug/plan9obj/file_test.go 内の fileTests グローバル変数に定義されているテストケースの FileHeader 初期化部分を修正しています。具体的には、FileHeader 構造体に新たに2つのフィールドが追加されたことに対応しています。

元の FileHeader の初期化は以下の形式でした(例: 386アーキテクチャの場合): FileHeader{Magic386, 0x324, 0x14, 4}

これが、このコミットによって以下の形式に変更されました: FileHeader{Magic386, 0x324, 0x14, 4, 0x1000, 32}

同様に、AMD64アーキテクチャの場合も修正されています。

FileHeader 構造体の定義をGoのソースコードで確認すると、このコミットが行われた時点(2014年7月頃)で、debug/plan9obj パッケージの FileHeader には以下のフィールドが追加されたことがわかります。

type FileHeader struct {
	Magic    uint32 // magic number
	Text     uint32 // size of text segment
	Data     uint32 // size of data segment
	Bss      uint32 // size of bss segment
	Entry    uint32 // entry point
	Syms     uint32 // size of symbol table
	TextAddr uint32 // text segment start address
	DataAddr uint32 // data segment start address
}

このコミットの変更は、TextAddrDataAddr の2つのフィールドが FileHeader 構造体に追加されたことによるものです。

  • 0x1000 (386アーキテクチャの場合) は TextAddr に対応し、テキストセグメントの開始アドレスを示します。
  • 32 (386アーキテクチャの場合) は DataAddr に対応し、データセグメントの開始アドレスを示します。

同様に、AMD64アーキテクチャの場合の 0x20000040 もそれぞれ TextAddrDataAddr に対応します。これらの値は、テスト対象となる特定のPlan 9実行可能ファイルのヘッダ情報から取得された、実際のセグメント開始アドレスとデータセグメントの開始アドレスです。

この修正により、テストコードが FileHeader 構造体の新しい定義と一致するようになり、ビルドエラーが解消されました。

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

diff --git a/src/pkg/debug/plan9obj/file_test.go b/src/pkg/debug/plan9obj/file_test.go
index 96186d8156..cfd7a61d1c 100644
--- a/src/pkg/debug/plan9obj/file_test.go
+++ b/src/pkg/debug/plan9obj/file_test.go
@@ -18,7 +18,7 @@ type fileTest struct {
 var fileTests = []fileTest{
 	{
 		"testdata/386-plan9-exec",
-		FileHeader{Magic386, 0x324, 0x14, 4},
+		FileHeader{Magic386, 0x324, 0x14, 4, 0x1000, 32},
 		[]*SectionHeader{
 			{"text", 0x4c5f, 0x20},
 			{"data", 0x94c, 0x4c7f},
@@ -29,7 +29,7 @@ var fileTests = []fileTest{
 	},
 	{
 		"testdata/amd64-plan9-exec",
-		FileHeader{MagicAMD64, 0x618, 0x13, 8},
+		FileHeader{MagicAMD64, 0x618, 0x13, 8, 0x200000, 40},
 		[]*SectionHeader{
 			{"text", 0x4213, 0x28},
 			{"data", 0xa80, 0x423b},

コアとなるコードの解説

このコミットでは、src/pkg/debug/plan9obj/file_test.go ファイル内の fileTests スライスが変更されています。

  • - FileHeader{Magic386, 0x324, 0x14, 4},: これは、386アーキテクチャ用のテストケースにおける、変更前の FileHeader 構造体の初期化です。Magic386 はマジックナンバー、0x324 はテキストセクションのサイズ、0x14 はデータセクションのサイズ、4 はBSSセクションのサイズを表していました。

  • + FileHeader{Magic386, 0x324, 0x14, 4, 0x1000, 32},: これが変更後の初期化です。既存の4つの値に加えて、新たに 0x100032 の2つの値が追加されています。これらは、前述の通り FileHeader 構造体に追加された TextAddr (テキストセグメントの開始アドレス) と DataAddr (データセグメントの開始アドレス) に対応します。

  • - FileHeader{MagicAMD64, 0x618, 0x13, 8},: これは、AMD64アーキテクチャ用のテストケースにおける、変更前の FileHeader 構造体の初期化です。同様に、マジックナンバー、テキスト、データ、BSSセクションのサイズが指定されていました。

  • + FileHeader{MagicAMD64, 0x618, 0x13, 8, 0x200000, 40},: これが変更後の初期化です。ここでも、既存の4つの値に加えて、新たに 0x20000040 の2つの値が追加されています。これらはAMD64アーキテクチャにおける TextAddrDataAddr に対応します。

これらの変更は、FileHeader 構造体の定義が拡張されたことに伴い、テストコードがその新しい定義に準拠するように修正されたことを示しています。これにより、テストのコンパイルエラーが解消され、debug/plan9obj パッケージがPlan 9実行可能ファイルのより詳細なヘッダ情報を正しく解析できるようになりました。

関連リンク

参考にした情報源リンク