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

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

このコミットは、Go言語のツールチェインの一部であるcmd/8l(386アーキテクチャ向けリンカ)におけるビルドの問題を修正するものです。具体的には、src/cmd/8l/obj.cファイル内のflagcount関数の引数が誤っていたのを修正しています。

コミット

commit ca727f1116d79537f80e546e78a5addb3c09fa34
Author: Russ Cox <rsc@golang.org>
Date:   Thu Jan 31 16:13:48 2013 -0800

    cmd/8l: fix build
    
    TBR=golang-dev
    CC=golang-dev
    https://golang.org/cl/7241061

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

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

元コミット内容

cmd/8l: fix build

TBR=golang-dev
CC=golang-dev
https://golang.org/cl/7241061

変更の背景

このコミットは、Go言語の初期のツールチェインにおけるビルドエラーを修正するために行われました。cmd/8lは、Goの初期段階で386アーキテクチャ(Intel x86 32ビット)向けのオブジェクトファイルをリンクするために使用されていたリンカです。Goのビルドシステムは、異なるアーキテクチャやオペレーティングシステムに対応するために、それぞれ専用のコンパイラ(例: 8g for 386 Go compiler)、アセンブラ(例: 8a for 386 assembler)、リンカ(例: 8l for 386 linker)を持っていました。

この特定の修正は、src/cmd/8l/obj.cファイル内でflagcount関数が誤った変数へのポインタを受け取っていたことが原因で発生したビルドの問題に対処しています。このようなビルドの不具合は、開発プロセスにおいて頻繁に発生するものであり、特に大規模なプロジェクトやクロスコンパイル環境では、ツールの設定や依存関係の変更によって容易に引き起こされます。

前提知識の解説

Go言語の初期ツールチェイン (cmd/8lなど)

Go言語の初期のビルドシステムは、Plan 9オペレーティングシステムのツールチェインに強く影響を受けていました。Plan 9のツールチェインは、異なるCPUアーキテクチャごとに専用のコンパイラ、アセンブラ、リンカを持っており、それぞれが数字と文字の組み合わせで命名されていました(例: 8c, 8a, 8l for 386; 6c, 6a, 6l for AMD64; 5c, 5a, 5l for ARM)。

  • 8l: 386アーキテクチャ向けのリンカです。アセンブラによって生成されたオブジェクトファイル(.oファイル)を結合し、実行可能ファイルやライブラリを生成する役割を担っていました。
  • obj.c: リンカの主要なロジックやオプション処理を実装しているC言語のソースファイルです。Goのツールチェインの多くは、初期にはC言語で書かれていました。

flagcount関数

Go言語のツールチェインでは、コマンドライン引数を解析するための独自のユーティリティ関数が使用されていました。flagcountはそのような関数の一つで、特定のコマンドラインフラグ(オプション)が指定された回数をカウントし、その結果をポインタで渡された変数に格納するために使用されます。

関数の一般的なシグネチャは以下のようになります(概念的な表現): flagcount(flag_name, description, *counter_variable)

  • flag_name: コマンドラインフラグの名前(例: "hostobj")。
  • description: フラグの説明。
  • *counter_variable: フラグが指定された回数を格納するための整数型変数へのポインタ。

このコミットでは、flagcount関数に渡す変数が&hostobjから&isobjに変更されています。これは、リンカの内部でオブジェクトファイルの生成に関連する状態を管理するための変数の名前が変更されたか、あるいは誤った変数が参照されていたために、正しい変数に修正されたことを示唆しています。

技術的詳細

このコミットの技術的な核心は、C言語におけるポインタの正しい使用と、Goツールチェインのコマンドライン引数解析メカニズムにあります。

flagcount関数は、コマンドラインオプションの処理を担当します。この関数は、特定のフラグ(この場合は-hostobj)がコマンドラインで出現した回数を追跡し、そのカウント結果を引数として渡されたポインタが指すメモリ位置に格納します。

元のコードでは、flagcount("hostobj", "generate host object file", &hostobj); となっていました。ここで&hostobjは、hostobjという名前の変数へのポインタを渡しています。しかし、このコミットでは、このポインタが&isobjに変更されています。

flagcount("hostobj", "generate host object file", &isobj);

この変更は、以下のいずれかの状況を示唆しています。

  1. 変数名の変更: hostobjという変数がisobjという名前にリファクタリングされたが、flagcountの呼び出し箇所が更新されていなかった。
  2. 論理的な誤り: hostobjという変数は存在したが、-hostobjフラグのカウント結果を格納すべき正しい変数はisobjであった。つまり、リンカの内部ロジックにおいて、hostobjisobjという2つの関連する変数があり、-hostobjフラグはisobjの状態を制御するべきだった、という論理的な誤りがあった。

Goのツールチェインの文脈では、hostobjisobjのような変数は、リンカがホストシステム(リンカが実行されている環境)のオブジェクトファイルを生成するかどうか、あるいは特定の種類のオブジェクトファイルを扱うかどうかを制御するブール値(またはカウント値)として機能していたと考えられます。この修正により、-hostobjフラグが意図したとおりにリンカの動作に影響を与えるようになり、ビルドが正常に完了するようになったと推測されます。

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

--- a/src/cmd/8l/obj.c
+++ b/src/cmd/8l/obj.c
@@ -114,7 +114,7 @@ main(int argc, char *argv[])
  	flagcount("d", "disable dynamic executable", &debug['d']);
  	flagcount("f", "ignore version mismatch", &debug['f']);
  	flagcount("g", "disable go package data checks", &debug['g']);
-	flagcount("hostobj", "generate host object file", &hostobj);
+	flagcount("hostobj", "generate host object file", &isobj);
  	flagstr("k", "sym: set field tracking symbol", &tracksym);
  	flagstr("o", "outfile: set output file", &outfile);
  	flagcount("p", "insert profiling code", &debug['p']);

コアとなるコードの解説

変更はsrc/cmd/8l/obj.cファイルのmain関数内で行われています。このmain関数は、リンカの起動時にコマンドライン引数を解析する部分です。

元のコード: flagcount("hostobj", "generate host object file", &hostobj); ここでは、-hostobjというフラグが指定された場合に、そのカウント結果をhostobjという変数に格納しようとしていました。

修正後のコード: flagcount("hostobj", "generate host object file", &isobj); この行では、-hostobjフラグのカウント結果をisobjという変数に格納するように変更されています。

この変更は、リンカの内部で-hostobjフラグが制御するべき変数が、実際にはhostobjではなくisobjであったことを示しています。おそらく、hostobjisobjはリンカの異なる側面を制御する変数であり、-hostobjフラグの意図された機能はisobjに影響を与えることだったのでしょう。この修正により、リンカは-hostobjフラグの指定に応じて正しく動作し、ビルドプロセスが正常に完了するようになりました。

関連リンク

  • Go言語の公式リポジトリ: https://github.com/golang/go
  • Go言語の初期ツールチェインに関する議論(GoのIssueやDesign Docなど)

参考にした情報源リンク

  • Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージにあるgolang.org/cl/7241061はこのシステムへのリンクです)
  • Plan 9 from Bell Labs (Goのツールチェインのルーツ): https://9p.io/plan9/
  • Go言語の初期のビルドプロセスに関するドキュメントやブログ記事 (例: "Go's Toolchain" by Russ Coxなど)

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

このコミットは、Go言語のツールチェインの一部であるcmd/8l(386アーキテクチャ向けリンカ)におけるビルドの問題を修正するものです。具体的には、src/cmd/8l/obj.cファイル内のflagcount関数の引数が誤っていたのを修正しています。

コミット

commit ca727f1116d79537f80e546e78a5addb3c09fa34
Author: Russ Cox <rsc@golang.org>
Date:   Thu Jan 31 16:13:48 2013 -0800

    cmd/8l: fix build
    
    TBR=golang-dev
    CC=golang-dev
    https://golang.org/cl/7241061

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

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

元コミット内容

cmd/8l: fix build

TBR=golang-dev
CC=golang-dev
https://golang.org/cl/7241061

変更の背景

このコミットは、Go言語の初期のツールチェインにおけるビルドエラーを修正するために行われました。cmd/8lは、Goの初期段階で386アーキテクチャ(Intel x86 32ビット)向けのオブジェクトファイルをリンクするために使用されていたリンカです。Goのビルドシステムは、異なるアーキテクチャやオペレーティングシステムに対応するために、それぞれ専用のコンパイラ(例: 8g for 386 Go compiler)、アセンブラ(例: 8a for 386 assembler)、リンカ(例: 8l for 386 linker)を持っていました。

この特定の修正は、src/cmd/8l/obj.cファイル内でflagcount関数が誤った変数へのポインタを受け取っていたことが原因で発生したビルドの問題に対処しています。このようなビルドの不具合は、開発プロセスにおいて頻繁に発生するものであり、特に大規模なプロジェクトやクロスコンパイル環境では、ツールの設定や依存関係の変更によって容易に引き起こされます。

前提知識の解説

Go言語の初期ツールチェイン (cmd/8lなど)

Go言語の初期のビルドシステムは、Plan 9オペレーティングシステムのツールチェインに強く影響を受けていました。Plan 9のツールチェインは、異なるCPUアーキテクチャごとに専用のコンパイラ、アセンブラ、リンカを持っており、それぞれが数字と文字の組み合わせで命名されていました(例: 8c, 8a, 8l for 386; 6c, 6a, 6l for AMD64; 5c, 5a, 5l for ARM)。

  • 8l: 386アーキテクチャ向けのリンカです。アセンブラによって生成されたオブジェクトファイル(.oファイル)を結合し、実行可能ファイルやライブラリを生成する役割を担っていました。
  • obj.c: リンカの主要なロジックやオプション処理を実装しているC言語のソースファイルです。Goのツールチェインの多くは、初期にはC言語で書かれていました。

flagcount関数

Go言語のツールチェインでは、コマンドライン引数を解析するための独自のユーティリティ関数が使用されていました。flagcountはそのような関数の一つで、特定のコマンドラインフラグ(オプション)が指定された回数をカウントし、その結果をポインタで渡された変数に格納するために使用されます。

関数の一般的なシグネチャは以下のようになります(概念的な表現): flagcount(flag_name, description, *counter_variable)

  • flag_name: コマンドラインフラグの名前(例: "hostobj")。
  • description: フラグの説明。
  • *counter_variable: フラグが指定された回数を格納するための整数型変数へのポインタ。

このコミットでは、flagcount関数に渡す変数が&hostobjから&isobjに変更されています。これは、リンカの内部でオブジェクトファイルの生成に関連する状態を管理するための変数の名前が変更されたか、あるいは誤った変数が参照されていたために、正しい変数に修正されたことを示唆しています。

技術的詳細

このコミットの技術的な核心は、C言語におけるポインタの正しい使用と、Goツールチェインのコマンドライン引数解析メカニズムにあります。

flagcount関数は、コマンドラインオプションの処理を担当します。この関数は、特定のフラグ(この場合は-hostobj)がコマンドラインで出現した回数を追跡し、そのカウント結果を引数として渡されたポインタが指すメモリ位置に格納します。

元のコードでは、flagcount("hostobj", "generate host object file", &hostobj); となっていました。ここで&hostobjは、hostobjという名前の変数へのポインタを渡しています。しかし、このコミットでは、このポインタが&isobjに変更されています。

flagcount("hostobj", "generate host object file", &isobj);

この変更は、以下のいずれかの状況を示唆しています。

  1. 変数名の変更: hostobjという変数がisobjという名前にリファクタリングされたが、flagcountの呼び出し箇所が更新されていなかった。
  2. 論理的な誤り: hostobjという変数は存在したが、-hostobjフラグのカウント結果を格納すべき正しい変数はisobjであった。つまり、リンカの内部ロジックにおいて、hostobjisobjという2つの関連する変数があり、-hostobjフラグはisobjの状態を制御するべきだった、という論理的な誤りがあった。

Goのツールチェインの文脈では、hostobjisobjのような変数は、リンカがホストシステム(リンカが実行されている環境)のオブジェクトファイルを生成するかどうか、あるいは特定の種類のオブジェクトファイルを扱うかどうかを制御するブール値(またはカウント値)として機能していたと考えられます。この修正により、-hostobjフラグが意図したとおりにリンカの動作に影響を与えるようになり、ビルドが正常に完了するようになったと推測されます。

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

--- a/src/cmd/8l/obj.c
+++ b/src/cmd/8l/obj.c
@@ -114,7 +114,7 @@ main(int argc, char *argv[])
  	flagcount("d", "disable dynamic executable", &debug['d']);
  	flagcount("f", "ignore version mismatch", &debug['f']);
  	flagcount("g", "disable go package data checks", &debug['g']);
-	flagcount("hostobj", "generate host object file", &hostobj);
+	flagcount("hostobj", "generate host object file", &isobj);
  	flagstr("k", "sym: set field tracking symbol", &tracksym);
  	flagstr("o", "outfile: set output file", &outfile);
  	flagcount("p", "insert profiling code", &debug['p']);

コアとなるコードの解説

変更はsrc/cmd/8l/obj.cファイルのmain関数内で行われています。このmain関数は、リンカの起動時にコマンドライン引数を解析する部分です。

元のコード: flagcount("hostobj", "generate host object file", &hostobj); ここでは、-hostobjというフラグが指定された場合に、そのカウント結果をhostobjという変数に格納しようとしていました。

修正後のコード: flagcount("hostobj", "generate host object file", &isobj); この行では、-hostobjフラグのカウント結果をisobjという変数に格納するように変更されています。

この変更は、リンカの内部で-hostobjフラグが制御するべき変数が、実際にはhostobjではなくisobjであったことを示しています。おそらく、hostobjisobjはリンカの異なる側面を制御する変数であり、-hostobjフラグの意図された機能はisobjに影響を与えることだったのでしょう。この修正により、リンカは-hostobjフラグの指定に応じて正しく動作し、ビルドプロセスが正常に完了するようになりました。

関連リンク

  • Go言語の公式リポジトリ: https://github.com/golang/go
  • Go言語の初期ツールチェインに関する議論(GoのIssueやDesign Docなど)

参考にした情報源リンク