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

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

このコミットは、src/cmd/go/build.go ファイルに10行の追加変更を加えています。この変更は、GoコンパイラがCgoを介してC/C++コードをコンパイルする際に、GCC 4.5以降のバージョンでPthreadライブラリを正しくリンクするための-pthreadフラグを明示的に追加することを保証するものです。

コミット

commit e636f6f51c073b7539b01fc2fcc7c17e25e29294
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Thu Dec 22 23:18:34 2011 +0900

    cmd/gc: make sure use of pthread for gcc-4.5 and beyond
    
    R=golang-dev, rsc, n13m3y3r, rogpeppe
    CC=golang-dev
    https://golang.org/cl/5501060

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

https://github.com/golang/go/commit/e636f6f51c073b7539b01fc2fcc7c17e25e29294

元コミット内容

cmd/gc: make sure use of pthread for gcc-4.5 and beyond

R=golang-dev, rsc, n13m3y3r, rogpeppe
CC=golang-dev
https://golang.org/cl/5501060

変更の背景

この変更の背景には、GCC (GNU Compiler Collection) のバージョンアップに伴うリンカーの挙動の変化があります。具体的には、GCC 4.5以降のバージョンでは、Pthread (POSIX Threads) ライブラリを使用するプログラムをコンパイル・リンクする際に、以前のバージョンでは暗黙的に行われていたPthreadライブラリのリンクが、明示的に-pthreadフラグを指定しないと行われなくなったという問題がありました。

Go言語のCgo機能は、GoプログラムからC言語のコードを呼び出すことを可能にします。Cgoを使用するGoプログラムが、内部でPthreadを利用するCライブラリに依存している場合、GoのビルドプロセスがGCCを呼び出す際にこの-pthreadフラグを適切に渡さないと、リンクエラーが発生し、ビルドが失敗する可能性がありました。

このコミットは、Goのビルドツール(cmd/go)が、Cgoが有効な場合に、GCC 4.5以降のバージョンでPthreadライブラリが正しくリンクされるように、必要な-pthreadフラグを自動的に追加することを保証するために導入されました。これにより、GoユーザーがCgoとPthreadを組み合わせたコードをビルドする際の互換性の問題が解消されます。

前提知識の解説

  • GCC (GNU Compiler Collection): C、C++、Goなど、様々なプログラミング言語をコンパイルするためのフリーなコンパイラシステムです。Go言語のビルドプロセスでは、Cgoを使用する際にC/C++コードのコンパイルとリンクのためにGCCが利用されることがあります。
  • Pthread (POSIX Threads): POSIX (Portable Operating System Interface) 規格で定義されたスレッドAPIです。Unix系OS(Linux、macOSなど)でマルチスレッドプログラミングを行う際の標準的なインターフェースとして広く利用されています。Pthreadライブラリを使用するプログラムは、コンパイル時にPthreadヘッダーを含み、リンク時にPthreadライブラリ(通常は-lpthreadまたは-pthreadフラグで指定)とリンクする必要があります。
  • Cgo: Go言語の機能の一つで、GoプログラムからC言語の関数を呼び出したり、C言語のコードをGoプログラムに組み込んだりすることを可能にします。Cgoを使用すると、Goのビルドツールは内部的にCコンパイラ(通常はGCC)を呼び出してCコードをコンパイルし、Goのコードとリンクします。
  • -pthreadフラグ: GCCにおいて、Pthreadライブラリをリンクするためのコンパイラ/リンカーフラグです。このフラグは、Pthread関連のヘッダーファイルのインクルードパスを設定し、Pthreadライブラリ自体をリンクする役割を果たします。GCCのバージョンによっては、このフラグの必要性や挙動が異なることがあります。
  • go buildコマンド: Go言語のソースコードをコンパイルして実行可能ファイルを生成するためのコマンドです。このコマンドは、Goのソースコードだけでなく、Cgoを介して組み込まれたC/C++コードも処理します。

技術的詳細

このコミットは、GoのビルドツールがGCCを呼び出す際のコマンドライン引数を生成するロジックを変更しています。具体的には、src/cmd/go/build.go内のbuilder.gccCmd関数が修正されました。この関数は、Goのビルドプロセス中にCgoによってC/C++コードをコンパイルするためにGCCコマンドを構築する役割を担っています。

変更の核心は、build.DefaultContext.CgoEnabledtrue(Cgoが有効)である場合に、ターゲットOSに応じて適切なスレッド関連のリンカーフラグを追加することです。

  • Windowsの場合: -mthreadフラグが追加されます。これはMinGWなどのWindows上のGCC環境でスレッドライブラリをリンクするために使用されるフラグです。
  • それ以外のOS (Unix-likeシステム): -pthreadフラグが追加されます。これはLinuxやmacOSなどのUnix系システムでPthreadライブラリをリンクするための標準的なフラグです。

この条件分岐により、Goのビルドツールは、Cgoを使用する際に、GCC 4.5以降のバージョンでPthreadライブラリが明示的にリンクされることを保証し、クロスプラットフォームでのビルドの信頼性を向上させています。

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

diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
index b79a522dc9..62c8d90d30 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -912,6 +912,16 @@ func (b *builder) gccCmd(objdir string, flags []string, args ...string) []string
 	case "6":
 		a = append(a, "-m64")
 	}\n+\t// gcc-4.5 and beyond require explicit \"-pthread\" flag
+\t// for multithreading with pthread library.
+\tif build.DefaultContext.CgoEnabled {\n+\t\tswitch b.goos {\n+\t\tcase "windows":\n+\t\t\ta = append(a, "-mthread")\n+\t\tdefault:\n+\t\t\ta = append(a, "-pthread")\n+\t\t}\n+\t}\n \ta = append(a, flags...)\n \treturn append(a, args...)\n }\n```

## コアとなるコードの解説

変更は`func (b *builder) gccCmd(...) []string`関数内で行われています。この関数は、GCCを呼び出すためのコマンドライン引数のスライス`a`を構築しています。

追加されたコードブロックは以下の通りです。

```go
	// gcc-4.5 and beyond require explicit "-pthread" flag
	// for multithreading with pthread library.
	if build.DefaultContext.CgoEnabled {
		switch b.goos {
		case "windows":
			a = append(a, "-mthread")
		default:
			a = append(a, "-pthread")
		}
	}
  1. コメント: // gcc-4.5 and beyond require explicit "-pthread" flag for multithreading with pthread library. このコメントは、変更の理由を明確に示しています。GCC 4.5以降のバージョンでは、Pthreadライブラリを使用するマルチスレッドプログラムに対して、明示的に-pthreadフラグが必要であることを説明しています。

  2. if build.DefaultContext.CgoEnabled: この条件文は、Cgoが有効になっている場合にのみ、以下のロジックが実行されることを保証します。Cgoを使用しないGoプログラムのビルドには、Pthread関連のフラグは不要なため、無関係な変更を避けるための適切なガードです。build.DefaultContextは、現在のビルド環境に関する情報(Cgoが有効かどうかなど)を提供するGoの内部構造体です。

  3. switch b.goos: このswitch文は、ターゲットとなるオペレーティングシステム(b.goos)に基づいて、異なるリンカーフラグを選択します。

    • case "windows": ターゲットOSがWindowsの場合、a = append(a, "-mthread")が実行されます。-mthreadは、Windows環境(特にMinGWなどのGCCディストリビューション)でスレッドライブラリをリンクするために使用されるフラグです。
    • default: Windows以外のすべてのOS(Linux、macOSなど)の場合、a = append(a, "-pthread")が実行されます。-pthreadは、Unix系システムでPthreadライブラリをリンクするための標準的なフラグです。

このコードの追加により、Goのビルドツールは、Cgoを使用する際に、ターゲットOSとGCCのバージョン(特に4.5以降)を考慮して、Pthreadライブラリの適切なリンクを自動的に処理するようになります。これにより、開発者は手動でリンカーフラグを設定する必要がなくなり、ビルドの信頼性と移植性が向上します。

関連リンク

  • Go Change-Id: 5501060 - このコミットに対応するGoのコードレビューシステム(Gerrit)上の変更リスト。

参考にした情報源リンク

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

このコミットは、src/cmd/go/build.go ファイルに10行の追加変更を加えています。この変更は、GoコンパイラがCgoを介してC/C++コードをコンパイルする際に、GCC 4.5以降のバージョンでPthreadライブラリを正しくリンクするための-pthreadフラグを明示的に追加することを保証するものです。

コミット

commit e636f6f51c073b7539b01fc2fcc7c17e25e29294
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Thu Dec 22 23:18:34 2011 +0900

    cmd/gc: make sure use of pthread for gcc-4.5 and beyond
    
    R=golang-dev, rsc, n13m3y3r, rogpeppe
    CC=golang-dev
    https://golang.org/cl/5501060

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

https://github.com/golang/go/commit/e636f6f51c073b7539b01fc2fcc7c17e25e29294

元コミット内容

cmd/gc: make sure use of pthread for gcc-4.5 and beyond

R=golang-dev, rsc, n13m3y3r, rogpeppe
CC=golang-dev
https://golang.org/cl/5501060

変更の背景

この変更の背景には、GCC (GNU Compiler Collection) のバージョンアップに伴うリンカーの挙動の変化があります。具体的には、GCC 4.5以降のバージョンでは、Pthread (POSIX Threads) ライブラリを使用するプログラムをコンパイル・リンクする際に、以前のバージョンでは暗黙的に行われていたPthreadライブラリのリンクが、明示的に-pthreadフラグを指定しないと行われなくなったという問題がありました。

Go言語のCgo機能は、GoプログラムからC言語のコードを呼び出すことを可能にします。Cgoを使用するGoプログラムが、内部でPthreadを利用するCライブラリに依存している場合、GoのビルドプロセスがGCCを呼び出す際にこの-pthreadフラグを適切に渡さないと、リンクエラーが発生し、ビルドが失敗する可能性がありました。

このコミットは、Goのビルドツール(cmd/go)が、Cgoが有効な場合に、GCC 4.5以降のバージョンでPthreadライブラリが正しくリンクされるように、必要な-pthreadフラグを自動的に追加することを保証するために導入されました。これにより、GoユーザーがCgoとPthreadを組み合わせたコードをビルドする際の互換性の問題が解消されます。

前提知識の解説

  • GCC (GNU Compiler Collection): C、C++、Goなど、様々なプログラミング言語をコンパイルするためのフリーなコンパイラシステムです。Go言語のビルドプロセスでは、Cgoを使用する際にC/C++コードのコンパイルとリンクのためにGCCが利用されることがあります。
  • Pthread (POSIX Threads): POSIX (Portable Operating System Interface) 規格で定義されたスレッドAPIです。Unix系OS(Linux、macOSなど)でマルチスレッドプログラミングを行う際の標準的なインターフェースとして広く利用されています。Pthreadライブラリを使用するプログラムは、コンパイル時にPthreadヘッダーを含み、リンク時にPthreadライブラリ(通常は-lpthreadまたは-pthreadフラグで指定)とリンクする必要があります。
  • Cgo: Go言語の機能の一つで、GoプログラムからC言語の関数を呼び出したり、C言語のコードをGoプログラムに組み込んだりすることを可能にします。Cgoを使用すると、Goのビルドツールは内部的にCコンパイラ(通常はGCC)を呼び出してCコードをコンパイルし、Goのコードとリンクします。
  • -pthreadフラグ: GCCにおいて、Pthreadライブラリをリンクするためのコンパイラ/リンカーフラグです。このフラグは、Pthread関連のヘッダーファイルのインクルードパスを設定し、Pthreadライブラリ自体をリンクする役割を果たします。GCCのバージョンによっては、このフラグの必要性や挙動が異なることがあります。
  • go buildコマンド: Go言語のソースコードをコンパイルして実行可能ファイルを生成するためのコマンドです。このコマンドは、Goのソースコードだけでなく、Cgoを介して組み込まれたC/C++コードも処理します。

技術的詳細

このコミットは、GoのビルドツールがGCCを呼び出す際のコマンドライン引数を生成するロジックを変更しています。具体的には、src/cmd/go/build.go内のbuilder.gccCmd関数が修正されました。この関数は、Goのビルドプロセス中にCgoによってC/C++コードをコンパイルするためにGCCコマンドを構築する役割を担っています。

変更の核心は、build.DefaultContext.CgoEnabledtrue(Cgoが有効)である場合に、ターゲットOSに応じて適切なスレッド関連のリンカーフラグを追加することです。

  • Windowsの場合: -mthreadフラグが追加されます。これはMinGWなどのWindows上のGCC環境でスレッドライブラリをリンクするために使用されるフラグです。
  • それ以外のOS (Unix-likeシステム): -pthreadフラグが追加されます。これはLinuxやmacOSなどのUnix系システムでPthreadライブラリをリンクするための標準的なフラグです。

この条件分岐により、Goのビルドツールは、Cgoを使用する際に、GCC 4.5以降のバージョンでPthreadライブラリが明示的にリンクされることを保証し、クロスプラットフォームでのビルドの信頼性を向上させています。

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

diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
index b79a522dc9..62c8d90d30 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -912,6 +912,16 @@ func (b *builder) gccCmd(objdir string, flags []string, args ...string) []string
 	case "6":
 		a = append(a, "-m64")
 	}\n+\t// gcc-4.5 and beyond require explicit \"-pthread\" flag
+\t// for multithreading with pthread library.
+\tif build.DefaultContext.CgoEnabled {\n+\t\tswitch b.goos {\n+\t\tcase "windows":\n+\t\t\ta = append(a, "-mthread")\n+\t\tdefault:\n+\t\t\ta = append(a, "-pthread")\n+\t\t}\n+\t}\n \ta = append(a, flags...)\n \treturn append(a, args...)\n }\n```

## コアとなるコードの解説

変更は`func (b *builder) gccCmd(...) []string`関数内で行われています。この関数は、GCCを呼び出すためのコマンドライン引数のスライス`a`を構築しています。

追加されたコードブロックは以下の通りです。

```go
	// gcc-4.5 and beyond require explicit "-pthread" flag
	// for multithreading with pthread library.
	if build.DefaultContext.CgoEnabled {
		switch b.goos {
		case "windows":
			a = append(a, "-mthread")
		default:
			a = append(a, "-pthread")
		}
	}
  1. コメント: // gcc-4.5 and beyond require explicit "-pthread" flag for multithreading with pthread library. このコメントは、変更の理由を明確に示しています。GCC 4.5以降のバージョンでは、Pthreadライブラリを使用するマルチスレッドプログラムに対して、明示的に-pthreadフラグが必要であることを説明しています。

  2. if build.DefaultContext.CgoEnabled: この条件文は、Cgoが有効になっている場合にのみ、以下のロジックが実行されることを保証します。Cgoを使用しないGoプログラムのビルドには、Pthread関連のフラグは不要なため、無関係な変更を避けるための適切なガードです。build.DefaultContextは、現在のビルド環境に関する情報(Cgoが有効かどうかなど)を提供するGoの内部構造体です。

  3. switch b.goos: このswitch文は、ターゲットとなるオペレーティングシステム(b.goos)に基づいて、異なるリンカーフラグを選択します。

    • case "windows": ターゲットOSがWindowsの場合、a = append(a, "-mthread")が実行されます。-mthreadは、Windows環境(特にMinGWなどのGCCディストリビューション)でスレッドライブラリをリンクするために使用されるフラグです。
    • default: Windows以外のすべてのOS(Linux、macOSなど)の場合、a = append(a, "-pthread")が実行されます。-pthreadは、Unix系システムでPthreadライブラリをリンクするための標準的なフラグです。

このコードの追加により、Goのビルドツールは、Cgoを使用する際に、ターゲットOSとGCCのバージョン(特に4.5以降)を考慮して、Pthreadライブラリの適切なリンクを自動的に処理するようになります。これにより、開発者は手動でリンカーフラグを設定する必要がなくなり、ビルドの信頼性と移植性が向上します。

関連リンク

  • Go Change-Id: 5501060 - このコミットに対応するGoのコードレビューシステム(Gerrit)上の変更リスト。

参考にした情報源リンク