[インデックス 19716] ファイルの概要
このコミットは、Go言語プロジェクトのsrc/nacltest.bashスクリプトに対する変更です。nacltest.bashは、Google Native Client (NaCl) 環境でGoプログラムのテストを実行するためのシェルスクリプトです。このスクリプトは、特定のアーキテクチャ(例: amd64p32)向けにコンパイルされたGoバイナリをNaClのセキュアな実行環境でロードし、テストを実行する役割を担っています。
コミット
- コミットハッシュ:
99e2a5678601b7452172283d02f5da5cacad6fa2 - 作者: Shenghou Ma minux@golang.org
- 日付: 2014年7月10日 木曜日 15:15:41 -0400
- 件名:
nacltest.bash: nacl/arm support. Also detect GOARCH automatically based onuname -m.
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/99e2a5678601b7452172283d02f5da5cacad6fa2
元コミット内容
nacltest.bash: nacl/arm support.
Also detect GOARCH automatically based on `uname -m`.
LGTM=crawshaw, dave, rsc
R=rsc, iant, crawshaw, dave
CC=golang-codereviews
https://golang.org/cl/111780043
変更の背景
このコミットが行われた背景には、主に以下の2つの目的があります。
-
Native ClientにおけるARMアーキテクチャのサポート: Google Native Client (NaCl) は、当初x86系のアーキテクチャ(32ビットおよび64ビット)を主なターゲットとしていましたが、モバイルデバイスの普及に伴い、ARMアーキテクチャへの対応が求められるようになりました。Go言語がNaCl環境でより広範なプラットフォームをサポートするためには、ARM向けのテスト環境を整備する必要がありました。この変更は、GoのテストスイートがNaClのARMターゲットで適切に動作することを確認するための基盤となります。
-
GOARCH環境変数の自動検出: Goのビルドシステムでは、ターゲットとするCPUアーキテクチャをGOARCH環境変数で指定します。しかし、開発者が手動でGOARCHを設定するのは手間がかかる場合があります。特に、異なるアーキテクチャのマシンでテストを実行する際に、その都度GOARCHを設定し直すのは非効率です。このコミットでは、uname -mコマンドの出力に基づいてGOARCHを自動的に推測する機能を追加することで、テストスクリプトの使いやすさと移植性を向上させています。これにより、ユーザーは明示的にGOARCHを設定しなくても、スクリプトが実行されているシステムのアーキテクチャに適したNaClテストが実行されるようになります。
これらの変更は、Go言語のNaClサポートをより堅牢で使いやすいものにし、開発者が多様な環境でGoアプリケーションをNaCl向けに開発・テストする際の障壁を低減することを目的としています。
前提知識の解説
Go言語 (Golang)
Goは、Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型、並行処理に強い特徴を持ち、シンプルさと効率性を重視しています。システムプログラミング、Webサービス、ネットワークツールなど、幅広い分野で利用されています。
Google Native Client (NaCl) および Portable Native Client (PNaCl)
Google Native Client (NaCl) は、Webブラウザ内でネイティブコード(C/C++など)をセキュアに実行するための技術です。これにより、WebアプリケーションはCPUの性能を最大限に活用できるようになります。NaClはサンドボックス化された環境でコードを実行するため、セキュリティが確保されます。
Portable Native Client (PNaCl) はNaClの進化版で、特定のCPUアーキテクチャに依存しない中間表現(LLVM IRに似た形式)を使用します。これにより、開発者は一度コンパイルすれば、PNaClをサポートする任意のアーキテクチャ(x86、ARMなど)で実行可能なモジュールを作成できます。実行時には、PNaClモジュールがターゲットアーキテクチャのネイティブコードにJITコンパイルされます。このコミットの時点では、NaClとPNaClは密接に関連しており、Go言語のNaClサポートはPNaClの基盤の上に構築されていました。
GOARCH 環境変数
GOARCHはGo言語のビルドシステムで使用される環境変数で、Goプログラムをコンパイルする際のターゲットCPUアーキテクチャを指定します。例えば、amd64は64ビットIntel/AMDプロセッサ、386は32ビットIntel/AMDプロセッサ、armはARMプロセッサを指します。Goのクロスコンパイル機能において非常に重要な役割を果たします。
uname -m コマンド
unameコマンドは、システムの情報を表示するUnix系OSのコマンドです。-mオプションは、システムのハードウェア(マシン)アーキテクチャを表示します。例えば、x86_64システムではx86_64、ARMシステムではarmv7lやaarch64といった出力が得られます。このコマンドは、スクリプトが実行されている環境のCPUアーキテクチャをプログラム的に判別するために広く利用されます。
sel_ldr (Secure Loader)
sel_ldrは、Native Clientのランタイム環境における「セキュアローダー」です。NaClモジュール(.nexeファイル)をロードし、サンドボックス内で実行するためのプロセスを管理します。sel_ldrは、モジュールが安全なコード規約に従っているか検証し、不正なメモリアクセスやシステムコールを防ぐためのセキュリティチェックを行います。アーキテクチャごとに異なるsel_ldrバイナリが存在し、例えばx86-64向けにはsel_ldr_x86_64、ARM向けにはsel_ldr_armが存在します。
nacltest.bash スクリプト
Go言語のソースツリー内にあるsrc/nacltest.bashは、GoのテストスイートをNative Client環境で実行するためのシェルスクリプトです。このスクリプトは、GoのテストバイナリをNaClモジュールとしてコンパイルし、適切なsel_ldrを使用して実行し、テスト結果を検証する一連のプロセスを自動化します。Goの継続的インテグレーション(CI)システムの一部として、NaCl環境でのGoの動作保証に貢献しています。
技術的詳細
このコミットの技術的な核心は、nacltest.bashスクリプトが、実行環境のCPUアーキテクチャを自動的に判別し、それに基づいてGoのターゲットアーキテクチャ(GOARCH)を設定するロジックを追加した点、およびNaClのARMサポートをテストフローに組み込んだ点にあります。
-
GOARCHの自動検出ロジック: スクリプトはまず、naclGOARCHという内部変数に既存のGOARCH環境変数の値を代入します。もしGOARCHが設定されていない場合(空文字列の場合)、uname -mコマンドの出力を評価するcase文を使用してnaclGOARCHを推測します。x86_64の場合:amd64p32に設定されます。amd64p32は、64ビットのx86アーキテクチャ上で32ビットポインタを使用するNaClの特殊なターゲットアーキテクチャです。これは、NaClが当初32ビットポインタを前提としていたため、64ビットシステムでも互換性を保つために導入されました。armv7lの場合:armに設定されます。これは、ARMv7Aアーキテクチャ(ARMv7-Aプロファイル)を指し、NaClがARMをサポートする際の主要なターゲットです。i?86(例:i386,i686など)の場合:386に設定されます。これは32ビットのx86アーキテクチャを指します。
この自動検出により、スクリプトは実行環境に最適な
GOARCHを自動的に選択し、ユーザーが手動で設定する手間を省きます。 -
ARMアーキテクチャのテストサポート: スクリプトの後半部分では、設定された
naclGOARCHの値に基づいて、適切なsel_ldrバイナリが存在するかどうかを確認します。amd64p32の場合:sel_ldr_x86_64の存在を確認します。386の場合:sel_ldr_x86_32の存在を確認します。armの場合: 新たにsel_ldr_armの存在を確認するロジックが追加されました。これは、ARMアーキテクチャ向けのNaClテストを実行するために、対応するセキュアローダーがシステムにインストールされていることを保証するためのものです。もしsel_ldr_armが見つからない場合、スクリプトはエラーメッセージを出力して終了します。
これらの変更により、nacltest.bashはよりインテリジェントになり、ARMを含む複数のアーキテクチャでGoのNaClテストをシームレスに実行できるようになりました。
コアとなるコードの変更箇所
src/nacltest.bashファイルにおける変更の差分は以下の通りです。
--- a/src/nacltest.bash
+++ b/src/nacltest.bash
@@ -13,8 +13,23 @@
set -e
ulimit -c 0
+# guess GOARCH if not set
+naclGOARCH=$GOARCH
+if [ -z "$naclGOARCH" ]; then
+ case "$(uname -m)" in
+ x86_64)
+ naclGOARCH=amd64p32
+ ;;
+ armv7l) # NativeClient on ARM only supports ARMv7A.
+ naclGOARCH=arm
+ ;;
+ i?86)
+ naclGOARCH=386
+ ;;
+ esac
+fi
+
# Check GOARCH.
-naclGOARCH=${GOARCH:-386}
case "$naclGOARCH" in
amd64p32)
if ! which sel_ldr_x86_64 >/dev/null; then
@@ -28,6 +43,12 @@ amd64p32)
exit 1
fi
;;
+arm)
+ if ! which sel_ldr_arm >/dev/null; then
+ echo 'cannot find sel_ldr_arm' 1>&2
+ exit 1
+ fi
+ ;;
*)
echo 'unsupported $GOARCH for nacl: '"$naclGOARCH" 1>&2
exit 1
コアとなるコードの解説
GOARCH 自動検出ブロックの追加
+# guess GOARCH if not set
+naclGOARCH=$GOARCH
+if [ -z "$naclGOARCH" ]; then
+ case "$(uname -m)" in
+ x86_64)
+ naclGOARCH=amd64p32
+ ;;
+ armv7l) # NativeClient on ARM only supports ARMv7A.
+ naclGOARCH=arm
+ ;;
+ i?86)
+ naclGOARCH=386
+ ;;
+ esac
+fi
この新しいコードブロックは、スクリプトの冒頭に追加されました。
naclGOARCH=$GOARCH: 既存のGOARCH環境変数の値をnaclGOARCH変数にコピーします。if [ -z "$naclGOARCH" ]; then:naclGOARCHが空文字列(つまり、GOARCHが設定されていない)であるかどうかをチェックします。case "$(uname -m)" in ... esac:GOARCHが設定されていない場合、uname -mコマンドの出力を評価します。x86_64): システムが64ビットx86アーキテクチャの場合、naclGOARCHをamd64p32に設定します。これは、NaClの64ビットx86ターゲットで32ビットポインタを使用するGoのアーキテクチャ名です。armv7l): システムがARMv7Aアーキテクチャの場合、naclGOARCHをarmに設定します。コメントにあるように、Native ClientのARMサポートはARMv7Aに限定されています。i?86): システムが32ビットx86アーキテクチャ(例:i386,i686)の場合、naclGOARCHを386に設定します。
この変更により、スクリプトは実行環境のアーキテクチャを自動的に判別し、適切なGOARCH値を設定できるようになり、ユーザーの手動設定の手間を省きます。
naclGOARCH チェックの変更と arm ケースの追加
-naclGOARCH=${GOARCH:-386}
case "$naclGOARCH" in
amd64p32)
if ! which sel_ldr_x86_64 >/dev/null; then
@@ -28,6 +43,12 @@ amd64p32)
exit 1
fi
;;
+arm)
+ if ! which sel_ldr_arm >/dev/null; then
+ echo 'cannot find sel_ldr_arm' 1>&2
+ exit 1
+ fi
+ ;;
*)
echo 'unsupported $GOARCH for nacl: '"$naclGOARCH" 1>&2
exit 1
-
-naclGOARCH=${GOARCH:-386}の削除: 以前は、GOARCHが設定されていない場合にデフォルトで386を使用するという単純なフォールバックロジックがありました。これは、上記の新しい自動検出ブロックによって置き換えられ、よりインテリジェントなアーキテクチャ判別が可能になりました。 -
arm)ケースの追加:arm):naclGOARCHがarmである場合に実行される新しいケースです。if ! which sel_ldr_arm >/dev/null; then:whichコマンドを使用して、システムパスにsel_ldr_armという実行可能ファイルが存在するかどうかをチェックします。>/dev/nullは標準出力を破棄し、!はコマンドの成功(見つかった場合)を反転させて、見つからなかった場合に真となります。echo 'cannot find sel_ldr_arm' 1>&2:sel_ldr_armが見つからない場合、エラーメッセージを標準エラー出力(1>&2)に表示します。exit 1: エラーが発生したため、スクリプトを終了します。
この変更により、nacltest.bashはARMアーキテクチャ向けのNaClテストを実行する前に、必要なsel_ldr_armバイナリが利用可能であることを確認するようになりました。これにより、テスト環境のセットアップが不完全な場合に早期にエラーを検出し、より堅牢なテストプロセスを実現します。
関連リンク
- Go言語公式サイト: https://go.dev/
- Go言語のドキュメント: https://go.dev/doc/
- Google Native Client (Wikipedia): https://en.wikipedia.org/wiki/Google_Native_Client
- Portable Native Client (PNaCl) (Wikipedia): https://en.wikipedia.org/wiki/Portable_Native_Client
unameコマンド (Wikipedia): https://ja.wikipedia.org/wiki/Uname
参考にした情報源リンク
今回の解説は、提供されたコミット情報とGo言語およびNative Clientに関する一般的な知識に基づいて作成されました。特定の外部Webページを直接参照して情報を取得したわけではありません。