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

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

このコミットは、Go言語のソースコードにおけるinclude/plan9/libc.hファイルに対する修正です。具体的には、Plan 9オペレーティングシステム上でのGoのビルドプロセスを修正するために、不足していたgetgoextlinkenabled(void)関数の宣言を追加しています。この関数は、以前の変更(CL #8183043として参照されている)の一部として導入されたものですが、Plan 9向けのlibc.hにはその宣言が含まれていなかったため、ビルドエラーが発生する可能性がありました。このコミットは、その宣言を追加することで、Plan 9環境でのGoのビルドが正しく行われるようにします。

コミット

commit ad95b7d23cf776022b0fafebb707d2948cdb80f4
Author: David du Colombier <0intro@gmail.com>
Date:   Sat Mar 30 19:05:00 2013 +0800

    include/plan9/libc.h: fix Plan 9 build
    
    Add missing getgoextlinkenabled(void) declaration
    in Plan 9 libc.h. This function was added as part
    of CL #8183043.
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/8191043
---\n include/plan9/libc.h | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/include/plan9/libc.h b/include/plan9/libc.h
index e6f9839c8e..dcecc7c8b8 100644
--- a/include/plan9/libc.h
+++ b/include/plan9/libc.h
@@ -18,6 +18,7 @@ char*\tgetgoroot(void);\n char*\tgetgoversion(void);\n char*\tgetgoarm(void);\n char*\tgetgo386(void);\n+char*\tgetgoextlinkenabled(void);\n \n void\tflagcount(char*, char*, int*);\n void\tflagint32(char*, char*, int32*);\

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

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

元コミット内容

include/plan9/libc.h: fix Plan 9 build

Add missing getgoextlinkenabled(void) declaration
in Plan 9 libc.h. This function was added as part
of CL #8183043.

R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/8191043

変更の背景

このコミットの背景には、Go言語のビルドシステムと、特定のオペレーティングシステム(この場合はPlan 9)向けのコンパイルに関する問題があります。

Go言語のソースコードには、様々なプラットフォーム(Linux、Windows、macOS、BSD、そしてPlan 9など)に対応するためのプラットフォーム固有のコードやヘッダーファイルが含まれています。include/plan9/libc.hは、Plan 9環境でGoをビルドする際に使用されるC言語の標準ライブラリ関数やGoランタイムとの連携に必要な宣言を含むヘッダーファイルです。

コミットメッセージによると、getgoextlinkenabled(void)という新しい関数が、以前の変更(CL #8183043)の一部としてGoのランタイムに追加されました。CLは「Change List」の略で、Goプロジェクトではコードレビューシステム(Gerrit)における変更の単位を指します。しかし、この新しい関数が追加されたにもかかわらず、Plan 9向けのlibc.hファイルにはその関数の宣言が追加されていませんでした。

C言語では、関数を使用する前にそのプロトタイプ(宣言)が利用可能である必要があります。宣言がないまま関数を呼び出そうとすると、コンパイラは「未定義の参照」や「暗黙の宣言」に関する警告またはエラーを生成し、最終的にリンクエラーを引き起こす可能性があります。この場合、Plan 9環境でGoをビルドしようとすると、getgoextlinkenabled関数の宣言が見つからないためにビルドが失敗していたと考えられます。

このコミットは、その宣言をinclude/plan9/libc.hに追加することで、Plan 9上でのGoのビルドプロセスが中断なく完了するようにするための修正です。

前提知識の解説

Plan 9

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの設計思想をさらに推し進め、すべてのリソース(ファイル、デバイス、ネットワーク接続など)をファイルとして表現し、それらをファイルシステムを通じてアクセスするという徹底したアプローチを採用しています。Go言語の開発者の一部はPlan 9の開発にも携わっており、Go言語の設計思想にはPlan 9の影響が見られます。Goのツールチェインや一部のランタイムコードは、Plan 9の慣習や設計パターンを反映していることがあります。

libc.h

libc.hは、C言語の標準ライブラリ(libc)のヘッダーファイルの一つ、またはそれに類するファイル名です。通常、C言語のプログラムが標準ライブラリ関数(例: printf, mallocなど)を使用する際に、これらの関数のプロトタイプ宣言や関連するマクロ、型定義などが含まれています。オペレーティングシステムによっては、システムコールやOS固有の機能へのインターフェースを提供する独自のlibc.hや類似のヘッダーファイルが存在します。Go言語のランタイムはC言語で書かれた部分も多く、OS固有の機能にアクセスするために、このようなヘッダーファイルを利用することがあります。

Goのビルドプロセスとクロスコンパイル

Go言語は、強力なクロスコンパイル機能を内蔵しています。これは、あるオペレーティングシステム(例: Linux)上で、別のオペレーティングシステム(例: WindowsやPlan 9)向けの実行ファイルを生成できることを意味します。このクロスコンパイルを可能にするために、GoのツールチェインはターゲットOSやアーキテクチャに応じた様々なランタイムコードやヘッダーファイル(今回問題となったinclude/plan9/libc.hのようなファイル)を管理しています。ビルド時には、ターゲット環境に合わせた適切なファイルが選択され、コンパイル・リンクされます。

GoにおけるCL (Change List)

Goプロジェクトでは、コードの変更は「Change List (CL)」という単位で管理されます。これは、Googleが内部で使用しているバージョン管理システム(Perforceなど)に由来する概念で、一連の関連する変更をまとめたものです。Goプロジェクトでは、Gerritというコードレビューシステムが使用されており、各CLはGerrit上でレビューされ、承認されるとメインのコードベースにマージされます。コミットメッセージに記載されているCL #8183043https://golang.org/cl/8191043は、それぞれ特定の変更セットを識別するための番号と、その変更セットのGerrit上のURLを指します。

技術的詳細

このコミットで追加されたgetgoextlinkenabled(void)関数は、Goランタイムの一部として、外部リンキング(external linking)が有効になっているかどうかを問い合わせるための関数であると推測されます。

Go言語のビルドプロセスには、内部リンキング(internal linking)と外部リンキング(external linking)の2つの主要なリンキングモードがあります。

  • 内部リンキング: Goコンパイラとリンカが、Goのランタイムとユーザーコードをすべて単一の静的バイナリにリンクします。これはGoのデフォルトの動作であり、生成されるバイナリは自己完結型で、ターゲットシステムにGoのランタイムライブラリがインストールされている必要がありません。
  • 外部リンキング: Goコンパイラが生成したオブジェクトファイルを、システムのCリンカ(例: gccclang)を使用してリンクします。これは、Cgo(GoからCのコードを呼び出す機能)を使用する場合や、特定のシステムライブラリに依存する場合に必要となることがあります。外部リンキングを使用すると、生成されるバイナリはシステムのCライブラリ(libcなど)に動的にリンクされることがあります。

getgoextlinkenabledという名前から、この関数はGoのビルド時に外部リンキングが有効にされているかどうかをGoランタイムが判断するために使用されるものと考えられます。例えば、特定のランタイム動作が外部リンキングの有無に依存する場合、この関数を呼び出してその状態を確認することができます。

Plan 9環境でGoをビルドする際、この関数がGoランタイムのどこかで呼び出されるにもかかわらず、include/plan9/libc.hにその宣言がなかったため、コンパイラは関数の存在を知ることができず、ビルドエラーが発生していました。この修正は、その宣言を追加することで、コンパイラがこの関数を正しく認識し、ビルドプロセスを続行できるようにします。

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

--- a/include/plan9/libc.h
+++ b/include/plan9/libc.h
@@ -18,6 +18,7 @@ char*\tgetgoroot(void);\n char*\tgetgoversion(void);\n char*\tgetgoarm(void);\n char*\tgetgo386(void);\n+char*\tgetgoextlinkenabled(void);\n \n void\tflagcount(char*, char*, int*);\n void\tflagint32(char*, char*, int32*);\

コアとなるコードの解説

変更はinclude/plan9/libc.hファイルに1行追加されただけです。

char*\tgetgoextlinkenabled(void);

この行は、getgoextlinkenabledという名前の関数のプロトタイプ宣言です。

  • char*: この関数がchar型へのポインタ(つまり文字列)を返すことを示しています。これは、Goのランタイムが外部リンキングの状態を文字列(例えば、"true"や"false"、あるいはバージョン情報など)として返すことを示唆しています。
  • getgoextlinkenabled: 関数の名前です。Goの外部リンキングが有効であるかどうかを取得する(get)ための関数であることを示しています。
  • (void): この関数が引数を取らないことを示しています。
  • ;: 宣言の終わりを示します。

この宣言がlibc.hに追加されることで、Plan 9環境でGoのコードがコンパイルされる際に、getgoextlinkenabled関数が呼び出されてもコンパイラがその存在とシグネチャ(引数と戻り値の型)を認識できるようになります。これにより、ビルド時の「未定義の参照」エラーが解消され、Plan 9上でのGoのビルドが成功するようになります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント(一般的なGoのビルドプロセス、クロスコンパイル、Cgoに関する情報)
  • Plan 9 from Bell Labsに関する一般的な情報
  • C言語のヘッダーファイルと関数宣言に関する一般的な知識
  • CL #8183043については、Goプロジェクトの公開されているコードレビューシステムや一般的なWeb検索では詳細な情報を見つけることができませんでした。GoのCL番号は通常、より短い桁数であるため、この番号が内部的な参照であるか、あるいはタイプミスである可能性も考えられます。