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

[インデックス 18651] ファイルの概要

このコミットは、Go言語のランタイムがGoogle Native Client (NaCl) をサポートするための、広範かつ重要な変更の第2弾を導入するものです。Go 1.3リリースに向けたNative Clientサポートの統合を目的としており、特にamd64p32アーキテクチャとNaClサンドボックス環境におけるシステムコール、アセンブリルーチン、およびネットワーキング機能の実装に焦点を当てています。

コミット

commit 4a000b9d51b88346e01464f2cf8b8ab7eaa66063
Author: Russ Cox <rsc@golang.org>
Date:   Tue Feb 25 17:00:08 2014 -0500

    all: nacl import round 2
    
    These previously reviewed CLs are present in this CL.
    
    ---
    changeset:   18445:436bb084caed
    user:        Russ Cox <rsc@golang.org>
    date:        Mon Nov 11 09:50:34 2013 -0500
    description:
    runtime: assembly and system calls for Native Client x86-64
    
    See golang.org/s/go13nacl for design overview.
    
    This CL is publicly visible but not CC'ed to golang-dev,
    to avoid distracting from the preparation of the Go 1.2
    release.
    
    This CL and the others will be checked into my rsc-go13nacl
    clone repo for now, and I will send CLs against the main
    repo early in the Go 1.3 development.
    
    R≡adg
    https://golang.org/cl/15760044
    
    ---
    changeset:   18448:90bd871b5994
    user:        Russ Cox <rsc@golang.org>
    date:        Mon Nov 11 09:51:36 2013 -0500
    description:
    runtime: amd64p32 and Native Client assembly bootstrap
    
    See golang.org/s/go13nacl for design overview.
    
    This CL is publicly visible but not CC'ed to golang-dev,
    to avoid distracting from the preparation of the Go 1.2
    release.
    
    This CL and the others will be checked into my rsc-go13nacl
    clone repo for now, and I will send CLs against the main
    repo early in the Go 1.3 development.
    
    R≡khr
    https://golang.org/cl/15820043
    
    ---
    changeset:   18449:b011c3dc687e
    user:        Russ Cox <rsc@golang.org>
    date:        Mon Nov 11 09:51:58 2013 -0500
    description:
    math: amd64p32 assembly routines
    
    These routines only manipulate float64 values,
    so the amd64 and amd64p32 can share assembly.
    
    The large number of files is symptomatic of a problem
    with package path: it is a Go package structured like a C library.
    But that will need to wait for another day.
    
    See golang.org/s/go13nacl for design overview.
    
    This CL is publicly visible but not CC'ed to golang-dev,
    to avoid distracting from the preparation of the Go 1.2
    release.
    
    This CL and the others will be checked into my rsc-go13nacl
    clone repo for now, and I will send CLs against the main
    repo early in the Go 1.3 development.
    
    R≡bradfitz
    https://golang.org/cl/15870043
    
    ---
    changeset:   18450:43234f082eec
    user:        Russ Cox <rsc@golang.org>
    date:        Mon Nov 11 10:03:19 2013 -0500
    description:
    syscall: networking for Native Client
    
    See golang.org/s/go13nacl for design overview.
    
    This CL is publicly visible but not CC'ed to golang-dev,
    to avoid distracting from the preparation of the Go 1.2
    release.
    
    This CL and the others will be checked into my rsc-go13nacl
    clone repo for now, and I will send CLs against the main
    repo early in the Go 1.3 development.
    
    R≡rsc
    https://golang.org/cl/15780043
    
    ---
    changeset:   18451:9c8d1d890aaa
    user:        Russ Cox <rsc@golang.org>\n    date:        Mon Nov 11 10:03:34 2013 -0500
    description:
    runtime: assembly and system calls for Native Client x86-32
    
    See golang.org/s/go13nacl for design overview.
    
    This CL is publicly visible but not CC'ed to golang-dev,
    to avoid distracting from the preparation of the Go 1.2
    release.
    
    This CL and the others will be checked into my rsc-go13nacl
    clone repo for now, and I will send CLs against the main
    repo early in the Go 1.3 development.
    
    R≡rsc
    https://golang.org/cl/15800043
    
    ---
    changeset:   18452:f90b1dd9228f
    user:        Russ Cox <rsc@golang.org>
    date:        Mon Nov 11 11:04:09 2013 -0500
    description:
    runtime: fix frame size for linux/amd64 runtime.raise
    
    R≡rsc
    https://golang.org/cl/24480043
    
    ---
    changeset:   18455:53b06799a938
    user:        Russ Cox <rsc@golang.org>
    date:        Mon Nov 11 23:29:52 2013 -0500
    description:
    cmd/gc: add -nolocalimports flag
    
    R≡dsymonds
    https://golang.org/cl/24990043
    
    ---
    changeset:   18456:24f64e1eaa8a
    user:        Russ Cox <rsc@golang.org>
    date:        Tue Nov 12 22:06:29 2013 -0500
    description:
    runtime: add comments for playback write
    
    R≡adg
    https://golang.org/cl/25190043
    
    ---
    changeset:   18457:d1f615bbb6e4
    user:        Russ Cox <rsc@golang.org>
    date:        Wed Nov 13 17:03:52 2013 -0500
    description:
    runtime: write only to NaCl stdout, never to NaCl stderr
    
    NaCl writes some other messages on standard error
    that we would like to be able to squelch.
    
    R≡adg
    https://golang.org/cl/26240044
    
    ---
    changeset:   18458:1f01be1a1dc2
    tag:         tip
    user:        Russ Cox <rsc@golang.org>
    date:        Wed Nov 13 19:45:16 2013 -0500
    description:
    runtime: remove apparent debugging dreg
    
    Setting timens to 0 turns off fake time.
    
    TBR≡adg
    https://golang.org/cl/26400043
    
    LGTM=bradfitz
    R=dave, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/68730043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/4a000b9d51b88346e01464f2cf8b8ab7eaa66063

元コミット内容

このコミットは、複数の以前にレビューされた変更セット (CLs) をまとめたものです。主な内容は以下の通りです。

  • runtime: assembly and system calls for Native Client x86-64: Native Client (NaCl) の x86-64 アーキテクチャ向けアセンブリとシステムコールに関するランタイムの変更。
  • runtime: amd64p32 and Native Client assembly bootstrap: amd64p32 アーキテクチャとNative Client向けのアセンブリブートストラップコード。
  • math: amd64p32 assembly routines: mathパッケージのamd64p32向けアセンブリルーチン。
  • syscall: networking for Native Client: Native Client環境でのネットワーキングを可能にするためのsyscallパッケージの変更。
  • runtime: assembly and system calls for Native Client x86-32: Native Client の x86-32 アーキテクチャ向けアセンブリとシステムコールに関するランタイムの変更。
  • runtime: fix frame size for linux/amd64 runtime.raise: Linux/amd64におけるruntime.raiseのフレームサイズ修正。
  • cmd/gc: add -nolocalimports flag: コンパイラgcにローカル(相対)インポートを拒否する-nolocalimportsフラグを追加。
  • runtime: add comments for playback write: ランタイムのプレイバック書き込みに関するコメント追加。
  • runtime: write only to NaCl stdout, never to NaCl stderr: NaCl環境において、標準出力にのみ書き込み、標準エラーには書き込まないようにする変更。
  • runtime: remove apparent debugging dreg: デバッグ用の残骸と思われるコード(timensを0に設定して偽の時間を無効にする部分)の削除。

これらの変更は、Go 1.3リリースにおけるNative Clientサポートの実現に向けた重要なステップであり、特に低レベルのアセンブリコード、システムコールインターフェース、および特定のアーキテクチャ(amd64p32)への対応に重点が置かれています。

変更の背景

このコミットの背景には、Go言語をGoogle Native Client (NaCl) プラットフォームで動作させるという目標があります。NaClは、ウェブブラウザ内でネイティブコードを安全に実行するためのサンドボックス技術であり、Goプログラムがウェブアプリケーションの一部として、あるいはChromeウェブストアアプリケーションとして動作することを可能にします。

Go 1.2リリース後、GoチームはGo 1.3の主要な目標の一つとしてNaClサポートを掲げました。このコミットは、その目標達成に向けた「第2ラウンド」の変更を統合するものです。Goのような高レベル言語のランタイムをNaClのような厳格なサンドボックス環境に移植するには、以下のような多くの課題があります。

  1. システムコールインターフェースの抽象化: NaClは独自のシステムコールインターフェースを提供しており、従来のOS(Linux, Windows, macOSなど)とは異なります。Goランタイムは、これらのNaCl固有のシステムコールを呼び出すように適応する必要があります。
  2. アセンブリコードの移植: Goランタイムには、スタック管理、ゴルーチン切り替え、メモリバリアなど、低レベルの操作を行うためのアセンブリコードが多数含まれています。これらのアセンブリコードは、NaClのサンドボックス制約(例えば、直接的なメモリアクセスや特定の命令の使用制限)と、amd64p32のような特定のアーキテクチャの特性に合わせて修正または再実装する必要があります。
  3. amd64p32アーキテクチャのサポート: amd64p32は、64ビットレジスタを使用しながら32ビットポインタを使用する特殊なアーキテクチャです。これは、メモリ使用量を抑えつつ64ビットの計算能力を活用するためにNaClで採用されました。Goランタイムは、このハイブリッドなアーキテクチャに対応するための特別なアセンブリルーチンとデータ構造を必要とします。
  4. ネットワーキングのサポート: Goの標準ライブラリは強力なネットワーキング機能を提供しますが、NaCl環境ではネットワークアクセスもサンドボックス化されています。GoプログラムがNaCl内でネットワーク通信を行うためには、NaClの提供するネットワーキングAPIを介してシステムコールを実装する必要があります。
  5. コンパイラの調整: ローカル(相対)インポートの制限など、NaCl環境の制約に合わせてコンパイラの動作を調整する必要が生じる場合があります。これは、セキュリティやビルドシステムの整合性を保つためです。

このコミットは、これらの課題に対処し、GoプログラムがNaCl環境で適切に動作するための基盤を構築することを目的としています。特に、Go 1.2のリリース準備に支障をきたさないよう、Go 1.3の開発サイクル初期にメインリポジトリに統合される前に、個別の変更セットとして開発が進められていました。

前提知識の解説

このコミットを理解するためには、以下の技術的な概念について基本的な知識があると役立ちます。

  1. Google Native Client (NaCl):

    • 概要: Googleが開発した、ウェブブラウザ内でネイティブコード(C/C++など)を安全かつポータブルに実行するためのサンドボックス技術です。CPUアーキテクチャに依存しない中間表現(PNaCl)を介して、異なるプラットフォームで同じバイナリを実行できます。
    • サンドボックス: NaClは、実行されるコードがシステムリソース(ファイルシステム、ネットワークなど)に直接アクセスできないように厳重なサンドボックスを提供します。すべてのシステムアクセスは、NaClランタイムが提供する特定のシステムコールインターフェースを介して行われます。
    • amd64p32: NaClがサポートする特殊なアーキテクチャの一つです。これは、x86-64命令セットを使用しますが、ポインタは32ビット幅です。これにより、64ビットの計算能力を維持しつつ、メモリフットプリントを削減できます。Goランタイムのようなシステムプログラミング言語にとって、このポインタサイズの違いは重要な考慮事項となります。
  2. Go言語のランタイム (Runtime):

    • 概要: Goプログラムの実行を管理する低レベルのコンポーネントです。ガベージコレクション、ゴルーチン(軽量スレッド)のスケジューリング、チャネル通信、システムコールインターフェースなど、Go言語の並行性モデルとメモリ管理を支える核となる部分です。
    • アセンブリコード: Goランタイムの多くの部分はGoで書かれていますが、パフォーマンスが重要であったり、OSとの低レベルなインタラクションが必要な部分(例: コンテキストスイッチ、システムコール呼び出し、アトミック操作)では、特定のアセンブリ言語(Plan 9アセンブリ)で書かれたコードが使用されます。
    • システムコール: プログラムがOSのサービス(ファイルI/O、ネットワーク通信、メモリ管理など)を要求するためのインターフェースです。Goランタイムは、OS固有のシステムコールを抽象化し、Goプログラムがポータブルな方法でこれらのサービスを利用できるようにします。
  3. Goのビルドシステムとコンパイラ (cmd/gc):

    • gc: Go言語の公式コンパイラです。Goソースコードを機械語に変換します。
    • インポートパス: Goでは、パッケージはインポートパスによって識別されます。ローカルインポート(相対パスによるインポート)は、通常、開発中のモジュール内で使用されますが、ビルドシステムやデプロイメントの文脈では問題を引き起こす可能性があります。
  4. アトミック操作:

    • 複数のCPUコアやゴルーチンから同時にアクセスされる共有データに対して、競合状態を避けるために不可分(アトミック)に実行される操作です。通常、CPUの特殊な命令(例: CMPXCHG)やメモリバリアを使用して実装されます。

これらの概念を理解することで、GoランタイムがNaCl環境にどのように適応し、どのような技術的課題を解決しているのかを深く把握できます。

技術的詳細

このコミットは、GoランタイムのNative Client (NaCl) サポートを大幅に進めるものであり、特に以下の技術的側面に焦点を当てています。

  1. amd64p32アーキテクチャのサポート強化:

    • 背景: amd64p32は、64ビットの汎用レジスタと命令セットを持ちながら、ポインタが32ビット幅であるという特徴を持つアーキテクチャです。これは、NaCl環境でメモリ使用量を最適化しつつ、64ビットCPUの性能を活用するために採用されました。
    • 実装:
      • src/pkg/runtime/asm_amd64p32.s: Goランタイムのコアとなるアセンブリルーチン(ゴルーチン切り替え、スタック管理、アトミック操作など)がamd64p32向けに実装されています。これには、_rt0_go(プログラムのエントリポイント)、gosave/gogo(コンテキストスイッチ)、morestack/lessstack(スタック拡張/縮小)などが含まれます。32ビットポインタの制約を考慮しつつ、64ビットレジスタを効率的に利用するコードが書かれています。
      • src/pkg/math/*_amd64p32.s: mathパッケージの多くの関数(abs, asin, atan2, exp, log, sqrtなど)がamd64p32向けのアセンブリで提供されています。これらのルーチンは主にfloat64値を操作するため、既存のamd64用アセンブリを#includeすることでコードの再利用を図っています。これは、浮動小数点演算がポインタサイズに直接影響されないため可能です。
      • src/pkg/runtime/defs_nacl_amd64p32.h: NaCl環境におけるamd64p32固有のデータ構造(例: ExcRegsAmd64)や定数が定義されています。これらは、NaClのシステムコールや例外ハンドリングと連携するために必要です。
      • src/pkg/runtime/memmove_nacl_amd64p32.s: memmoveのような基本的なメモリ操作ルーチンもamd64p32向けに最適化されたアセンブリで提供されています。これは、効率的なメモリコピーがランタイム全体のパフォーマンスに大きく影響するためです。
  2. NaCl固有のシステムコールインターフェースの実装:

    • 背景: NaClは、ホストOSのシステムコールを直接呼び出すことを許可せず、独自のサンドボックス化されたシステムコールインターフェースを提供します。GoプログラムがファイルI/O、ネットワーク通信、プロセス管理などのOSサービスを利用するためには、このNaCl固有のインターフェースを介して呼び出しを行う必要があります。
    • 実装:
      • src/pkg/runtime/sys_nacl_386.s および src/pkg/runtime/sys_nacl_amd64p32.s: これらのファイルは、NaCl環境における32ビットおよびamd64p32アーキテクチャ向けのシステムコールラッパーを実装しています。NACL_SYSCALLマクロを使用して、NaClのシステムコールエントリポイント(0x10000 + ((code)<<5))を呼び出す形式が採用されています。これにより、exit, open, close, read, write, sem_create, mutex_createなどの基本的なシステムコールがGoランタイムから利用可能になります。
      • src/pkg/syscall/net_nacl.go: Goのネットワーキング機能は、syscallパッケージを介してOSのソケットAPIに依存しています。このファイルは、NaCl環境でネットワーキングをサポートするために、NaCl固有のソケット関連システムコール(socket, bind, listen, accept, connect, read, write, closeなど)をGoのsyscallパッケージに統合しています。これにより、GoプログラムはNaClサンドボックス内でネットワーク通信を行うことができるようになります。
  3. コンパイラ (cmd/gc) の調整:

    • src/cmd/gc/lex.c および src/cmd/gc/go.h: -nolocalimportsフラグが追加されました。このフラグが有効な場合、コンパイラはローカル(相対)インポートを拒否します。これは、NaClのようなサンドボックス環境や、厳格なビルドシステムにおいて、予期せぬ依存関係やセキュリティ上の問題を避けるために有用です。safemode(安全モード)と同様に、ローカルインポートを制限するメカニズムとして機能します。
  4. 標準エラー出力の制御:

    • runtime: write only to NaCl stdout, never to NaCl stderr: NaCl環境では、標準エラー出力にNaClランタイム自身がデバッグメッセージなどを出力することがあります。Goプログラムが標準エラーに書き込むと、これらのメッセージと混ざってしまい、デバッグやログ解析が困難になる可能性があります。この変更は、Goプログラムからの出力がNaClの標準出力にのみ行われるようにすることで、この問題を回避し、よりクリーンな出力環境を提供します。

これらの変更は、GoプログラムがNaClのサンドボックス内で効率的かつ安全に動作するための低レベルな基盤を構築するものであり、Go言語のポータビリティを新たなプラットフォームへと拡張する上で不可欠なステップでした。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更箇所は多岐にわたりますが、特に以下のファイル群が重要です。

  1. src/pkg/runtime/asm_amd64p32.s:

    • _rt0_go: Goプログラムの初期化と起動を行うエントリポイント。スタックの設定、TLS (Thread Local Storage) の初期化、CPU情報の取得、runtime.argsruntime.osinitruntime.schedinitの呼び出しなど、Goランタイムのブートストラップ処理が含まれます。
    • runtime.gosave, runtime.gogo: ゴルーチンのコンテキストスイッチ(レジスタ、スタックポインタ、プログラムカウンタの保存と復元)を行うアセンブリルーチン。
    • runtime.mcall: M(マシン、OSスレッド)のg0(システムゴルーチン)スタックに切り替えて関数を呼び出すルーチン。
    • runtime.morestack, runtime.newstackcall, runtime.lessstack: スタックの拡張・縮小、およびスタック切り替えに関連するルーチン。
    • runtime.cas, runtime.cas64, runtime.xadd, runtime.xchgなど: アトミック操作の低レベル実装。
    • runtime.memeq, runtime.cmpstring, bytes.IndexByte, strings.IndexByte, bytes.Equal: メモリ比較、バイト検索、文字列比較などの最適化されたアセンブリルーチン。
  2. src/pkg/runtime/sys_nacl_amd64p32.s および src/pkg/runtime/sys_nacl_386.s:

    • NACL_SYSCALL / NACL_SYSJMP マクロ: NaCl固有のシステムコール呼び出しメカニズムを定義。
    • runtime.exit, runtime.open, runtime.close, runtime.read, runtime.writeなど: NaClシステムコールを呼び出すためのラッパー関数。
  3. src/pkg/syscall/net_nacl.go:

    • socket, bind, listen, accept, connect, read, write, closeなど、ネットワーキング関連のシステムコールがNaCl固有のnacl_syscall関数を介して実装されています。これにより、GoのネットワーキングAPIがNaCl環境で機能するようになります。
  4. src/pkg/math/*_amd64p32.s (多数のファイル):

    • #include "abs_amd64.s" のように、既存のamd64用アセンブリファイルをインクルードすることで、amd64p32向けに数学関数を再利用しています。これは、浮動小数点演算がポインタサイズに依存しないため効率的です。
  5. src/cmd/gc/lex.c:

    • flagcount("nolocalimports", "reject local (relative) imports", &nolocalimports);: -nolocalimportsフラグの追加。
    • if(safemode || nolocalimports): findpkg関数内で、safemodeまたはnolocalimportsが有効な場合にローカルインポートを拒否するロジック。

これらの変更は、Goランタイムの低レベルな動作、システムとのインタラクション、およびコンパイラの挙動に直接影響を与え、GoプログラムがNaCl環境で実行されるための基盤を形成しています。

コアとなるコードの解説

src/pkg/runtime/asm_amd64p32.s の解説

このファイルは、Goランタイムのamd64p32アーキテクチャ向けアセンブリコードの大部分を含んでいます。Goランタイムは、ガベージコレクション、ゴルーチン管理、スケジューリングなど、Go言語の並行処理モデルを支える重要な機能を提供します。これらの機能の多くは、OSとの低レベルなインタラクションや、パフォーマンスが要求される部分でアセンブリコードに依存しています。

  • _rt0_go:

    • これはGoプログラムの最も初期のエントリポイントです。OSがプログラムをロードした後、最初に実行されるコードです。
    • 主な役割は、Goランタイムの初期化を行うことです。これには、スタックの設定、TLS (Thread Local Storage) の初期化(runtime.settls)、CPU情報の取得(CPUID命令)、runtime.args(コマンドライン引数の処理)、runtime.osinit(OS固有の初期化)、runtime.hashinit(ハッシュ関数の初期化)、runtime.schedinit(スケジューラの初期化)の呼び出しが含まれます。
    • 最終的に、runtime.main関数を新しいゴルーチンとして起動し、現在のM(OSスレッド)をスケジューラに引き渡してruntime.mstartを呼び出します。
  • runtime.gosaveruntime.gogo:

    • これらはゴルーチンのコンテキストスイッチの核心をなす関数です。
    • runtime.gosave(Gobuf*): 現在実行中のゴルーチンの状態(プログラムカウンタ PC、スタックポインタ SP、現在のゴルーチン g など)をGobuf構造体に保存します。これは、setjmpのような機能を提供し、後でこの状態に復帰できるようにします。
    • runtime.gogo(Gobuf*): Gobufに保存された状態を復元し、その状態から実行を再開します。これはlongjmpのような機能を提供し、別のゴルーチンに切り替える際に使用されます。
  • runtime.morestackruntime.lessstack:

    • Goのスタックは動的に伸縮します。関数呼び出し時にスタックが不足した場合、runtime.morestackが呼び出されます。
    • runtime.morestack: 現在のゴルーチンの状態を保存し、M(OSスレッド)のg0(システムゴルーチン)スタックに切り替えてruntime.newstackを呼び出します。runtime.newstackは新しいスタックセグメントを割り当て、関数呼び出しを新しいスタックで再開します。
    • runtime.lessstack: スタックが過剰に割り当てられている場合に、スタックを縮小する際に使用されます。
  • アトミック操作 (runtime.cas, runtime.xadd など):

    • runtime.cas (Compare And Swap): 指定されたメモリ位置の値が期待値と一致する場合にのみ、新しい値に更新します。これはロックフリーなデータ構造や並行処理のプリミティブを実装するために不可欠です。LOCK CMPXCHGL命令を使用しています。
    • runtime.xadd (Exchange And Add): 指定されたメモリ位置の値にデルタ値を加算し、元の値を返します。これもアトミックに行われます。LOCK XADDL命令を使用しています。
    • これらのアトミック操作は、複数のゴルーチンが共有データに安全にアクセスできるようにするために、Goランタイムの様々な場所で使用されます。

src/pkg/syscall/net_nacl.go の解説

このファイルは、Goの標準ネットワーキングライブラリがNative Client (NaCl) 環境で動作するための、NaCl固有のシステムコール実装を提供します。Goのネットワーキングは、netパッケージを介して抽象化されていますが、その下層ではsyscallパッケージを通じてOSのソケットAPIを呼び出しています。NaClは独自のサンドボックス化されたシステムコールインターフェースを持つため、これらの低レベルなソケット操作をNaCl固有のAPIにマッピングする必要があります。

  • nacl_syscall 関数:

    • このファイル内の多くの関数は、nacl_syscallというヘルパー関数を介して実際のNaClシステムコールを呼び出しています。このnacl_syscallは、GoのsyscallパッケージがNaClの低レベルなシステムコールエントリポイント(アセンブリで実装されたSYS_定数)を呼び出すためのブリッジとして機能します。
    • 例えば、socket関数はnacl_syscall(SYS_socket, domain, typ, prot)のように呼び出され、NaClのソケット作成システムコールを実行します。
  • ソケット関連のシステムコール実装:

    • socket(domain, typ, prot int) (fd int, err error): 指定されたドメイン(例: AF_INET)、タイプ(例: SOCK_STREAM)、プロトコル(例: IPPROTO_TCP)で新しいソケットを作成します。
    • bind(fd int, sa []byte) (err error): ソケットをローカルアドレスにバインドします。
    • listen(fd int, backlog int) (err error): ソケットを接続待ち状態にします。
    • accept(fd int) (nfd int, sa []byte, err error): 接続を受け入れ、新しいソケットディスクリプタを返します。
    • connect(fd int, sa []byte) (err error): 指定されたリモートアドレスに接続します。
    • read(fd int, p []byte) (n int, err error): ソケットからデータを読み込みます。
    • write(fd int, p []byte) (n int, err error): ソケットにデータを書き込みます。
    • close(fd int) (err error): ソケットを閉じます。
    • これらの関数は、Goのnetパッケージが内部的に使用するものであり、NaCl環境でGoプログラムがネットワーク通信を行うための基盤を提供します。

src/cmd/gc/lex.c の解説

このファイルはGoコンパイラgcの字句解析器(lexer)の一部であり、コマンドライン引数の処理やパッケージインポートの解決ロジックを含んでいます。

  • -nolocalimports フラグの追加:

    • flagcount("nolocalimports", "reject local (relative) imports", &nolocalimports);: main関数内で、新しいコマンドラインフラグ-nolocalimportsが定義されています。このフラグが指定されると、nolocalimportsというグローバル変数が設定されます。
    • このフラグの目的は、Goコンパイラがローカル(相対パス)によるパッケージインポートを許可するかどうかを制御することです。
  • ローカルインポートの拒否ロジック:

    • if(safemode || nolocalimports): findpkg関数内で、パッケージのインポートパスを解決する際に、インポート名がローカル名(相対パス)であるかどうかをチェックします。もしローカル名であり、かつsafemodeが有効であるか、または新しく追加されたnolocalimportsフラグが設定されている場合、インポートは拒否されます(return 0)。
    • safemode: 既存のコンパイラオプションで、セキュリティや安定性のために特定の機能を制限するモードです。-nolocalimportsは、このsafemodeと同様の目的で、特にNaClのようなサンドボックス環境や、厳格なビルドシステムにおいて、予期せぬ依存関係やセキュリティ上の問題を避けるために導入されました。

この変更により、Goコンパイラは、ビルド時にローカルインポートの使用を強制的に制限できるようになり、より制御されたビルド環境を構築することが可能になります。

関連リンク

  • Go 1.3 Release Notes (Native Client): Go 1.3のリリースノートには、Native Clientサポートに関する詳細が記載されています。
  • Go on Native Client Design Document: コミットメッセージで参照されているデザインドキュメント。
  • Google Native Client (NaCl) 公式サイト:

参考にした情報源リンク

  • golang.org/s/go13nacl: Go 1.3におけるNative Clientサポートの設計概要に関する公式ドキュメント。このコミットの背景と技術的選択を理解する上で最も重要な情報源です。
  • Go 1.3 Release Notes: Go 1.3の公式リリースノート。NaClサポートがGo 1.3の主要な新機能としてどのように位置づけられているかを確認できます。
  • Google Native Client Documentation: NaClの公式ドキュメント。NaClのサンドボックスモデル、システムコールインターフェース、amd64p32アーキテクチャなどの詳細を理解するために参照しました。
  • Go Source Code (GitHub): 実際のコード変更を詳細に分析するために、GitHub上のGoリポジトリを参照しました。