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

[インデックス 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_32sel_ldr_x86_64sel_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環境変数をスクリプトの環境にロードします。これにより、GOARCHGOOS などの値が利用可能になります。
    • export NACLENV_GOARCH=$GOARCH, export NACLENV_GOOS=$GOOS, export NACLENV_GOROOT=/go, export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;"): NaCl環境内でGoプログラムが正しく動作するために必要な環境変数を設定します。特に NACLENV_GOROOTNACLENV_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_armnacl_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_armnacl_helper_bootstrap_arm のシンボリックリンク作成手順が追加されました。
    • nacl/arm のサポートには pepper_canary SDKが必要である旨が追記されました。
    • cmd/go ヘルパースクリプトが sel_ldr_armnacl_helper_bootstrap_arm をパスから見つける必要があることが明記されました。
    • go_nacl_arm_exec スクリプトへのシンボリックリンク作成手順が追加されました。
  2. 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 architecturesGo 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_armnacl_helper_bootstrap_arm$GOPATH/bin にシンボリックリンクする手順が追加されました。これにより、GoのツールがこれらのNaClランタイムコンポーネントを自動的に見つけられるようになります。
  • 既存の go_nacl_amd64p32_execgo_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
  • 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 and nacl_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"