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

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

このコミットは、Go言語プロジェクトのincludeディレクトリにar.hという新しいヘッダーファイルを追加するものです。このファイルは、アーカイブファイル(特にUnix系のarコマンドで作成される静的ライブラリファイル)の構造を定義するもので、6lリンカとのソースレベルでの互換性を確保することを目的としています。

コミット

commit dbf1da6b376831a4b73695a3e993da21da38fa76
Author: Rob Pike <r@golang.org>
Date:   Thu Jun 12 13:46:23 2008 -0700

    adding ar.h for source-level compatibility in 6l.
    binary compatibility is ok
    
    SVN=122489

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

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

元コミット内容

ar.h6lにおけるソースレベルの互換性のために追加。バイナリ互換性は問題ない。

変更の背景

このコミットは、Go言語の初期開発段階におけるツールチェインの構築に関連しています。特に、6lというリンカが、アーカイブファイル(.aファイル、静的ライブラリ)のヘッダー情報を正しく解釈するためにar.hが必要とされたことが背景にあります。

Go言語のツールチェインは、Plan 9というオペレーティングシステムの設計思想や既存のツールを多く取り入れています。6lリンカもその一つで、Plan 9のリンカの設計をベースにしています。Plan 9のツールチェインでは、アーカイブファイルのフォーマットが特定の構造を持っており、その構造をC言語のヘッダーファイルとして定義することで、ツール間での互換性を保っていました。

このコミットの目的は、Goのツールチェインが既存のPlan 9ベースのツール(この場合は6l)と連携する際に、ソースコードレベルでの互換性を確保することです。ar.hは、アーカイブファイルのヘッダー構造を定義することで、6lがアーカイブファイルを正しく読み込み、リンク処理を行うための基盤を提供します。コミットメッセージにある「binary compatibility is ok」は、既存のバイナリ形式のアーカイブファイル自体は変更する必要がなく、ソースコード側でその構造を認識するための定義を追加するだけで良い、ということを示唆しています。

前提知識の解説

  • アーカイブファイル (.aファイル): Unix系システムで静的ライブラリを格納するために使用されるファイル形式です。複数のオブジェクトファイル(.oファイル)を一つにまとめたもので、リンカがプログラムをビルドする際に参照します。ar(archiver)コマンドによって作成・管理されます。
  • arコマンド: Unix系システムでアーカイブファイルを作成、変更、展開するためのユーティリティです。
  • リンカ (6l): コンパイラによって生成されたオブジェクトファイルやライブラリファイルを結合し、実行可能なプログラムを生成するツールです。Go言語の初期のリンカは、ターゲットアーキテクチャに応じて8l(x86)、6l(amd64)、5l(ARM)などの名前が付けられていました。このコミットでは6lが言及されているため、amd64アーキテクチャ向けのリンカを指しています。
  • Plan 9: ベル研究所で開発された分散オペレーティングシステムです。Go言語の設計思想やツールチェインには、Plan 9の影響が強く見られます。特に、シンプルさ、モジュール性、ファイルシステム中心のアプローチなどが共通しています。
  • Inferno OS: Plan 9の思想を受け継いで開発された分散オペレーティングシステムです。このar.hファイルのコメントに// Inferno utils/include/ar.hとあることから、Inferno OSのユーティリティからこの定義が取り込まれたことがわかります。これは、Go言語の初期ツールチェインが既存のPlan 9/Infernoのコードベースを再利用・適応していたことを示しています。
  • ソースレベル互換性 vs. バイナリ互換性:
    • ソースレベル互換性: ソースコードが変更なしにコンパイルできることを指します。この場合、ar.hの定義が6lのソースコードが期待するアーカイブファイルの構造と一致していることを意味します。
    • バイナリ互換性: コンパイル済みのバイナリファイルが、新しいバージョンや異なる環境でも問題なく動作することを指します。このコミットでは、既存のアーカイブファイルのバイナリ形式自体は変更する必要がないことを示しています。

技術的詳細

追加されたar.hファイルは、アーカイブファイルのヘッダー構造をC言語のstructで定義しています。これは、リンカがアーカイブファイルの内容を解析するために必要なメタデータを提供します。

具体的には、以下のマクロと構造体が定義されています。

  • ARMAG: アーカイブファイルの先頭に置かれるマジック文字列 "!<arch>\\n" を定義します。これにより、ファイルがアーカイブファイルであることを識別できます。
  • SARMAG: ARMAGの長さ(8バイト)を定義します。
  • ARFMAG: アーカイブメンバーのヘッダーの最後に置かれるマジック文字列 `\\n` を定義します。
  • SARNAME: アーカイブメンバーの名前フィールドの長さ(16バイト)を定義します。
  • struct ar_hdr: 各アーカイブメンバーのヘッダー情報を格納する構造体です。
    • name[SARNAME]: メンバーの名前。
    • date[12]: メンバーの最終変更日時(UnixタイムスタンプのASCII表現)。
    • uid[6]: ユーザーID(ASCII表現)。
    • gid[6]: グループID(ASCII表現)。
    • mode[8]: ファイルモード(パーミッション、ASCII表現)。
    • size[10]: メンバーのサイズ(バイト単位、ASCII表現)。
    • fmag[2]: ARFMAGと同じマジック文字列。
  • SAR_HDR: ar_hdr構造体の全体のサイズ(SARNAME + 44バイト)を定義します。

これらの定義は、標準的なUnix arフォーマット(特にBSDやSystem Vのバリアント)に準拠しており、リンカがアーカイブファイル内の個々のオブジェクトファイルを見つけ、そのメタデータ(名前、サイズ、パーミッションなど)を読み取るために使用されます。

このヘッダーファイルがGoのツールチェインに追加されたことで、6lリンカは、この定義を利用してアーカイブファイルを正しく解析し、リンク処理を進めることができるようになります。これにより、Goのプログラムが既存のC言語の静的ライブラリとリンクしたり、Goのコンパイラが生成したオブジェクトファイルをアーカイブにまとめたりする際に、互換性が保たれることになります。

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

include/ar.hという新しいファイルが追加されました。

diff --git a/include/ar.h b/include/ar.h
new file mode 100644
index 0000000000..529055d141
--- /dev/null
+++ b/include/ar.h
@@ -0,0 +1,47 @@
+// Inferno utils/include/ar.h
+// http://code.google.com/p/inferno-os/source/browse/utils/include/ar.h
+//
+//
+//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
+//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
+//	Portions Copyright © 1997-1999 Vita Nuova Limited
+//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
+//	Portions Copyright © 2004,2006 Bruce Ellis
+//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
+//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
+//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#define	ARMAG	"!<arch>\\n"
+#define	SARMAG	8
+
+#define	ARFMAG	"`\\n"
+#define SARNAME	16
+
+struct	ar_hdr
+{
+	char	name[SARNAME];
+	char	date[12];
+	char	uid[6];
+	char	gid[6];
+	char	mode[8];
+	char	size[10];
+	char	fmag[2];
+};
+#define	SAR_HDR	(SARNAME+44)

コアとなるコードの解説

追加されたar.hファイルは、アーカイブファイル(.aファイル)の構造をC言語で定義しています。これは、Go言語のリンカである6lが、アーカイブファイルを正しく解析し、その中に含まれるオブジェクトファイルにアクセスするために不可欠な定義です。

ファイルの内容は以下の要素で構成されています。

  1. 著作権表示とライセンス情報:

    • Inferno OSのutils/include/ar.hから派生したものであることが明記されています。これは、Go言語の初期ツールチェインがPlan 9/Infernoの既存のコードベースを積極的に利用していたことを示しています。
    • Lucent Technologies Inc., Vita Nuova Limited, Vita Nuova Holdings Limited, Bruce Ellis, C H Forsyth, およびThe Go Authorsによる著作権表示が含まれています。
    • MITライセンスに似た、寛容なオープンソースライセンスが適用されています。これにより、このコードをGoプロジェクトに組み込むことが許可されています。
  2. マクロ定義:

    • ARMAG: アーカイブファイルの先頭に現れるマジック文字列 "!<arch>\\n" を定義します。これは、ファイルが有効なアーカイブファイルであるかどうかを識別するために使用されます。
    • SARMAG: ARMAGの長さ(8バイト)を定義します。
    • ARFMAG: 各アーカイブメンバーのヘッダーの最後に現れるマジック文字列 `\\n` を定義します。
    • SARNAME: アーカイブメンバーの名前フィールドの長さ(16バイト)を定義します。
  3. struct ar_hdr構造体:

    • これは、アーカイブファイル内の各メンバー(通常はオブジェクトファイル)のメタデータを記述するヘッダー構造体です。
    • name[SARNAME]: アーカイブメンバーの名前を格納します。通常はファイル名です。
    • date[12]: メンバーの最終変更日時をASCII形式の10進数で格納します。これはUnixタイムスタンプです。
    • uid[6]: メンバーの所有者のユーザーIDをASCII形式で格納します。
    • gid[6]: メンバーの所有者のグループIDをASCII形式で格納します。
    • mode[8]: メンバーのファイルモード(パーミッション)を8進数のASCII形式で格納します。
    • size[10]: メンバーのデータ部分のサイズをバイト単位でASCII形式の10進数で格納します。
    • fmag[2]: ARFMAGと同じマジック文字列を格納します。これは、ヘッダーの整合性をチェックするために使用されます。
  4. SAR_HDRマクロ:

    • ar_hdr構造体の全体のサイズをバイト単位で定義します。これは、アーカイブファイルをパースする際に、次のメンバーのヘッダーやデータ部分のオフセットを計算するために使用されます。

このar.hの追加により、6lリンカは、これらの定義を利用してアーカイブファイルのバイナリ構造を理解し、必要なオブジェクトファイルを抽出してリンク処理を行うことができるようになります。これは、Go言語が既存のシステムツールやライブラリと連携するための重要なステップでした。

関連リンク

参考にした情報源リンク

  • コミットメッセージと差分情報
  • Go言語の公式ドキュメントおよびブログ
  • Plan 9およびInferno OSに関する公開情報
  • Unix arコマンドのファイルフォーマットに関する一般的な情報
  • 6lリンカに関する情報 (Go言語の初期のリンカ)
  • Inferno utils/include/ar.hのソースコード (Google Code Archive経由で参照可能)# [インデックス 162] ファイルの概要

このコミットは、Go言語プロジェクトのincludeディレクトリにar.hという新しいヘッダーファイルを追加するものです。このファイルは、アーカイブファイル(特にUnix系のarコマンドで作成される静的ライブラリファイル)の構造を定義するもので、6lリンカとのソースレベルでの互換性を確保することを目的としています。

コミット

commit dbf1da6b376831a4b73695a3e993da21da38fa76
Author: Rob Pike <r@golang.org>
Date:   Thu Jun 12 13:46:23 2008 -0700

    adding ar.h for source-level compatibility in 6l.
    binary compatibility is ok
    
    SVN=122489

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

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

元コミット内容

ar.h6lにおけるソースレベルの互換性のために追加。バイナリ互換性は問題ない。

変更の背景

このコミットは、Go言語の初期開発段階におけるツールチェインの構築に関連しています。特に、6lというリンカが、アーカイブファイル(.aファイル、静的ライブラリ)のヘッダー情報を正しく解釈するためにar.hが必要とされたことが背景にあります。

Go言語のツールチェインは、Plan 9というオペレーティングシステムの設計思想や既存のツールを多く取り入れています。6lリンカもその一つで、Plan 9のリンカの設計をベースにしています。Plan 9のツールチェインでは、アーカイブファイルのフォーマットが特定の構造を持っており、その構造をC言語のヘッダーファイルとして定義することで、ツール間での互換性を保っていました。

このコミットの目的は、Goのツールチェインが既存のPlan 9ベースのツール(この場合は6l)と連携する際に、ソースコードレベルでの互換性を確保することです。ar.hは、アーカイブファイルのヘッダー構造を定義することで、6lがアーカイブファイルを正しく読み込み、リンク処理を行うための基盤を提供します。コミットメッセージにある「binary compatibility is ok」は、既存のバイナリ形式のアーカイブファイル自体は変更する必要がなく、ソースコード側でその構造を認識するための定義を追加するだけで良い、ということを示唆しています。

前提知識の解説

  • アーカイブファイル (.aファイル): Unix系システムで静的ライブラリを格納するために使用されるファイル形式です。複数のオブジェクトファイル(.oファイル)を一つにまとめたもので、リンカがプログラムをビルドする際に参照します。ar(archiver)コマンドによって作成・管理されます。
  • arコマンド: Unix系システムでアーカイブファイルを作成、変更、展開するためのユーティリティです。
  • リンカ (6l): コンパイラによって生成されたオブジェクトファイルやライブラリファイルを結合し、実行可能なプログラムを生成するツールです。Go言語の初期のリンカは、ターゲットアーキテクチャに応じて8l(x86)、6l(amd64)、5l(ARM)などの名前が付けられていました。このコミットでは6lが言及されているため、amd64アーキテクチャ向けのリンカを指しています。
  • Plan 9: ベル研究所で開発された分散オペレーティングシステムです。Go言語の設計思想やツールチェインには、Plan 9の影響が強く見られます。特に、シンプルさ、モジュール性、ファイルシステム中心のアプローチなどが共通しています。
  • Inferno OS: Plan 9の思想を受け継いで開発された分散オペレーティングシステムです。このar.hファイルのコメントに// Inferno utils/include/ar.hとあることから、Inferno OSのユーティリティからこの定義が取り込まれたことがわかります。これは、Go言語の初期ツールチェインが既存のPlan 9/Infernoのコードベースを再利用・適応していたことを示しています。
  • ソースレベル互換性 vs. バイナリ互換性:
    • ソースレベル互換性: ソースコードが変更なしにコンパイルできることを指します。この場合、ar.hの定義が6lのソースコードが期待するアーカイブファイルの構造と一致していることを意味します。
    • バイナリ互換性: コンパイル済みのバイナリファイルが、新しいバージョンや異なる環境でも問題なく動作することを指します。このコミットでは、既存のアーカイブファイルのバイナリ形式自体は変更する必要がないことを示しています。

技術的詳細

追加されたar.hファイルは、アーカイブファイルのヘッダー構造をC言語のstructで定義しています。これは、リンカがアーカイブファイルの内容を解析するために必要なメタデータを提供します。

具体的には、以下のマクロと構造体が定義されています。

  • ARMAG: アーカイブファイルの先頭に置かれるマジック文字列 "!<arch>\\n" を定義します。これにより、ファイルがアーカイブファイルであることを識別できます。
  • SARMAG: ARMAGの長さ(8バイト)を定義します。
  • ARFMAG: アーカイブメンバーのヘッダーの最後に置かれるマジック文字列 `\\n` を定義します。
  • SARNAME: アーカイブメンバーの名前フィールドの長さ(16バイト)を定義します。
  • struct ar_hdr: 各アーカイブメンバーのヘッダー情報を格納する構造体です。
    • name[SARNAME]: メンバーの名前。
    • date[12]: メンバーの最終変更日時(UnixタイムスタンプのASCII表現)。
    • uid[6]: ユーザーID(ASCII表現)。
    • gid[6]: グループID(ASCII表現)。
    • mode[8]: ファイルモード(パーミッション、ASCII表現)。
    • size[10]: メンバーのサイズ(バイト単位、ASCII表現)。
    • fmag[2]: ARFMAGと同じマジック文字列。
  • SAR_HDR: ar_hdr構造体の全体のサイズ(SARNAME + 44バイト)を定義します。

これらの定義は、標準的なUnix arフォーマット(特にBSDやSystem Vのバリアント)に準拠しており、リンカがアーカイブファイル内の個々のオブジェクトファイルを見つけ、そのメタデータ(名前、サイズ、パーミッションなど)を読み取るために使用されます。

このヘッダーファイルがGoのツールチェインに追加されたことで、6lリンカは、これらの定義を利用してアーカイブファイルを正しく解析し、リンク処理を行うことができるようになります。これにより、Goのプログラムが既存のC言語の静的ライブラリとリンクしたり、Goのコンパイラが生成したオブジェクトファイルをアーカイブにまとめたりする際に、互換性が保たれることになります。

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

include/ar.hという新しいファイルが追加されました。

diff --git a/include/ar.h b/include/ar.h
new file mode 100644
index 0000000000..529055d141
--- /dev/null
+++ b/include/ar.h
@@ -0,0 +1,47 @@
+// Inferno utils/include/ar.h
+// http://code.google.com/p/inferno-os/source/browse/utils/include/ar.h
+//
+//
+//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
+//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
+//	Portions Copyright © 1997-1999 Vita Nuova Limited
+//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
+//	Portions Copyright © 2004,2006 Bruce Ellis
+//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
+//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
+//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#define	ARMAG	"!<arch>\\n"
+#define	SARMAG	8
+
+#define	ARFMAG	"`\\n"
+#define SARNAME	16
+
+struct	ar_hdr
+{
+	char	name[SARNAME];
+	char	date[12];
+	char	uid[6];
+	char	gid[6];
+	char	mode[8];
+	char	size[10];
+	char	fmag[2];
+};
+#define	SAR_HDR	(SARNAME+44)

コアとなるコードの解説

追加されたar.hファイルは、アーカイブファイル(.aファイル)の構造をC言語で定義しています。これは、Go言語のリンカである6lが、アーカイブファイルを正しく解析し、その中に含まれるオブジェクトファイルにアクセスするために不可欠な定義です。

ファイルの内容は以下の要素で構成されています。

  1. 著作権表示とライセンス情報:

    • Inferno OSのutils/include/ar.hから派生したものであることが明記されています。これは、Go言語の初期ツールチェインがPlan 9/Infernoの既存のコードベースを積極的に利用していたことを示しています。
    • Lucent Technologies Inc., Vita Nuova Limited, Vita Nuova Holdings Limited, Bruce Ellis, C H Forsyth, およびThe Go Authorsによる著作権表示が含まれています。
    • MITライセンスに似た、寛容なオープンソースライセンスが適用されています。これにより、このコードをGoプロジェクトに組み込むことが許可されています。
  2. マクロ定義:

    • ARMAG: アーカイブファイルの先頭に現れるマジック文字列 "!<arch>\\n" を定義します。これは、ファイルが有効なアーカイブファイルであるかどうかを識別するために使用されます。
    • SARMAG: ARMAGの長さ(8バイト)を定義します。
    • ARFMAG: 各アーカイブメンバーのヘッダーの最後に現れるマジック文字列 `\\n` を定義します。
    • SARNAME: アーカイブメンバーの名前フィールドの長さ(16バイト)を定義します。
  3. struct ar_hdr構造体:

    • これは、アーカイブファイル内の各メンバー(通常はオブジェクトファイル)のメタデータを記述するヘッダー構造体です。
    • name[SARNAME]: アーカイブメンバーの名前を格納します。通常はファイル名です。
    • date[12]: メンバーの最終変更日時をASCII形式の10進数で格納します。これはUnixタイムスタンプです。
    • uid[6]: メンバーの所有者のユーザーIDをASCII形式で格納します。
    • gid[6]: メンバーの所有者のグループIDをASCII形式で格納します。
    • mode[8]: メンバーのファイルモード(パーミッション)を8進数のASCII形式で格納します。
    • size[10]: メンバーのデータ部分のサイズをバイト単位でASCII形式の10進数で格納します。
    • fmag[2]: ARFMAGと同じマジック文字列を格納します。これは、ヘッダーの整合性をチェックするために使用されます。
  4. SAR_HDRマクロ:

    • ar_hdr構造体の全体のサイズをバイト単位で定義します。これは、アーカイブファイルをパースする際に、次のメンバーのヘッダーやデータ部分のオフセットを計算するために使用されます。

このar.hの追加により、6lリンカは、これらの定義を利用してアーカイブファイルのバイナリ構造を理解し、必要なオブジェクトファイルを抽出してリンク処理を行うことができるようになります。これは、Go言語が既存のシステムツールやライブラリと連携するための重要なステップでした。

関連リンク

参考にした情報源リンク

  • コミットメッセージと差分情報
  • Go言語の公式ドキュメントおよびブログ
  • Plan 9およびInferno OSに関する公開情報
  • Unix arコマンドのファイルフォーマットに関する一般的な情報
  • 6lリンカに関する情報 (Go言語の初期のリンカ)
  • Inferno utils/include/ar.hのソースコード (Google Code Archive経由で参照可能)