[インデックス 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 on
uname -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ページを直接参照して情報を取得したわけではありません。