[インデックス 11128] ファイルの概要
コミット
commit 267f56e10bedaf86eff9ef5bfe3886b2fec6435a
Author: Russ Cox <rsc@golang.org>
Date: Thu Jan 12 10:23:24 2012 -0800
ld: parse but do not implement -X flag
This will let programs invoking ld prepare for it.
See issue 2676.
R=iant
CC=golang-dev
https://golang.org/cl/5535044
---
src/cmd/5l/obj.c | 5 +++++
src/cmd/6l/obj.c | 5 +++++
src/cmd/8l/obj.c | 5 +++++
3 files changed, 15 insertions(+)
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c
index b93dc63fc9..1496719439 100644
--- a/src/cmd/5l/obj.c
+++ b/src/cmd/5l/obj.c
@@ -136,6 +136,11 @@ main(int argc, char *argv[])
case 'V':
print("%cl version %s\n", thechar, getgoversion());
errorexit();
+ case 'X':
+ // TODO: golang.org/issue/2676
+ EARGF(usage());
+ EARGF(usage());
+ break;
} ARGEND
USED(argc);\ndiff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c
index c8a46fc2bf..a1f9e2d111 100644
--- a/src/cmd/6l/obj.c
+++ b/src/cmd/6l/obj.c
@@ -132,6 +132,11 @@ main(int argc, char *argv[])
case 'V':
print("%cl version %s\n", thechar, getgoversion());
errorexit();
+ case 'X':
+ // TODO: golang.org/issue/2676
+ EARGF(usage());
+ EARGF(usage());
+ break;
} ARGEND
if(argc != 1)\ndiff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c
index 58349c6f89..99726ec180 100644
--- a/src/cmd/8l/obj.c
+++ b/src/cmd/8l/obj.c
@@ -137,6 +137,11 @@ main(int argc, char *argv[])
case 'V':
print("%cl version %s\n", thechar, getgoversion());
errorexit();
+ case 'X':
+ // TODO: golang.org/issue/2676
+ EARGF(usage());
+ EARGF(usage());
+ break;
} ARGEND
if(argc != 1)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/267f56e10bedaf86eff9ef5bfe3886b2fec6435a
元コミット内容
ld: parse but do not implement -X flag
This will let programs invoking ld prepare for it.
See issue 2676.
R=iant
CC=golang-dev
https://golang.org/cl/5535044
変更の背景
このコミットは、Go言語のリンカ(ld
)に、将来的に導入される新しいコマンドラインフラグ-X
のための準備的な変更を加えるものです。コミットメッセージにある「This will let programs invoking ld prepare for it. (リンカを呼び出すプログラムがそれに備えることができるようになる)」という記述から、このフラグが将来的に重要な機能を持つことが示唆されています。
-X
フラグの具体的な機能は、golang.org/issue/2676
で議論されているとされていますが、現時点ではその詳細を直接確認することはできません。しかし、このコミットの目的は、-X
フラグがリンカによって認識されるようにすることで、リンカを利用する他のツールやスクリプトが、この新しいフラグの存在を考慮し、将来の変更に備えることができるようにすることにあります。これにより、実際の機能が実装される前に、エコシステム全体がスムーズに移行できるようになります。
前提知識の解説
- Go言語: Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型言語であり、並行処理に強みを持っています。
- リンカ (ld): リンカ(Linker)は、コンパイラによって生成されたオブジェクトファイルや、標準ライブラリ、サードパーティライブラリなどを結合し、最終的に実行可能なプログラム(バイナリ)を生成するソフトウェアツールです。Go言語のビルドプロセスにおいて、
go build
コマンドの内部でリンカが呼び出され、ソースコードから最終的な実行ファイルが作成されます。Goのリンカは、ターゲットとするCPUアーキテクチャ(例: ARM, amd64, 386)に応じて、5l
,6l
,8l
といった異なる名前を持つことがあります。5l
: ARMアーキテクチャ向けのリンカ6l
: AMD64 (x86-64) アーキテクチャ向けのリンカ8l
: 386 (x86) アーキテクチャ向けのリンカ
- コマンドライン引数: プログラムの起動時に、その動作を制御するために渡されるパラメータです。
-X
のような「フラグ」は、特定のオプションを有効にしたり、設定値を渡したりするために使用されます。 EARGF(usage())
: これはGoのリンカのソースコード内で使用されている内部マクロです。コマンドライン引数解析中に、予期しない引数や不正な引数が見つかった場合に、プログラムの正しい使用方法(usage message)を標準出力に表示し、プログラムを終了させるために用いられます。これにより、ユーザーはどのようにプログラムを正しく使用すればよいかを知ることができます。
技術的詳細
このコミットは、Go言語のリンカ(src/cmd/5l/obj.c
, src/cmd/6l/obj.c
, src/cmd/8l/obj.c
)のコマンドライン引数解析部分に、-X
フラグを認識するためのロジックを追加します。
主な技術的ポイントは以下の通りです。
- フラグの解析のみ: このコミットは
-X
フラグを「解析」しますが、「実装」はしません。これは、リンカが-X
フラグがコマンドラインに存在することを認識するようになりますが、そのフラグが渡されても、現時点では特定の機能が実行されるわけではないことを意味します。 - プレースホルダーとしての挙動: 追加されたコードは、
main
関数の引数解析ループ内にcase 'X':
ブロックを設けています。このブロックの内部では、// TODO: golang.org/issue/2676
というコメントと、EARGF(usage());
の呼び出しが2回記述されています。TODO
コメントは、この-X
フラグの実際の機能実装が、Goの公式IssueトラッカーのIssue 2676で追跡されていることを示しています。EARGF(usage());
の呼び出しは、-X
フラグがリンカに渡された場合、リンカがすぐに使用方法メッセージを表示して終了することを意味します。これは、-X
フラグがまだ有効な機能を持たないことを明確にし、誤用を防ぐための暫定的な措置です。
- 将来への備え: この変更の主な目的は、
-X
フラグが将来的に導入されることを、リンカを呼び出す他のプログラムやビルドシステムに「知らせる」ことにあります。これにより、それらのプログラムは、-X
フラグの存在を考慮した上で、将来のリンカのバージョンアップや機能追加に備えることができます。例えば、-X
フラグを渡すようなスクリプトを事前に作成しておくことが可能になりますが、現時点ではそのフラグはエラーを発生させます。
このコミットは、Goのツールチェイン開発における一般的なプラクティスを示しています。すなわち、大規模な機能追加を行う際には、まずその機能に関連するコマンドラインオプションやAPIの「予約」を行い、その後に実際の機能を段階的に実装していくというアプローチです。これにより、互換性の問題を最小限に抑えつつ、開発を進めることができます。
コアとなるコードの変更箇所
以下の3つのファイルが変更されました。
src/cmd/5l/obj.c
src/cmd/6l/obj.c
src/cmd/8l/obj.c
これらのファイルは、それぞれ異なるCPUアーキテクチャ(ARM, AMD64, 386)向けのGoリンカのソースコードです。各ファイルのmain
関数内にあるコマンドライン引数解析のswitch
文に、-X
フラグを処理するための新しいcase
文が追加されています。
追加されたコードスニペットは以下の通りです。
case 'X':
// TODO: golang.org/issue/2676
EARGF(usage());
EARGF(usage());
break;
コアとなるコードの解説
追加されたcase 'X':
ブロックは、リンカがコマンドライン引数として-X
を受け取った際の挙動を定義しています。
// TODO: golang.org/issue/2676
コメントは、この-X
フラグの具体的な機能がまだ実装されておらず、GoのIssueトラッカーのIssue 2676でその詳細が議論されていることを示唆しています。これは開発者向けのメモであり、将来の作業項目を示しています。EARGF(usage());
の呼び出しが2回記述されています。これは、-X
フラグが渡された場合に、リンカが即座にエラーメッセージ(プログラムの使用方法)を表示して終了することを保証します。このマクロは、引数解析中にエラーが発生した場合に、ユーザーに適切なフィードバックを提供するために使用されます。この場合、-X
フラグはまだ機能を持たないため、リンカはこれを「不正な使用」とみなし、終了します。break;
は、switch
文の通常のフローを終了させます。
この変更により、リンカは-X
フラグを認識するようになりますが、その機能は将来のコミットで追加される予定です。この「解析するが実装しない」というアプローチは、リンカのユーザーがこのフラグの存在を認識し、将来の互換性のために準備することを可能にします。例えば、ビルドスクリプトなどで-X
フラグを試すことができるようになりますが、現時点ではエラーで終了するため、実際の機能が実装されるまでは利用できません。
関連リンク
- GitHub上のコミットページ: https://github.com/golang/go/commit/267f56e10bedaf86eff9ef5bfe3886b2fec6435a
- Go Gerrit Change-ID: https://golang.org/cl/5535044
- 関連するGo Issue:
golang.org/issue/2676
(このIssueの具体的な内容は、公開されている情報からは確認できませんでしたが、-X
フラグの将来的な機能について議論されていると推測されます。)
参考にした情報源リンク
- (今回の解説は、提供されたコミット情報と、Go言語のリンカおよびビルドプロセスに関する一般的な知識に基づいて作成されました。特定の外部情報源への直接的なリンクはありません。)