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

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

このコミットは、Go 1.3のリリースノートドキュメントである doc/go1.3.html に、新しい標準ライブラリパッケージ debug/plan9obj が追加されたことを記述する変更です。このパッケージは、Plan 9オペレーティングシステムの a.out オブジェクトファイルへのアクセスを実装しています。

コミット

commit ba593757508b3f748d4e33e4bbd86d7418d81578
Author: David du Colombier <0intro@gmail.com>
Date:   Fri Apr 18 10:50:06 2014 +0200

    doc/go1.3.html: new package debug/plan9obj
    
    LGTM=r
    R=r
    CC=golang-codereviews, rsc
    https://golang.org/cl/86180046

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

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

元コミット内容

doc/go1.3.html: new package debug/plan9obj

LGTM=r
R=r
CC=golang-codereviews, rsc
https://golang.org/cl/86180046

変更の背景

Go言語は、その設計思想や開発プロセスにおいて、ベル研究所で開発されたオペレーティングシステム「Plan 9 from Bell Labs」から大きな影響を受けています。Goの初期開発者の中には、Plan 9の開発に携わった人物も多く、その哲学や技術的要素がGoの様々な側面に反映されています。

このコミットの背景には、Go 1.3リリースにおいて、標準ライブラリに debug/plan9obj パッケージが新たに追加されたことがあります。このパッケージは、Plan 9のネイティブな実行ファイル形式である a.out オブジェクトファイルをGoプログラムから解析・操作するための機能を提供します。

Goの debug モジュールは、実行ファイルやデバッグ情報にアクセスするためのツールを提供することを目的としています。debug/plan9obj の追加は、GoがPlan 9のバイナリ形式を直接扱う能力を持つことで、Plan 9環境との相互運用性や、Plan 9バイナリの解析・デバッグといった特定のユースケースに対応するためのものです。Go 1.3のリリースノートにこの新しいパッケージの存在を明記することで、ユーザーにその機能と利用可能性を周知することが目的です。

前提知識の解説

Plan 9 from Bell Labs

Plan 9は、ベル研究所で開発された分散オペレーティングシステムです。Unixの後継として設計され、Unixの概念をさらに推し進めたもので、特に「すべてをファイルとして扱う」という原則を徹底しています。ネットワーク上のリソース(CPU、ストレージ、サービスなど)もファイルシステムを通じてアクセスできる点が特徴です。Go言語の設計思想、特に並行処理やモジュール性、シンプルなインターフェースの重視には、Plan 9の影響が色濃く見られます。

a.out オブジェクトファイル

a.out は、Unix系システムで古くから使われていた実行ファイルおよびオブジェクトファイルのフォーマットです。その名前は、アセンブラのデフォルト出力ファイル名である "assembler output" に由来します。Plan 9においても、独自の a.out フォーマットが採用されています。

Plan 9の a.out フォーマットは、Unixの a.out とは異なる独自の構造を持っています。主な特徴は以下の通りです。

  • シンプルさ: 比較的シンプルな構造で、テキスト(コード)、データ、BSS(初期化されていないデータ)、シンボルテーブルなどのセクションを持ちます。
  • メモリレイアウト: 実行時には、テキストセグメント、データセグメント、スタックという3つの主要なメモリセグメントが構成されます。
  • リンカ: Plan 9のCコンパイラ(例: 8c for Intel 386)が中間オブジェクトファイルを生成し、専用のローダー(例: 8l)が最終的な a.out 実行ファイルを生成します。
  • ELFとの比較: 現代のLinuxなどで広く使われているELF (Executable and Linkable Format) と比較すると、a.out はより古く、機能が限定的です。特に共有ライブラリの扱いにおいて、a.out は共有ライブラリが固定メモリアドレスを占有する必要があるなど、スケーラビリティに課題がありました。

Goの debug パッケージ群

Goの標準ライブラリには、debug というモジュールがあり、その中に様々な実行ファイル形式を解析するためのパッケージが含まれています。これらは、プログラムのデバッグ、プロファイリング、またはバイナリの構造解析といった目的で利用されます。例えば、debug/elf はELF形式のファイルを、debug/macho はmacOSのMach-O形式のファイルを、debug/pe はWindowsのPE形式のファイルを扱います。debug/plan9obj は、この debug モジュールの一部として、Plan 9の a.out 形式をサポートするために追加されました。

技術的詳細

debug/plan9obj パッケージは、GoプログラムがPlan 9の a.out オブジェクトファイルの内部構造にアクセスし、その情報を読み取るためのAPIを提供します。このパッケージの主な機能は以下の通りです。

  • ファイル解析: Plan 9 a.out 形式のバイナリファイルを解析し、そのヘッダ情報、セクション(テキスト、データ、BSSなど)、およびシンボルテーブルにアクセスできます。
  • API:
    • NewFile(r io.ReaderAt): io.ReaderAt インターフェースを実装する任意のソース(ファイル、メモリ上のバイト列など)からPlan 9バイナリを読み込み、File オブジェクトを生成します。
    • Open(name string): 指定されたパスのファイルを開き、Plan 9 a.out バイナリとして解析します。
    • (*File) Close(): 開いたファイルを閉じます。
    • (*File) Section(name string): 指定された名前のセクション(例: "text", "data")を返します。
    • (*File) Symbols(): バイナリ内のシンボル(関数名、変数名など)を含むシンボルテーブルを返します。
  • ユースケース:
    • クロスコンパイルツールチェーンの開発: Plan 9をターゲットとするGoプログラムのビルドや、Plan 9バイナリの生成・解析を行うツールを開発する際に利用できます。
    • バイナリ解析: Plan 9環境で生成された実行ファイルの構造をGoプログラムから分析し、デバッグ情報やシンボル情報を抽出するのに役立ちます。
    • 歴史的プロジェクトのメンテナンス: Plan 9ベースのシステムやアプリケーションを扱う際に、そのバイナリ形式を理解し、操作するための基盤を提供します。
  • セキュリティ上の注意: このパッケージは、悪意のある入力に対して堅牢に設計されているわけではありません。オブジェクトファイルを解析する際に基本的な検証しか行わないため、信頼できない入力ファイルを解析する際には注意が必要です。不正な形式のファイルは、リソース消費やパニックを引き起こす可能性があります。

このパッケージの追加により、Go言語はPlan 9のバイナリ形式に対するネイティブなサポートを獲得し、特定のニッチな分野でのGoの適用範囲を広げました。

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

このコミットでは、doc/go1.3.html ファイルの以下の部分が変更されています。

--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -234,7 +234,8 @@
 which can be useful information when debugging deadlocks or performance issues.
 <h3 id="new_packages">New packages</h3>
 <p>
-No new packages appear in the core libraries in Go 1.3.
+A new package <a href="/pkg/debug/plan9obj/"><code>debug/plan9obj</code></a> was added to the standard library.
+It implements access to Plan 9 <a href="http://plan9.bell-labs.com/magic/man2html/6/a.out">a.out</a> object files.
 </p>
 <h3 id="major_library_changes">Major changes to the library</h3>

具体的には、doc/go1.3.html の「New packages」セクションにおいて、Go 1.3で新しいコアライブラリパッケージは追加されないという記述が、debug/plan9obj パッケージが標準ライブラリに追加されたという記述に修正されています。

コアとなるコードの解説

変更前の doc/go1.3.html では、Go 1.3のコアライブラリには新しいパッケージが追加されないと記載されていました。しかし、実際には debug/plan9obj パッケージが追加されたため、このコミットによってリリースノートの記述が修正されました。

変更後のHTMLスニペットは以下の情報を伝えています。

  • A new package <a href="/pkg/debug/plan9obj/"><code>debug/plan9obj</code></a> was added to the standard library.
    • これは、debug/plan9obj という新しいパッケージがGoの標準ライブラリに追加されたことを明確に述べています。/pkg/debug/plan9obj/ へのリンクは、このパッケージの公式ドキュメントへの直接リンクを提供し、ユーザーが詳細情報を参照できるようにしています。
  • It implements access to Plan 9 <a href="http://plan9.bell-labs.com/magic/man2html/6/a.out">a.out</a> object files.
    • この行は、debug/plan9obj パッケージの主要な機能、すなわちPlan 9の a.out オブジェクトファイルへのアクセスを実装していることを説明しています。http://plan9.bell-labs.com/magic/man2html/6/a.out へのリンクは、Plan 9の a.out フォーマットに関する公式ドキュメントへの参照を提供し、ユーザーがその背景と詳細を理解するのに役立ちます。

この変更は、Go 1.3のリリースノートの正確性を保ち、ユーザーが新しい標準ライブラリパッケージの追加とその目的を正しく理解できるようにするために重要です。

関連リンク

参考にした情報源リンク