[インデックス 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言語のビルドタグに関する公式ドキュメント:
- Go Command Documentation: https://pkg.go.dev/cmd/go#hdr-Build_constraints
- このコミットが修正したリグレッションの元の変更リスト (CL):
https://golang.org/cl/68490043
(このCLは直接アクセスできない可能性がありますが、コミットメッセージで参照されています)
- このコミット自体の変更リスト (CL):
https://golang.org/cl/68080046
(これも直接アクセスできない可能性がありますが、コミットメッセージで参照されています)
参考にした情報源リンク
- Go言語の公式ドキュメント (特に
cmd/go
のビルド制約に関するセクション) - Go言語のソースコードリポジトリ (GitHub)
- SHA-1ハッシュ関数に関する一般的な情報 (Wikipediaなど)
- Go言語のビルドタグに関するコミュニティの議論やブログ記事 (一般的な知識として)