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

[インデックス 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つの目的があります。

  1. Native ClientにおけるARMアーキテクチャのサポート: Google Native Client (NaCl) は、当初x86系のアーキテクチャ(32ビットおよび64ビット)を主なターゲットとしていましたが、モバイルデバイスの普及に伴い、ARMアーキテクチャへの対応が求められるようになりました。Go言語がNaCl環境でより広範なプラットフォームをサポートするためには、ARM向けのテスト環境を整備する必要がありました。この変更は、GoのテストスイートがNaClのARMターゲットで適切に動作することを確認するための基盤となります。

  2. 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システムではarmv7laarch64といった出力が得られます。このコマンドは、スクリプトが実行されている環境の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サポートをテストフローに組み込んだ点にあります。

  1. 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を自動的に選択し、ユーザーが手動で設定する手間を省きます。

  2. 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

この新しいコードブロックは、スクリプトの冒頭に追加されました。

  1. naclGOARCH=$GOARCH: 既存のGOARCH環境変数の値をnaclGOARCH変数にコピーします。
  2. if [ -z "$naclGOARCH" ]; then: naclGOARCHが空文字列(つまり、GOARCHが設定されていない)であるかどうかをチェックします。
  3. case "$(uname -m)" in ... esac: GOARCHが設定されていない場合、uname -mコマンドの出力を評価します。
    • x86_64): システムが64ビットx86アーキテクチャの場合、naclGOARCHamd64p32に設定します。これは、NaClの64ビットx86ターゲットで32ビットポインタを使用するGoのアーキテクチャ名です。
    • armv7l): システムがARMv7Aアーキテクチャの場合、naclGOARCHarmに設定します。コメントにあるように、Native ClientのARMサポートはARMv7Aに限定されています。
    • i?86): システムが32ビットx86アーキテクチャ(例: i386, i686)の場合、naclGOARCH386に設定します。

この変更により、スクリプトは実行環境のアーキテクチャを自動的に判別し、適切な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
  1. -naclGOARCH=${GOARCH:-386}の削除: 以前は、GOARCHが設定されていない場合にデフォルトで386を使用するという単純なフォールバックロジックがありました。これは、上記の新しい自動検出ブロックによって置き換えられ、よりインテリジェントなアーキテクチャ判別が可能になりました。

  2. arm)ケースの追加:

    • arm): naclGOARCHarmである場合に実行される新しいケースです。
    • 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言語およびNative Clientに関する一般的な知識に基づいて作成されました。特定の外部Webページを直接参照して情報を取得したわけではありません。