[インデックス 19715] ファイルの概要
このコミットは、Go言語のNative Client (NaCl) 環境において、ARMアーキテクチャ (nacl/arm
) のサポートを追加するものです。具体的には、ARM環境でGoプログラムを実行するためのヘルパースクリプト go_nacl_arm_exec
を新規に導入し、関連する README
ファイルを更新して、新しいアーキテクチャのサポートと環境設定手順を反映しています。これにより、Go 1.3が386、amd64p32に加えてARMアーキテクチャでもNaCl上で動作するようになります。
コミット
commit 0829533b6e480d8abdcefe58b25bb07e98b825c4
Author: Shenghou Ma <minux@golang.org>
Date: Thu Jul 10 15:15:32 2014 -0400
misc/nacl: add go_nacl_arm_exec, update README
LGTM=dave, rsc
R=rsc, iant, dave
CC=golang-codereviews
https://golang.org/cl/109390043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0829533b6e480d8abdcefe58b25bb07e98b825c4
元コミット内容
misc/nacl: add go_nacl_arm_exec, update README
LGTM=dave, rsc
R=rsc, iant, dave
CC=golang-codereviews
https://golang.org/cl/109390043
変更の背景
この変更の背景には、Google Native Client (NaCl) が提供するサンドボックス環境で、より多様なアーキテクチャ、特にARMプロセッサ上でのGoプログラムの実行を可能にするという目的があります。Go 1.3のリリースに向けて、NaCl環境でのGoのサポートを拡大する一環として、ARMアーキテクチャへの対応が求められました。
NaClは、ウェブブラウザ内でネイティブコードを安全に実行するための技術であり、クロスプラットフォームなアプリケーション開発を可能にします。Go言語がNaClをサポートすることで、Goで書かれた高性能なアプリケーションをウェブ環境で利用できるようになります。当初、Go 1.3はNaCl上で386とamd64p32アーキテクチャをサポートしていましたが、モバイルデバイスや組み込みシステムで広く利用されているARMアーキテクチャへの対応は、Goの利用範囲を広げる上で重要でした。
このコミットは、Go 1.3のリリースノートにも記載されている「Go 1.3はNative ClientのARMアーキテクチャをサポートする」という目標を達成するための一歩です。go_nacl_arm_exec
スクリプトの追加と README
の更新は、開発者がARMベースのNaCl環境でGoプログラムをビルドし、実行するための具体的な手順とツールを提供することを目的としています。
前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
- Go言語 (Golang): Googleによって開発されたオープンソースのプログラミング言語。並行処理、ガベージコレクション、高速なコンパイルが特徴です。
- Google Native Client (NaCl): Googleが開発した技術で、ウェブブラウザ内でネイティブコード(C/C++など)を安全に実行するためのサンドボックス環境を提供します。これにより、ウェブアプリケーションで高性能な処理が可能になります。NaClは、コードの安全性を確保するために、厳格なサンドボックス化と検証プロセスを適用します。
- Portable Native Client (PNaCl): NaClの進化版で、アーキテクチャに依存しない中間表現 (bitcode) を使用します。これにより、一度コンパイルすれば、様々なCPUアーキテクチャ(x86、ARMなど)で実行可能になります。このコミットの時点では、Go 1.3はPNaClではなく、特定のアーキテクチャ向けのNaClバイナリを生成していました。
sel_ldr
(Secure Loader): Native Clientのランタイムローダーです。NaClモジュール(コンパイルされたネイティブコード)をロードし、サンドボックス内で実行します。sel_ldr_x86_32
、sel_ldr_x86_64
、sel_ldr_arm
など、アーキテクチャごとに異なるバイナリが存在します。nacl_helper_bootstrap_arm
: ARMアーキテクチャ向けのNaClヘルパーブートストラップです。NaCl環境でGoプログラムを起動する際に、sel_ldr_arm
と連携して初期化処理や環境設定を行う役割を担います。go env
: Goコマンドの一つで、Goの環境変数(GOROOT
,GOPATH
,GOARCH
,GOOS
など)を表示します。これらの環境変数は、Goのビルドシステムやツールが正しく動作するために重要です。$GOPATH
と$GOROOT
:$GOROOT
: Goのインストールディレクトリを指します。Goの標準ライブラリやツールがここにあります。$GOPATH
: Goのワークスペースディレクトリを指します。ユーザーのGoプロジェクトのソースコード、コンパイル済みバイナリ、パッケージなどがここに配置されます。
- シンボリックリンク (Symbolic Link): ファイルやディレクトリへの参照(ショートカットのようなもの)です。このコミットでは、NaCl SDKのツールを
$GOPATH/bin
にシンボリックリンクすることで、Goのツールがそれらをパスから見つけられるようにしています。
技術的詳細
このコミットの技術的詳細は、GoプログラムをNaClのARM環境で実行可能にするための環境設定と実行フローに焦点を当てています。
-
nacl/arm
アーキテクチャの導入: Go 1.3は、既存のnacl/386
(標準386) およびnacl/amd64p32
(64ビットアーキテクチャで4GBアドレス空間に制限) に加えて、nacl/arm
(32ビットARMv7Aアーキテクチャで1GBアドレス空間) をサポート対象に追加しました。これにより、GoコンパイラはARMベースのNaClターゲット向けにバイナリを生成できるようになります。 -
go_nacl_arm_exec
スクリプトの役割: このコミットで新規に追加されたmisc/nacl/go_nacl_arm_exec
は、GoプログラムをNaClのARM環境で実行するためのシェルスクリプトです。Goのcmd/go
ツールは、特定のアーキテクチャ向けのGoプログラムを実行する際に、対応するgo_nacl_ARCH_exec
スクリプトを呼び出すように設計されています。 このスクリプトの主な機能は以下の通りです。eval $(go env)
: 現在のGo環境変数をスクリプトの環境にロードします。これにより、GOARCH
やGOOS
などの値が利用可能になります。export NACLENV_GOARCH=$GOARCH
,export NACLENV_GOOS=$GOOS
,export NACLENV_GOROOT=/go
,export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")
: NaCl環境内でGoプログラムが正しく動作するために必要な環境変数を設定します。特にNACLENV_GOROOT
とNACLENV_NACLPWD
は、NaClサンドボックス内の仮想ファイルシステムパスに合わせて調整されています。exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"
: これが実行の中核です。nacl_helper_bootstrap_arm
: ARM向けのNaClブートストラップヘルパーを呼び出します。$(which sel_ldr_arm)
: システムのパスからsel_ldr_arm
のフルパスを見つけて引数として渡します。sel_ldr_arm
は、実際のNaClモジュール(Goプログラムのバイナリ)をロードして実行するセキュアローダーです。--reserved_at_zero=0xXXXXXXXXXXXXXXXX
: これはNaClのメモリレイアウトに関するオプションで、特定のメモリアドレスを予約します。XXXXXXXXXXXXXXXX
はプレースホルダーであり、実際の値はNaClランタイムによって決定されます。-l /dev/null
: ロギング出力を/dev/null
にリダイレクトします。-S
: サンドボックスを有効にします。-e "$@"
: 実行するGoプログラムのパスと、それに渡されるコマンドライン引数を指定します。
-
README
の更新:misc/nacl/README
ファイルは、Go 1.3がサポートするアーキテクチャのリストを更新し、nacl/arm
を追加しました。また、開発者がARM環境でGoプログラムをビルド・実行するために必要なsel_ldr_arm
とnacl_helper_bootstrap_arm
のシンボリックリンク作成手順が追記されました。特に、nacl/arm
のサポートには、当時の安定版SDK (pepper_33
) ではなく、より新しいpepper_canary
SDKが必要であるという重要な情報が明記されています。これは、新しいアーキテクチャサポートが開発の初期段階にあったことを示唆しています。
この変更により、Go開発者はARMベースのデバイス(例えばChromebookや特定の組み込みシステム)上でNaClを利用してGoアプリケーションをデプロイできるようになり、Goのクロスプラットフォーム性がさらに向上しました。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は以下の2ファイルです。
-
misc/nacl/README
:- Go 1.3がサポートするNaClアーキテクチャのリストに
nacl/arm
が追加されました。 sel_ldr_arm
とnacl_helper_bootstrap_arm
のシンボリックリンク作成手順が追加されました。nacl/arm
のサポートにはpepper_canary
SDKが必要である旨が追記されました。cmd/go
ヘルパースクリプトがsel_ldr_arm
とnacl_helper_bootstrap_arm
をパスから見つける必要があることが明記されました。go_nacl_arm_exec
スクリプトへのシンボリックリンク作成手順が追加されました。
- Go 1.3がサポートするNaClアーキテクチャのリストに
-
misc/nacl/go_nacl_arm_exec
(新規ファイル): このファイルは、GoプログラムをNaClのARM環境で実行するためのシェルスクリプトです。#!/bin/bash eval $(go env) export NACLENV_GOARCH=$GOARCH export NACLENV_GOOS=$GOOS export NACLENV_GOROOT=/go export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;") exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"
コアとなるコードの解説
misc/nacl/README
の変更点
README
の変更は、主に情報提供と手順の更新です。
Go 1.3 supports two architectures
がGo 1.3 supports three architectures
に変更され、* nacl/arm which is 32-bit ARMv7A architecture with 1GB address space.
が追加されました。これは、Go 1.3がNaCl上でARMを正式にサポートすることを示す重要な変更です。At this time pepper_33 is the stable version.
の後に、As of June 2014, only the canary sdk provides support for nacl/arm.
が追記されました。これは、ARMサポートが比較的新しく、安定版SDKでは利用できない可能性があることを開発者に警告しています。sel_ldr_x86_{32,64}
に加えて、sel_ldr_arm
とnacl_helper_bootstrap_arm
を$GOPATH/bin
にシンボリックリンクする手順が追加されました。これにより、GoのツールがこれらのNaClランタイムコンポーネントを自動的に見つけられるようになります。- 既存の
go_nacl_amd64p32_exec
とgo_nacl_386_exec
に加えて、go_nacl_arm_exec
を$GOPATH/bin
にシンボリックリンクする手順が追加されました。これは、GoのビルドシステムがARMターゲット向けにコンパイルされたGoプログラムを実行する際に、この新しいスクリプトを呼び出すことを可能にします。
misc/nacl/go_nacl_arm_exec
の新規追加
このシェルスクリプトは、GoプログラムをNaClのARM環境で実行するためのエントリポイントとして機能します。
#!/bin/bash
: スクリプトがbashで実行されることを指定します。eval $(go env)
:go env
コマンドの出力を評価し、GOARCH
(ターゲットアーキテクチャ) やGOOS
(ターゲットOS) などのGo環境変数を現在のシェルセッションに設定します。これにより、スクリプト内でこれらの変数を利用できます。export NACLENV_GOARCH=$GOARCH
export NACLENV_GOOS=$GOOS
export NACLENV_GOROOT=/go
export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")
: これらのexport
コマンドは、NaClサンドボックス内でGoプログラムが動作するために必要な環境変数を設定します。NaCl環境は独自のファイルシステムビューを持つため、GOROOT
や現在の作業ディレクトリ (pwd
) のパスをNaClサンドボックス内の仮想パス (/go
など) にマッピングする必要があります。sed
コマンドは、ホストのGOROOT
パスをNaClサンドボックス内の/go
に置換しています。exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"
: この行がGoプログラムの実際の実行を開始します。exec
: 現在のシェルプロセスをnacl_helper_bootstrap_arm
プロセスに置き換えます。これにより、シェルスクリプトが終了する際に、子プロセスが孤立することなく、直接nacl_helper_bootstrap_arm
が実行されます。nacl_helper_bootstrap_arm
: ARMアーキテクチャ向けのNaClブートストラップヘルパーです。これは、Goプログラムの実行に必要な初期設定(例えば、Goランタイムの初期化)を行います。$(which sel_ldr_arm)
:sel_ldr_arm
は、NaClモジュール(Goプログラムのコンパイル済みバイナリ)をロードして実行するセキュアローダーです。which
コマンドは、sel_ldr_arm
の実行可能ファイルのフルパスを検索し、そのパスをnacl_helper_bootstrap_arm
の引数として渡します。--reserved_at_zero=0xXXXXXXXXXXXXXXXX
: NaClランタイムのメモリレイアウトに関するオプションです。特定のメモリアドレス範囲を予約します。-l /dev/null
:sel_ldr
のログ出力を/dev/null
にリダイレクトし、標準出力や標準エラー出力をクリーンに保ちます。-S
: サンドボックスを有効にするフラグです。NaClのセキュリティモデルの根幹をなすものです。-e "$@"
: 実行するGoプログラムのパスと、go_nacl_arm_exec
スクリプトに渡されたすべてのコマンドライン引数 ($@
) をsel_ldr_arm
に渡します。これにより、Goプログラムが実行され、その引数を受け取ることができます。
このスクリプトは、GoのビルドシステムとNaClランタイムの間を橋渡しし、GoプログラムがARMベースのNaClサンドボックス内で安全かつ正しく実行されるようにするための重要な役割を担っています。
関連リンク
- Go 1.3 Release Notes: https://go.dev/doc/go1.3 (特に "Native Client" セクション)
- Native Client (Wikipedia): https://en.wikipedia.org/wiki/Google_Native_Client
- Portable Native Client (PNaCl): https://developer.chrome.com/docs/native-client/pnacl/
参考にした情報源リンク
- Go 1.3 Release Notes: https://go.dev/doc/go1.3
- Native Client Documentation (archived): https://developer.chrome.com/docs/native-client/ (当時の情報源として参照)
- Go source code on GitHub: https://github.com/golang/go
- Stack Overflow and other technical forums for understanding
sel_ldr
andnacl_helper_bootstrap
usage. go env
documentation: https://go.dev/cmd/go/#hdr-Print_Go_environment_information- Shell scripting basics (e.g.,
eval
,exec
,$(which)
,sed
). https://golang.org/s/go13nacl
(READMEに記載されているリンク。現在はリダイレクトされるが、当時の背景理解に役立つ)https://golang.org/cl/109390043
(Gerritの変更リスト。コミットメッセージに記載されている)- Google検索キーワード: "Go Native Client ARM support", "Go 1.3 NaCl", "nacl_helper_bootstrap_arm", "sel_ldr_arm", "Go NaCl environment variables"
# [インデックス 19715] ファイルの概要
このコミットは、Go言語のNative Client (NaCl) 環境において、ARMアーキテクチャ (`nacl/arm`) のサポートを追加するものです。具体的には、ARM環境でGoプログラムを実行するためのヘルパースクリプト `go_nacl_arm_exec` を新規に導入し、関連する `README` ファイルを更新して、新しいアーキテクチャのサポートと環境設定手順を反映しています。これにより、Go 1.3が386、amd64p32に加えてARMアーキテクチャでもNaCl上で動作するようになります。
## コミット
commit 0829533b6e480d8abdcefe58b25bb07e98b825c4 Author: Shenghou Ma minux@golang.org Date: Thu Jul 10 15:15:32 2014 -0400
misc/nacl: add go_nacl_arm_exec, update README
LGTM=dave, rsc
R=rsc, iant, dave
CC=golang-codereviews
https://golang.org/cl/109390043
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/0829533b6e480d8abdcefe58b25bb07e98b825c4](https://github.com/golang/go/commit/0829533b6e480d8abdcefe58b25bb07e98b825c4)
## 元コミット内容
misc/nacl: add go_nacl_arm_exec, update README
LGTM=dave, rsc R=rsc, iant, dave CC=golang-codereviews https://golang.org/cl/109390043
## 変更の背景
この変更の背景には、Google Native Client (NaCl) が提供するサンドボックス環境で、より多様なアーキテクチャ、特にARMプロセッサ上でのGoプログラムの実行を可能にするという目的があります。Go 1.3のリリースに向けて、NaCl環境でのGoのサポートを拡大する一環として、ARMアーキテクチャへの対応が求められました。
NaClは、ウェブブラウザ内でネイティブコードを安全に実行するための技術であり、クロスプラットフォームなアプリケーション開発を可能にします。Go言語がNaClをサポートすることで、Goで書かれた高性能なアプリケーションをウェブ環境で利用できるようになります。当初、Go 1.3はNaCl上で386とamd64p32アーキテクチャをサポートしていましたが、モバイルデバイスや組み込みシステムで広く利用されているARMアーキテクチャへの対応は、Goの利用範囲を広げる上で重要でした。
このコミットは、Go 1.3のリリースノートにも記載されている「Go 1.3はNative ClientのARMアーキテクチャをサポートする」という目標を達成するための一歩です。`go_nacl_arm_exec` スクリプトの追加と `README` の更新は、開発者がARMベースのNaCl環境でGoプログラムをビルドし、実行するための具体的な手順とツールを提供することを目的としています。
## 前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
* **Go言語 (Golang)**: Googleによって開発されたオープンソースのプログラミング言語。並行処理、ガベージコレクション、高速なコンパイルが特徴です。
* **Google Native Client (NaCl)**: Googleが開発した技術で、ウェブブラウザ内でネイティブコード(C/C++など)を安全に実行するためのサンドボックス環境を提供します。これにより、ウェブアプリケーションで高性能な処理が可能になります。NaClは、コードの安全性を確保するために、厳格なサンドボックス化と検証プロセスを適用します。
* **Portable Native Client (PNaCl)**: NaClの進化版で、アーキテクチャに依存しない中間表現 (bitcode) を使用します。これにより、一度コンパイルすれば、様々なCPUアーキテクチャ(x86、ARMなど)で実行可能になります。このコミットの時点では、Go 1.3はPNaClではなく、特定のアーキテクチャ向けのNaClバイナリを生成していました。
* **`sel_ldr` (Secure Loader)**: Native Clientのランタイムローダーです。NaClモジュール(コンパイルされたネイティブコード)をロードし、サンドボックス内で実行します。`sel_ldr_x86_32`、`sel_ldr_x86_64`、`sel_ldr_arm` など、アーキテクチャごとに異なるバイナリが存在します。
* **`nacl_helper_bootstrap_arm`**: ARMアーキテクチャ向けのNaClヘルパーブートストラップです。NaCl環境でGoプログラムを起動する際に、`sel_ldr_arm` と連携して初期化処理や環境設定を行う役割を担います。
* **`go env`**: Goコマンドの一つで、Goの環境変数(`GOROOT`, `GOPATH`, `GOARCH`, `GOOS` など)を表示します。これらの環境変数は、Goのビルドシステムやツールが正しく動作するために重要です。
* **`$GOPATH` と `$GOROOT`**:
* `$GOROOT`: Goのインストールディレクトリを指します。Goの標準ライブラリやツールがここにあります。
* `$GOPATH`: Goのワークスペースディレクトリを指します。ユーザーのGoプロジェクトのソースコード、コンパイル済みバイナリ、パッケージなどがここに配置されます。
* **シンボリックリンク (Symbolic Link)**: ファイルやディレクトリへの参照(ショートカットのようなもの)です。このコミットでは、NaCl SDKのツールを `$GOPATH/bin` にシンボリックリンクすることで、Goのツールがそれらをパスから見つけられるようにしています。
## 技術的詳細
このコミットの技術的詳細は、GoプログラムをNaClのARM環境で実行可能にするための環境設定と実行フローに焦点を当てています。
1. **`nacl/arm` アーキテクチャの導入**:
Go 1.3は、既存の `nacl/386` (標準386) および `nacl/amd64p32` (64ビットアーキテクチャで4GBアドレス空間に制限) に加えて、`nacl/arm` (32ビットARMv7Aアーキテクチャで1GBアドレス空間) をサポート対象に追加しました。これにより、GoコンパイラはARMベースのNaClターゲット向けにバイナリを生成できるようになります。
2. **`go_nacl_arm_exec` スクリプトの役割**:
このコミットで新規に追加された `misc/nacl/go_nacl_arm_exec` は、GoプログラムをNaClのARM環境で実行するためのシェルスクリプトです。Goの `cmd/go` ツールは、特定のアーキテクチャ向けのGoプログラムを実行する際に、対応する `go_nacl_ARCH_exec` スクリプトを呼び出すように設計されています。
このスクリプトの主な機能は以下の通りです。
* `eval $(go env)`: 現在のGo環境変数をスクリプトの環境にロードします。これにより、`GOARCH` や `GOOS` などの値が利用可能になります。
* `export NACLENV_GOARCH=$GOARCH`, `export NACLENV_GOOS=$GOOS`, `export NACLENV_GOROOT=/go`, `export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")`: NaCl環境内でGoプログラムが正しく動作するために必要な環境変数を設定します。特に `NACLENV_GOROOT` と `NACLENV_NACLPWD` は、NaClサンドボックス内の仮想ファイルシステムパスに合わせて調整されています。
* `exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"`: これが実行の中核です。
* `nacl_helper_bootstrap_arm`: ARM向けのNaClブートストラップヘルパーを呼び出します。
* `$(which sel_ldr_arm)`: システムのパスから `sel_ldr_arm` のフルパスを見つけて引数として渡します。`sel_ldr_arm` は、実際のNaClモジュール(Goプログラムのバイナリ)をロードして実行するセキュアローダーです。
* `--reserved_at_zero=0xXXXXXXXXXXXXXXXX`: これはNaClのメモリレイアウトに関するオプションで、特定のメモリアドレスを予約します。`XXXXXXXXXXXXXXXX` はプレースホルダーであり、実際の値はNaClランタイムによって決定されます。
* `-l /dev/null`: ロギング出力を `/dev/null` にリダイレクトします。
* `-S`: サンドボックスを有効にします。
* `-e "$@"`: 実行するGoプログラムのパスと、それに渡されるコマンドライン引数を指定します。
3. **`README` の更新**:
`misc/nacl/README` ファイルは、Go 1.3がサポートするアーキテクチャのリストを更新し、`nacl/arm` を追加しました。また、開発者がARM環境でGoプログラムをビルド・実行するために必要な `sel_ldr_arm` と `nacl_helper_bootstrap_arm` のシンボリックリンク作成手順が追記されました。特に、`nacl/arm` のサポートには、当時の安定版SDK (`pepper_33`) ではなく、より新しい `pepper_canary` SDKが必要であるという重要な情報が明記されています。これは、新しいアーキテクチャサポートが開発の初期段階にあったことを示唆しています。
この変更により、Go開発者はARMベースのデバイス(例えばChromebookや特定の組み込みシステム)上でNaClを利用してGoアプリケーションをデプロイできるようになり、Goのクロスプラットフォーム性がさらに向上しました。
## コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は以下の2ファイルです。
1. **`misc/nacl/README`**:
* Go 1.3がサポートするNaClアーキテクチャのリストに `nacl/arm` が追加されました。
* `sel_ldr_arm` と `nacl_helper_bootstrap_arm` のシンボリックリンク作成手順が追加されました。
* `nacl/arm` のサポートには `pepper_canary` SDKが必要である旨が追記されました。
* `cmd/go` ヘルパースクリプトが `sel_ldr_arm` と `nacl_helper_bootstrap_arm` をパスから見つける必要があることが明記されました。
* `go_nacl_arm_exec` スクリプトへのシンボリックリンク作成手順が追加されました。
2. **`misc/nacl/go_nacl_arm_exec` (新規ファイル)**:
このファイルは、GoプログラムをNaClのARM環境で実行するためのシェルスクリプトです。
```bash
#!/bin/bash
eval $(go env)
export NACLENV_GOARCH=$GOARCH
export NACLENV_GOOS=$GOOS
export NACLENV_GOROOT=/go
export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")
exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"
```
## コアとなるコードの解説
### `misc/nacl/README` の変更点
`README` の変更は、主に情報提供と手順の更新です。
* `Go 1.3 supports two architectures` が `Go 1.3 supports three architectures` に変更され、`* nacl/arm which is 32-bit ARMv7A architecture with 1GB address space.` が追加されました。これは、Go 1.3がNaCl上でARMを正式にサポートすることを示す重要な変更です。
* `At this time pepper_33 is the stable version.` の後に、`As of June 2014, only the canary sdk provides support for nacl/arm.` が追記されました。これは、ARMサポートが比較的新しく、安定版SDKでは利用できない可能性があることを開発者に警告しています。
* `sel_ldr_x86_{32,64}` に加えて、`sel_ldr_arm` と `nacl_helper_bootstrap_arm` を `$GOPATH/bin` にシンボリックリンクする手順が追加されました。これにより、GoのツールがこれらのNaClランタイムコンポーネントを自動的に見つけられるようになります。
* 既存の `go_nacl_amd64p32_exec` と `go_nacl_386_exec` に加えて、`go_nacl_arm_exec` を `$GOPATH/bin` にシンボリックリンクする手順が追加されました。これは、GoのビルドシステムがARMターゲット向けにコンパイルされたGoプログラムを実行する際に、この新しいスクリプトを呼び出すことを可能にします。
### `misc/nacl/go_nacl_arm_exec` の新規追加
このシェルスクリプトは、GoプログラムをNaClのARM環境で実行するためのエントリポイントとして機能します。
1. `#!/bin/bash`: スクリプトがbashで実行されることを指定します。
2. `eval $(go env)`: `go env` コマンドの出力を評価し、`GOARCH` (ターゲットアーキテクチャ) や `GOOS` (ターゲットOS) などのGo環境変数を現在のシェルセッションに設定します。これにより、スクリプト内でこれらの変数を利用できます。
3. `export NACLENV_GOARCH=$GOARCH`
4. `export NACLENV_GOOS=$GOOS`
5. `export NACLENV_GOROOT=/go`
6. `export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;")`:
これらの `export` コマンドは、NaClサンドボックス内でGoプログラムが動作するために必要な環境変数を設定します。NaCl環境は独自のファイルシステムビューを持つため、`GOROOT` や現在の作業ディレクトリ (`pwd`) のパスをNaClサンドボックス内の仮想パス (`/go` など) にマッピングする必要があります。`sed` コマンドは、ホストの `GOROOT` パスをNaClサンドボックス内の `/go` に置換しています。
7. `exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@"`:
この行がGoプログラムの実際の実行を開始します。
* `exec`: 現在のシェルプロセスを `nacl_helper_bootstrap_arm` プロセスに置き換えます。これにより、シェルスクリプトが終了する際に、子プロセスが孤立することなく、直接 `nacl_helper_bootstrap_arm` が実行されます。
* `nacl_helper_bootstrap_arm`: ARMアーキテクチャ向けのNaClブートストラップヘルパーです。これは、Goプログラムの実行に必要な初期設定(例えば、Goランタイムの初期化)を行います。
* `$(which sel_ldr_arm)`: `sel_ldr_arm` は、NaClモジュール(Goプログラムのコンパイル済みバイナリ)をロードして実行するセキュアローダーです。`which` コマンドは、`sel_ldr_arm` の実行可能ファイルのフルパスを検索し、そのパスを `nacl_helper_bootstrap_arm` の引数として渡します。
* `--reserved_at_zero=0xXXXXXXXXXXXXXXXX`: NaClランタイムのメモリレイアウトに関するオプションです。特定のメモリアドレス範囲を予約します。
* `-l /dev/null`: `sel_ldr` のログ出力を `/dev/null` にリダイレクトし、標準出力や標準エラー出力をクリーンに保ちます。
* `-S`: サンドボックスを有効にするフラグです。NaClのセキュリティモデルの根幹をなすものです。
* `-e "$@"`: 実行するGoプログラムのパスと、`go_nacl_arm_exec` スクリプトに渡されたすべてのコマンドライン引数 (`$@`) を `sel_ldr_arm` に渡します。これにより、Goプログラムが実行され、その引数を受け取ることができます。
このスクリプトは、GoのビルドシステムとNaClランタイムの間を橋渡しし、GoプログラムがARMベースのNaClサンドボックス内で安全かつ正しく実行されるようにするための重要な役割を担っています。
## 関連リンク
* Go 1.3 Release Notes: [https://go.dev/doc/go1.3](https://go.dev/doc/go1.3) (特に "Native Client" セクション)
* Native Client (Wikipedia): [https://en.wikipedia.org/wiki/Google_Native_Client](https://en.wikipedia.org/wiki/Google_Native_Client)
* Portable Native Client (PNaCl): [https://developer.chrome.com/docs/native-client/pnacl/](https://developer.chrome.com/docs/native-client/pnacl/)
## 参考にした情報源リンク
* Go 1.3 Release Notes: [https://go.dev/doc/go1.3](https://go.dev/doc/go1.3)
* Native Client Documentation (archived): [https://developer.chrome.com/docs/native-client/](https://developer.chrome.com/docs/native-client/) (当時の情報源として参照)
* Go source code on GitHub: [https://github.com/golang/go](https://github.com/golang/go)
* Stack Overflow and other technical forums for understanding `sel_ldr` and `nacl_helper_bootstrap` usage.
* `go env` documentation: [https://go.dev/cmd/go/#hdr-Print_Go_environment_information](https://go.dev/cmd/go/#hdr-Print_Go_environment_information)
* Shell scripting basics (e.g., `eval`, `exec`, `$(which)`, `sed`).
* `https://golang.org/s/go13nacl` (READMEに記載されているリンク。現在はリダイレクトされるが、当時の背景理解に役立つ)
* `https://golang.org/cl/109390043` (Gerritの変更リスト。コミットメッセージに記載されている)
* Google検索キーワード: "Go Native Client ARM support", "Go 1.3 NaCl", "nacl_helper_bootstrap_arm", "sel_ldr_arm", "Go NaCl environment variables"