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

[インデックス 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フラグを認識するためのロジックを追加します。

主な技術的ポイントは以下の通りです。

  1. フラグの解析のみ: このコミットは-Xフラグを「解析」しますが、「実装」はしません。これは、リンカが-Xフラグがコマンドラインに存在することを認識するようになりますが、そのフラグが渡されても、現時点では特定の機能が実行されるわけではないことを意味します。
  2. プレースホルダーとしての挙動: 追加されたコードは、main関数の引数解析ループ内にcase 'X':ブロックを設けています。このブロックの内部では、// TODO: golang.org/issue/2676というコメントと、EARGF(usage());の呼び出しが2回記述されています。
    • TODOコメントは、この-Xフラグの実際の機能実装が、Goの公式IssueトラッカーのIssue 2676で追跡されていることを示しています。
    • EARGF(usage());の呼び出しは、-Xフラグがリンカに渡された場合、リンカがすぐに使用方法メッセージを表示して終了することを意味します。これは、-Xフラグがまだ有効な機能を持たないことを明確にし、誤用を防ぐための暫定的な措置です。
  3. 将来への備え: この変更の主な目的は、-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フラグを試すことができるようになりますが、現時点ではエラーで終了するため、実際の機能が実装されるまでは利用できません。

関連リンク

参考にした情報源リンク

  • (今回の解説は、提供されたコミット情報と、Go言語のリンカおよびビルドプロセスに関する一般的な知識に基づいて作成されました。特定の外部情報源への直接的なリンクはありません。)