[インデックス 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
}
このコミットの変更は、TextAddr
と DataAddr
の2つのフィールドが FileHeader
構造体に追加されたことによるものです。
0x1000
(386アーキテクチャの場合) はTextAddr
に対応し、テキストセグメントの開始アドレスを示します。32
(386アーキテクチャの場合) はDataAddr
に対応し、データセグメントの開始アドレスを示します。
同様に、AMD64アーキテクチャの場合の 0x200000
と 40
もそれぞれ TextAddr
と DataAddr
に対応します。これらの値は、テスト対象となる特定の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つの値に加えて、新たに0x1000
と32
の2つの値が追加されています。これらは、前述の通りFileHeader
構造体に追加されたTextAddr
(テキストセグメントの開始アドレス) とDataAddr
(データセグメントの開始アドレス) に対応します。 -
- FileHeader{MagicAMD64, 0x618, 0x13, 8},
: これは、AMD64アーキテクチャ用のテストケースにおける、変更前のFileHeader
構造体の初期化です。同様に、マジックナンバー、テキスト、データ、BSSセクションのサイズが指定されていました。 -
+ FileHeader{MagicAMD64, 0x618, 0x13, 8, 0x200000, 40},
: これが変更後の初期化です。ここでも、既存の4つの値に加えて、新たに0x200000
と40
の2つの値が追加されています。これらはAMD64アーキテクチャにおけるTextAddr
とDataAddr
に対応します。
これらの変更は、FileHeader
構造体の定義が拡張されたことに伴い、テストコードがその新しい定義に準拠するように修正されたことを示しています。これにより、テストのコンパイルエラーが解消され、debug/plan9obj
パッケージがPlan 9実行可能ファイルのより詳細なヘッダ情報を正しく解析できるようになりました。
関連リンク
- Go CL (Code Review) リンク: https://golang.org/cl/106560044
参考にした情報源リンク
- Go言語の
debug/plan9obj
パッケージのドキュメント (当時のバージョン): https://pkg.go.dev/debug/plan9obj (現在のドキュメントは変更されている可能性がありますが、当時の構造を理解する上で参考になります) - Plan 9 a.out format (非公式な情報源を含む):
- Go言語のソースコード (当時の
debug/plan9obj/file.go
のFileHeader
構造体定義):- https://github.com/golang/go/blob/release-branch.go1.3/src/pkg/debug/plan9obj/file.go (このコミットが行われた時期に近いGo 1.3のブランチを参照)