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

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

このコミットは、Go言語の debug/macho パッケージにテストファイルを追加するものです。具体的には、以前の変更(CL 60190043)で導入された「fat/universal binaries」(ユニバーサルバイナリ)のサポートを検証するためのテストデータが追加されています。

コミット

commit 951508671dff04f1784309cf2ec5445721357e35
Author: Dave Cheney <dave@cheney.net>
Date:   Thu Feb 13 10:58:23 2014 +1100

    debug/macho: add test file for CL 60190043
    
    From the description of CL 60190043
    
    debug/macho: Add support for opening fat/universal binaries.
    
    New testdata was created from existing using:
    $ lipo gcc-386-darwin-exec gcc-amd64-darwin-exec -create -output
    fat-gcc-386-amd64-darwin-exec
    
    Update #7250
    
    LGTM=iant
    R=golang-codereviews, gobot, dsymonds, iant
    CC=golang-codereviews
    https://golang.org/cl/61720044

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

https://github.com/golang/go/commit/951508671dff04f1784309cf2ec5445721357e35

元コミット内容

このコミットの元々の内容は、debug/macho パッケージにテストファイルを追加することです。このテストファイルは、以前の変更リスト(CL 60190043)で導入された、Mach-O形式の「fat/universal binaries」(ユニバーサルバイナリ)を開く機能のサポートを検証するために使用されます。

コミットメッセージには、新しいテストデータが既存の gcc-386-darwin-execgcc-amd64-darwin-exec という2つのバイナリから lipo ツールを使って作成されたことが示されています。これは、異なるアーキテクチャ(386とamd64)向けのバイナリを1つのユニバーサルバイナリに結合するプロセスを反映しています。

変更の背景

このコミットの背景には、Go言語の debug/macho パッケージが、macOS(旧OS X)で広く使用されているMach-O形式の実行可能ファイル、特に複数のCPUアーキテクチャをサポートする「ユニバーサルバイナリ」を適切に解析できるようにする必要があったことが挙げられます。

以前のCL 60190043でユニバーサルバイナリの読み込みサポートが追加されましたが、その機能が正しく動作することを保証するためには、適切なテストデータが必要でした。このコミットは、そのテストデータを追加することで、新しい機能の堅牢性を確保し、将来的な回帰を防ぐことを目的としています。

macOSでは、異なるCPUアーキテクチャ(例: Intel x86-64とARM64)に対応するために、複数のアーキテクチャのコードを1つのファイルにまとめたユニバーサルバイナリがよく利用されます。debug/macho パッケージがこれらのファイルを正しく解析できなければ、デバッグツールやプロファイリングツールなどがmacOS上で期待通りに機能しない可能性があります。

前提知識の解説

Mach-O (Mach Object)

Mach-Oは、macOS、iOS、watchOS、tvOSなどのAppleのオペレーティングシステムで使用される実行可能ファイル、オブジェクトコード、共有ライブラリ、動的ロード可能コード、およびコアダンプのファイル形式です。WindowsのPE (Portable Executable) やLinuxのELF (Executable and Linkable Format) に相当します。

Mach-Oファイルは、ヘッダ、ロードコマンド、およびセグメントデータで構成されます。ヘッダはファイルの基本的な情報(CPUタイプ、ファイルタイプなど)を含み、ロードコマンドはファイル内のセグメントの配置、共有ライブラリの依存関係、エントリポイントなどを記述します。

Fat Binary / Universal Binary (ユニバーサルバイナリ)

Fat Binary(またはUniversal Binary)は、複数のCPUアーキテクチャ向けの実行可能コードを1つのファイルにまとめたMach-Oファイルの一種です。例えば、Intel x86-64とARM64の両方のコードを含むバイナリは、両方のアーキテクチャのMacでネイティブに実行できます。

この形式は、AppleがPowerPCからIntelへの移行、そしてIntelからApple Silicon(ARM64)への移行の際に、開発者が単一のアプリケーションバイナリを提供できるようにするために特に重要でした。オペレーティングシステムは、実行時に現在のCPUアーキテクチャに合ったコードスライスを自動的に選択して実行します。

lipo コマンド

lipo は、macOSに付属するコマンドラインツールで、Fat Binaryを作成、変更、または検査するために使用されます。異なるアーキテクチャ向けの複数のバイナリファイルを結合して1つのFat Binaryを作成したり、Fat Binaryから特定のアーキテクチャのコードスライスを抽出したりすることができます。

このコミットのメッセージにある $ lipo gcc-386-darwin-exec gcc-amd64-darwin-exec -create -output fat-gcc-386-amd64-darwin-exec というコマンドは、32ビットIntel (386) と64ビットIntel (amd64) の2つの異なるアーキテクチャ向けの実行可能ファイルを結合して、fat-gcc-386-amd64-darwin-exec という名前のユニバーサルバイナリを作成していることを示しています。

CL (Change List)

Goプロジェクトでは、コードの変更は「Change List」(CL)として管理されます。これは、Gerritなどのコードレビューシステムで使われる用語で、一連の関連する変更をまとめたものです。コミットメッセージに CL 60190043 とあるのは、このコミットがその特定の変更リストに関連していることを示しています。

技術的詳細

このコミットの技術的な詳細は、debug/macho パッケージがユニバーサルバイナリを正しく解析できることを保証するためのテストデータの追加に集約されます。

debug/macho パッケージは、Go言語でMach-O形式のファイルを読み込み、解析するためのライブラリです。これには、Mach-Oヘッダ、ロードコマンド、セグメント、シンボルテーブルなどの構造をGoのデータ構造にマッピングし、それらにアクセスするためのAPIが含まれます。ユニバーサルバイナリの場合、このパッケージは、ファイル内の複数のアーキテクチャスライスを識別し、それぞれを個別のMach-Oファイルとして扱う能力を持つ必要があります。

追加されたテストファイル fat-gcc-386-amd64-darwin-exec は、lipo コマンドによって作成された実際のユニバーサルバイナリです。このバイナリは、debug/macho パッケージが以下のようなシナリオを正しく処理できることを検証するために使用されます。

  1. Fat Headerの解析: ユニバーサルバイナリの先頭にあるFat Headerを正しく読み込み、ファイル内に含まれる各アーキテクチャスライスのオフセットとサイズを特定できること。
  2. 個々のMach-Oスライスの識別: Fat Headerから得られた情報に基づいて、ファイル内の各アーキテクチャ(386とamd64)に対応する個別のMach-Oバイナリを識別できること。
  3. スライスごとの解析: 各スライスを独立したMach-Oファイルとして扱い、その内部構造(ヘッダ、ロードコマンド、セグメントなど)を個別に解析できること。

このテストデータの追加により、debug/macho パッケージのユニバーサルバイナリサポートが、実際のバイナリに対して機能することを自動テストで確認できるようになります。これは、パッケージの信頼性と堅牢性を高める上で非常に重要です。

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

このコミットによるコアとなるコードの変更箇所は、src/pkg/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec という新しいテストファイルの追加です。

--- a/src/pkg/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec
+++ b/src/pkg/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec
Binary files /dev/null and b/src/pkg/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec differ

この差分は、新しいバイナリファイルがリポジトリに追加されたことを示しています。具体的なファイルの内容はバイナリであるため、差分ツールでは表示されませんが、ファイルサイズが0バイトから28992バイトに増加していることが示されています。

コアとなるコードの解説

このコミット自体は、Goのソースコードに直接的なロジックの変更を加えるものではありません。その代わりに、debug/macho パッケージのテストスイートで使用される新しいテストデータファイルを追加しています。

追加されたファイル fat-gcc-386-amd64-darwin-exec は、前述の通り、lipo コマンドによって作成されたユニバーサルバイナリです。このバイナリは、debug/macho パッケージ内のテストコード(おそらく debug/macho ディレクトリ内の既存または新規のテストファイル、例えば macho_test.go など)によって読み込まれ、解析されます。

テストコードは、このユニバーサルバイナリを debug/macho パッケージのAPI(例: macho.Openmacho.OpenFat のような関数)を使って開き、その中に含まれる複数のアーキテクチャスライス(386とamd64)が正しく識別され、それぞれのスライスのMach-Oヘッダやロードコマンドが期待通りに解析できることをアサートします。

このテストデータが存在することで、開発者は debug/macho パッケージの変更がユニバーサルバイナリの解析機能に悪影響を与えないことを、自動化されたテストを通じて確認できるようになります。これは、ソフトウェア開発における回帰テストの重要な側面です。

関連リンク

  • 元の変更リスト (CL 60190043): このコミットが関連する、ユニバーサルバイナリサポートを追加した変更リスト。Goのコードレビューシステムで詳細を確認できますが、直接的なリンクはコミットメッセージにはありません。しかし、コミットメッセージに記載されている https://golang.org/cl/61720044 は、このコミット自体のCLへのリンクです。元のCL 60190043は、このコミットの前にマージされたはずです。
  • Go Issue #7250: コミットメッセージに Update #7250 とあることから、この変更が解決または関連するGoのIssueトラッカーのエントリが存在します。これは、この機能がなぜ必要とされたか、どのような問題が解決されたかについての背景情報を提供している可能性があります。

参考にした情報源リンク

  • Mach-O File Format Reference: Apple Developer Documentation (Mach-Oの公式ドキュメントはAppleのウェブサイトで提供されていますが、直接的なURLは変動する可能性があります。検索エンジンで「Mach-O File Format」と検索すると見つかります。)
  • Universal Binaries: Apple Developer Documentation (ユニバーサルバイナリに関する公式ドキュメントもAppleのウェブサイトで提供されています。)
  • lipo man page: macOSのターミナルで man lipo と入力すると、lipo コマンドの詳細なマニュアルページを参照できます。
  • Go言語の debug/macho パッケージのソースコード:
  • Go言語のコードレビューシステム (Gerrit):
  • Go Issue Tracker: