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

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

このコミットは、Go言語の標準ライブラリ crypto/sha1 パッケージ内の sha1block_decl.go ファイルに対する変更です。具体的には、ビルドタグから誤って削除されていた arm アーキテクチャのタグを復元するものです。

コミット

commit 8a8b5cba67da4e16aef2ab7704bb079cc8771cf3
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Tue Feb 25 10:55:26 2014 -0800

    crypto/sha1: restore accidental removal of arm build tag
    
    Regression from https://golang.org/cl/68490043/diff/60001/src/pkg/crypto/sha1/sha1block_decl.go
    
    Fixes arm build.
    
    TBR=rsc
    R=rsc
    CC=golang-codereviews
    https://golang.org/cl/68080046

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

https://github.com/golang/go/commit/8a8b5cba67da4e16aef2ab7704bb079cc8771cf3

元コミット内容

このコミットは、crypto/sha1 パッケージの sha1block_decl.go ファイルにおいて、ビルドタグから arm アーキテクチャの指定が誤って削除されてしまった問題を修正するものです。これにより、ARMアーキテクチャ上でのGoプログラムのビルドが失敗する問題が発生していました。

変更の背景

この変更は、以前のコミット https://golang.org/cl/68490043 によって引き起こされたリグレッション(退行バグ)を修正するために行われました。元のコミットでは、src/pkg/crypto/sha1/sha1block_decl.go ファイルのビルドタグから arm が意図せず削除されていました。その結果、ARMベースのシステムでGoのコードをビルドしようとすると、crypto/sha1 パッケージが正しくコンパイルされず、ビルドエラーが発生するようになりました。このコミットは、このビルド問題を解決し、ARMアーキテクチャでのGoの利用を再び可能にすることを目的としています。

前提知識の解説

Go言語のビルドタグ (Build Tags)

Go言語には「ビルドタグ (Build Tags)」という機能があります。これは、特定のファイルが特定の環境(オペレーティングシステム、アーキテクチャ、Goのバージョンなど)でのみコンパイルされるように制御するための仕組みです。ソースコードファイルの先頭に // +build tag_name の形式でコメントとして記述されます。

例えば、// +build linux,amd64 と書かれたファイルは、LinuxかつAMD64アーキテクチャの環境でのみコンパイルされます。複数のタグがスペースで区切られている場合はOR条件(いずれかのタグが一致すればコンパイル)、カンマで区切られている場合はAND条件(すべてのタグが一致すればコンパイル)となります。

このコミットで問題となっているのは、+build 行から arm タグが削除されたことです。arm はARMプロセッサアーキテクチャを指すビルドタグであり、このタグがないと、そのファイルはARM環境ではコンパイル対象外となってしまいます。

crypto/sha1 パッケージ

crypto/sha1 はGo言語の標準ライブラリに含まれるパッケージで、SHA-1ハッシュ関数を実装しています。SHA-1は、入力データから固定長のハッシュ値(メッセージダイジェスト)を生成する暗号学的ハッシュ関数の一つです。データの完全性検証やデジタル署名などに利用されます。

sha1block_decl.go のようなファイルは、通常、特定のアーキテクチャに最適化されたアセンブリコードや、そのアセンブリコードを呼び出すための宣言(declaration)が含まれることがあります。このようなファイルは、パフォーマンス向上のために特定のCPU命令セットを利用することが多いため、ビルドタグによってコンパイル対象のアーキテクチャが厳密に制御されます。

技術的詳細

このコミットの技術的な核心は、Goのビルドシステムとビルドタグの挙動にあります。sha1block_decl.go ファイルは、crypto/sha1 パッケージ内で、おそらくSHA-1ハッシュ計算のブロック処理を高速化するための特定の最適化(例えば、アセンブリ言語による実装)を含んでいたと考えられます。このような最適化は、特定のCPUアーキテクチャ(この場合は amd64, amd64p32, 386, そして arm)に依存するため、ビルドタグによってそのファイルがどのアーキテクチャでコンパイルされるべきかが明示されます。

以前の変更で arm タグが削除されたことにより、ARMアーキテクチャでGoのツールチェインがこのファイルをコンパイルしようとした際に、ビルドタグの条件を満たさないため、このファイルがコンパイル対象から外れてしまいました。その結果、crypto/sha1 パッケージのビルドに必要なシンボルや関数が欠落し、リンクエラーやコンパイルエラーが発生し、最終的にARM環境でのGoプログラムのビルドが失敗する原因となりました。

このコミットは、単に arm タグを +build 行に追加することで、このファイルを再びARMアーキテクチャのビルド対象に含め、問題を解決しています。これは、Goのビルドタグが、クロスコンパイルや特定のプラットフォーム向けビルドにおいて、コードの選択的なコンパイルをいかに制御しているかを示す典型的な例です。

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

--- a/src/pkg/crypto/sha1/sha1block_decl.go
+++ b/src/pkg/crypto/sha1/sha1block_decl.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.

-// +build amd64 amd64p32 386
+// +build amd64 amd64p32 arm 386

 package sha1

変更は src/pkg/crypto/sha1/sha1block_decl.go ファイルの1箇所のみです。

具体的には、以下の行が変更されました。

  • 変更前: // +build amd64 amd64p32 386
  • 変更後: // +build amd64 amd64p32 arm 386

+build ディレクティブに arm が追加されています。

コアとなるコードの解説

この変更は非常にシンプルですが、その影響は大きいです。

// +build amd64 amd64p32 arm 386 は、Goのビルドシステムに対する指示です。この行は、この sha1block_decl.go ファイルが、以下のいずれかのアーキテクチャでビルドされる場合にのみコンパイル対象となることを意味します。

  • amd64: 64ビットIntel/AMDアーキテクチャ
  • amd64p32: 64ビットIntel/AMDアーキテクチャで、ポインタが32ビットである場合(一部の特殊な環境)
  • arm: ARMアーキテクチャ
  • 386: 32ビットIntel/AMDアーキテクチャ

以前のバージョンでは arm が含まれていなかったため、ARMアーキテクチャでGoのコードをビルドしようとすると、このファイルは無視され、結果として crypto/sha1 パッケージの機能が不完全になり、ビルドエラーが発生していました。

arm タグを復元することで、ARM環境でのビルド時にこのファイルが正しくコンパイル対象に含まれるようになり、crypto/sha1 パッケージが完全な形で提供され、ARMアーキテクチャでのGoプログラムのビルドが再び成功するようになりました。これは、Goのクロスプラットフォーム対応において、ビルドタグがいかに重要な役割を果たすかを示す好例です。

関連リンク

  • Go言語のビルドタグに関する公式ドキュメント:
  • このコミットが修正したリグレッションの元の変更リスト (CL):
    • https://golang.org/cl/68490043 (このCLは直接アクセスできない可能性がありますが、コミットメッセージで参照されています)
  • このコミット自体の変更リスト (CL):
    • https://golang.org/cl/68080046 (これも直接アクセスできない可能性がありますが、コミットメッセージで参照されています)

参考にした情報源リンク

  • Go言語の公式ドキュメント (特に cmd/go のビルド制約に関するセクション)
  • Go言語のソースコードリポジトリ (GitHub)
  • SHA-1ハッシュ関数に関する一般的な情報 (Wikipediaなど)
  • Go言語のビルドタグに関するコミュニティの議論やブログ記事 (一般的な知識として)