[インデックス 13062] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおけるNetBSD向けのシステムコール関連ファイルの更新と修正に焦点を当てています。具体的には、mkerrors.sh
スクリプトのNetBSD対応、types_netbsd.go
からのディレクトリモードビットの削除、そしてcgo
の動作改善に伴うz*
ファイルの再生成が行われています。これにより、NetBSD環境でのGoプログラムがより正確にシステムコールを利用できるようになります。
コミット
commit 2a47e0444c4d75ee28f1f60ed41aa274be56dda9
Author: Joel Sing <jsing@google.com>
Date: Mon May 14 10:40:13 2012 -0700
syscall: regenerate z* files for netbsd
Fix mkerrors.sh so that it works on NetBSD.
Remove directory mode bits from types - this already appears in errors.
Regenerate the z* files now that cgo is working.
R=golang-dev, m4dh4tt3r, r
CC=golang-dev
https://golang.org/cl/6201077
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2a47e0444c4d75ee28f1f60ed41aa274be56dda9
元コミット内容
syscall: regenerate z* files for netbsd
Fix mkerrors.sh so that it works on NetBSD.
Remove directory mode bits from types - this already appears in errors.
Regenerate the z* files now that cgo is working.
変更の背景
このコミットの主な背景は、Go言語のsyscall
パッケージがNetBSDオペレーティングシステム上で正しく機能するための改善です。特に以下の点が挙げられます。
mkerrors.sh
のNetBSD対応:mkerrors.sh
は、Goのsyscall
パッケージで使用されるエラーコードや定数をCヘッダーファイルから自動生成するためのスクリプトです。NetBSD環境でこのスクリプトが正しく動作しない問題があったため、その修正が必要でした。- 冗長な定義の排除:
types_netbsd.go
ファイルに定義されていたディレクトリモードビット(S_IFMT
,S_IFIFO
など)が、既にエラー関連の定義に含まれていたため、冗長性を排除するために削除されました。これにより、コードの重複が解消され、保守性が向上します。 cgo
の動作改善:cgo
はGoとC言語の相互運用を可能にするツールです。cgo
の動作が改善されたことで、NetBSD固有のシステムコール定数や構造体を定義するz*
ファイルを正確に再生成できる環境が整いました。これらのファイルは、GoプログラムがNetBSDの低レベルなOS機能にアクセスするために不可欠です。
これらの変更は、GoがNetBSD環境でより堅牢かつ正確に動作するための基盤を強化することを目的としています。
前提知識の解説
このコミットを理解するためには、以下の技術的背景知識が役立ちます。
- Go言語の
syscall
パッケージ:- Go言語の
syscall
パッケージは、オペレーティングシステムの低レベルなプリミティブ(システムコール)へのアクセスを提供します。ファイル操作、ネットワーク通信、プロセス管理など、OSが提供する基本的な機能に直接アクセスするために使用されます。 - OSごとにシステムコールのインターフェースや定数が異なるため、
syscall
パッケージは各OSおよびアーキテクチャ(例: Linux/amd64, NetBSD/386)に特化した実装を持っています。
- Go言語の
- システムコール:
- アプリケーションがオペレーティングシステムのカーネルが提供するサービスを要求するためのインターフェースです。例えば、ファイルの読み書き、メモリの割り当て、プロセスの生成などがシステムコールを通じて行われます。
mkerrors.sh
:- Goの
syscall
パッケージ内で使用されるシェルスクリプトの一つです。このスクリプトは、C言語のヘッダーファイル(例:/usr/include/errno.h
,/usr/include/signal.h
)から、OS固有のエラーコード(EPERM
,ENOENT
など)やシグナル番号(SIGINT
,SIGTERM
など)を抽出し、Goのソースコード(zerrors_*.go
ファイル)として自動生成します。これにより、GoプログラムがOSのエラーやシグナルを正しく解釈できるようになります。
- Goの
z*
ファイル (zerrors_*.go
,ztypes_*.go
):- Goの
syscall
パッケージには、zerrors_GOOS_GOARCH.go
やztypes_GOOS_GOARCH.go
といった命名規則のファイルが存在します。これらのファイルは、mkerrors.sh
やcgo -godefs
といったツールによって自動生成されるGoのソースファイルです。 zerrors_*.go
ファイルは、OS固有のエラー定数やシグナル定数を定義します。ztypes_*.go
ファイルは、OS固有のC言語の構造体(例:struct stat
,struct timeval
)に対応するGoの型定義を生成します。これらは、システムコールが返すデータや引数として使用される構造体のレイアウトをGoに認識させるために重要です。z
プレフィックスは、これらのファイルが自動生成されたものであり、手動で編集すべきではないことを示唆しています。
- Goの
cgo
:- Go言語にC言語のコードを埋め込み、GoとCの間で関数呼び出しやデータ構造の共有を可能にするツールです。
cgo -godefs
コマンドは、CのヘッダーファイルからGoの型定義を自動生成するために特に使用されます。これにより、Cの構造体や定数の正確なメモリレイアウトをGo側で再現し、システムコールとの互換性を確保します。
- Go言語にC言語のコードを埋め込み、GoとCの間で関数呼び出しやデータ構造の共有を可能にするツールです。
- NetBSD:
- オープンソースのUnix系オペレーティングシステムの一つで、高い移植性を特徴としています。様々なハードウェアアーキテクチャで動作します。Go言語は、このような多様なOS環境をサポートするために、各プラットフォーム固有のシステムコールインターフェースに対応する必要があります。
技術的詳細
このコミットは、Goのsyscall
パッケージがNetBSD環境でより正確に機能するための複数の技術的側面を扱っています。
-
mkerrors.sh
のNetBSD対応:mkerrors.sh
スクリプトは、CヘッダーファイルからGoの定数を生成する際に、特定のOS環境に依存する場合があります。このコミットでは、NetBSD環境でスクリプトが正しく動作しない問題が修正されました。- 具体的には、
src/pkg/syscall/mkerrors.sh
にconst int schedppq = 1;
という行が追加されています。これは、NetBSDの<sys/param.h>
ヘッダーファイルがschedppq
という定数を参照しているため、mkerrors.sh
がCコードをコンパイルする際にこの定義が必要となるためです。この修正により、スクリプトがNetBSD上でエラーなく実行され、zerrors_netbsd_*.go
ファイルが正しく生成されるようになります。
-
ディレクトリモードビットの削除:
src/pkg/syscall/types_netbsd.go
から、S_IFMT
,S_IFIFO
,S_IFCHR
,S_IFDIR
,S_IFBLK
,S_IFREG
,S_IFLNK
,S_IFSOCK
,S_ISUID
,S_ISGID
,S_ISVTX
,S_IRUSR
,S_IWUSR
,S_IXUSR
といったディレクトリモードビットの定数定義が削除されました。- コミットメッセージにある「this already appears in errors」という記述は、これらの定数が既に
zerrors_netbsd_*.go
ファイル(mkerrors.sh
によって生成されるファイル)内で定義されていることを示唆しています。 - Goの
syscall
パッケージでは、OS固有の定数を一元的に管理するために、自動生成されるzerrors_*.go
ファイルに集約する方針が取られています。types_netbsd.go
に手動でこれらの定数を定義することは冗長であり、将来的なOSの変更に対応する際に二重管理の手間や不整合のリスクを生じさせます。この削除により、コードの重複が解消され、定義の信頼性が向上します。
-
z*
ファイルの再生成:cgo
の動作が改善されたことにより、NetBSD向けのzerrors_netbsd_386.go
,zerrors_netbsd_amd64.go
,ztypes_netbsd_386.go
,ztypes_netbsd_amd64.go
ファイルが再生成されました。- これらのファイルは、NetBSDのシステムコールで使用される定数やデータ構造の正確な定義を含んでいます。OSのバージョンアップやCヘッダーファイルの変更に伴い、これらの定数値や構造体レイアウトが変更されることがあります。
cgo
が正しく機能することで、Goのsyscall
パッケージは常に最新かつ正確なOSインターフェースに適合できるようになります。 - 再生成されたファイルでは、既存の定数値の更新(例:
AF_BLUETOOTH
,AF_MAX
,DLT_ENC
などの値の変更)、新しい定数の追加(例:ARPHRD_ARCNET
,B0
からB9600
までのボーレート定数、多数のDLT_
定数、ECHO
関連の定数、RLIMIT_
関連の定数など)、および一部の定数の削除(例:ETHERTYPE_AOE
,ETHERTYPE_LLDP
など)が行われています。これは、NetBSDのシステムヘッダーファイルの内容が更新されたことを反映しています。 - 特に、
zerrors_netbsd_386.go
とzerrors_netbsd_amd64.go
では、AF_
(Address Family),DLT_
(Data Link Type),IFT_
(Interface Type),IPPROTO_
(IP Protocol),IPV6_
,IP_
,MSG_
,SIOC
(Socket IO Control) などの多数の定数値が更新または追加されており、NetBSDのネットワークおよびシステムインターフェースの進化に対応しています。 ztypes_netbsd_386.go
とztypes_netbsd_amd64.go
では、Timespec
,Timeval
,Rusage
,Stat_t
などの基本的なシステム構造体の定義が更新されています。これらの構造体は、ファイルシステム情報、時間、リソース使用量などをシステムコールを通じて取得する際に使用されます。
これらの変更は、Goのsyscall
パッケージがNetBSDの最新のシステムインターフェースと完全に同期し、GoプログラムがNetBSD上で安定して動作するための重要なステップです。
コアとなるコードの変更箇所
このコミットで変更された主要なファイルと、その変更の概要は以下の通りです。
-
src/pkg/syscall/mkerrors.sh
:- NetBSD向けのインクルードセクション(
includes_NetBSD
)に、const int schedppq = 1;
という行が追加されました。これは、NetBSDのシステムヘッダーが参照するschedppq
定数を定義し、スクリプトがNetBSD上で正しくコンパイル・実行されるようにするための修正です。
- NetBSD向けのインクルードセクション(
-
src/pkg/syscall/types_netbsd.go
:const
ブロック内に定義されていたディレクトリモードビット(S_IFMT
,S_IFIFO
,S_IFCHR
,S_IFDIR
,S_IFBLK
,S_IFREG
,S_IFLNK
,S_IFSOCK
,S_ISUID
,S_ISGID
,S_ISVTX
,S_IRUSR
,S_IWUSR
,S_IXUSR
)の定義がすべて削除されました。これらの定数は、自動生成されるzerrors_netbsd_*.go
ファイルに既に存在するため、冗長な定義が排除されました。
-
src/pkg/syscall/zerrors_netbsd_386.go
およびsrc/pkg/syscall/zerrors_netbsd_amd64.go
:- これらのファイルは自動生成されたものであり、NetBSDの32ビット(386)および64ビット(amd64)アーキテクチャ向けのエラーコードおよびその他のシステム定数を含んでいます。
- 多数の定数値が更新(例:
AF_BLUETOOTH
の値が0x20
から0x1f
に変更)されました。 - 新しい定数(例:
AF_ARP
,AF_IEEE80211
,B0
からB921600
までのボーレート定数、多数のDLT_
定数、ECHO
関連定数、RLIMIT_
関連定数など)が追加されました。 - 一部の定数(例:
ETHERTYPE_AOE
,ETHERTYPE_LLDP
など)が削除されました。 errors
変数内のエラーメッセージの文字列も一部更新されています(例:34: "result too large"
が"result too large or too small"
に)。
-
src/pkg/syscall/ztypes_netbsd_386.go
およびsrc/pkg/syscall/ztypes_netbsd_amd64.go
:- これらのファイルも自動生成されたものであり、NetBSDの32ビットおよび64ビットアーキテクチャ向けのC言語の構造体に対応するGoの型定義を含んでいます。
Timespec
,Timeval
,Rusage
,Stat_t
などの構造体定義が更新されました。これは、NetBSDのシステムヘッダーにおけるこれらの構造体のレイアウト変更を反映したものです。
これらの変更は、Goのsyscall
パッケージがNetBSDの最新のシステムインターフェースと同期し、GoプログラムがNetBSD上で安定して動作するための重要なステップです。
コアとなるコードの解説
このコミットの核となる変更は、Goのsyscall
パッケージがNetBSDのシステムコールインターフェースと正確に同期するための自動生成メカニズムの改善と、冗長な定義の排除です。
mkerrors.sh
の修正 (src/pkg/syscall/mkerrors.sh
)
--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -104,6 +104,9 @@ includes_NetBSD='\
#include <netinet/ip.h>\
#include <netinet/ip_mroute.h>\
#include <netinet/if_ether.h>\
+\
+// Needed since <sys/param.h> refers to it...
+const int schedppq = 1;\
'
includes_OpenBSD='\
この変更は、mkerrors.sh
スクリプトがNetBSD環境で実行される際に発生するコンパイルエラーを解決するためのものです。NetBSDの<sys/param.h>
ヘッダーファイルは、schedppq
という定数を参照していますが、この定数が定義されていない環境でmkerrors.sh
がCコードをコンパイルしようとするとエラーになります。
const int schedppq = 1;
という行をincludes_NetBSD
セクションに追加することで、mkerrors.sh
が生成するCソースコードにこの定義が含められ、コンパイルが成功するようになります。これにより、NetBSD固有のエラーコードや定数をGoのzerrors_netbsd_*.go
ファイルに正確に自動生成できるようになります。
types_netbsd.go
からのディレクトリモードビットの削除 (src/pkg/syscall/types_netbsd.go
)
--- a/src/pkg/syscall/types_netbsd.go
+++ b/src/pkg/syscall/types_netbsd.go
@@ -97,23 +97,6 @@ type _Gid_t C.gid_t
// Files
-const ( // Directory mode bits
- S_IFMT = C.S_IFMT
- S_IFIFO = C.S_IFIFO
- S_IFCHR = C.S_IFCHR
- S_IFDIR = C.S_IFDIR
- S_IFBLK = C.S_IFBLK
- S_IFREG = C.S_IFREG
- S_IFLNK = C.S_IFLNK
- S_IFSOCK = C.S_IFSOCK
- S_ISUID = C.S_ISUID
- S_ISGID = C.S_ISGID
- S_ISVTX = C.S_ISVTX
- S_IRUSR = C.S_IRUSR
- S_IWUSR = C.S_IWUSR
- S_IXUSR = C.S_IXUSR
-)
-
type Stat_t C.struct_stat
type Statfs_t C.struct_statfs
この変更は、types_netbsd.go
ファイルから、ファイルモードに関連する定数(S_IFMT
など)の定義を削除するものです。コミットメッセージにあるように、これらの定数は既に自動生成されるzerrors_netbsd_*.go
ファイル内に存在しています。
Goのsyscall
パッケージでは、OS固有の定数をmkerrors.sh
やcgo -godefs
によって自動生成されるz*
ファイルに集約する方針が取られています。types_netbsd.go
にこれらの定数を手動で定義することは、以下の問題を引き起こす可能性があります。
- 冗長性: 同じ定数が複数の場所に定義されることになり、コードの重複が発生します。
- 不整合のリスク: OSのヘッダーファイルで定数値が変更された場合、手動で定義された
types_netbsd.go
の値を更新し忘れると、Goプログラムが誤った定数を使用する可能性があります。自動生成されたファイルであれば、スクリプトを再実行するだけで最新の定義が反映されます。
この削除により、コードベースのクリーンアップと、定数定義の一貫性および保守性の向上が図られます。
zerrors_netbsd_*.go
および ztypes_netbsd_*.go
の再生成
これらのファイルは、上記のmkerrors.sh
の修正とcgo
の動作改善の結果として再生成されました。差分を見ると、非常に多くの定数値の変更、追加、削除が行われていることがわかります。これは、NetBSDのシステムヘッダーファイルの内容が更新されたことを直接反映しています。
zerrors_netbsd_386.go
/zerrors_netbsd_amd64.go
:- ネットワーク関連の定数(
AF_
,DLT_
,IPPROTO_
など)や、ファイルシステム、プロセス、端末制御など、多岐にわたるシステム定数が更新されています。例えば、AF_BLUETOOTH
の値が変更されたり、新しいデータリンクタイプ(DLT_
)が追加されたりしています。 - エラーメッセージの文字列も、より正確な表現に修正されています。
- ネットワーク関連の定数(
ztypes_netbsd_386.go
/ztypes_netbsd_amd64.go
:Timespec
,Timeval
,Rusage
,Stat_t
などのC言語の構造体に対応するGoの型定義が更新されています。これらの構造体のフィールドの順序やサイズがOSの更新によって変更されることがあるため、cgo -godefs
によって正確なGoの型が生成されることが重要です。
これらの自動生成ファイルの更新は、Goのsyscall
パッケージがNetBSDの最新のシステムインターフェースと完全に同期していることを保証し、GoプログラムがNetBSD上で安定して動作するための基盤を提供します。
関連リンク
- Go言語の
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - Go言語の
cgo
のドキュメント: https://go.dev/blog/cgo - NetBSD公式サイト: https://www.netbsd.org/
参考にした情報源リンク
- Goの
syscall
パッケージにおけるmkerrors.sh
とz*
ファイルの役割に関する情報:- https://github.com/golang/go/blob/master/src/syscall/mkerrors.sh
- https://go.dev/src/syscall/zerrors_netbsd_arm.go (例として他のアーキテクチャのzerrorsファイル)
- https://go.dev/src/syscall/ztypes_netbsd_arm64.go (例として他のアーキテクチャのztypesファイル)
cgo -godefs
に関する情報:- Web検索結果から得られた情報(Goの
syscall
パッケージの生成プロセスに関する一般的な説明)- https://deuill.org/go-syscall-package-internals/
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFpfoATfFJSqfVjEck8EiquQFx2SZl8bJeVYQxgUmdcxp2Uz_JNc_-VGI5PfnSVaICJGUQ4vGqK85I9Fp-vskaEJ6JykOLvMXHbdcnHKaoM5qxcX_MSgYSNlyLNEpzPOWK85NRGUuoFqfb5bLF9Y0RAdw==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGXAE5lpfZJbrhTF9EpUmv3t04Scz-fYYQuSGQgv6NwHU7T-g3yAnSFqJAoVcGKAm9ar647j9d6X2ia-qRnp4UqS6ifhmbPIxC-AU6AXZBa2FvoRP3OwpCDY5Abo0sLZRYUXY-XGIo-KEazPmNxtH6OFpDVCc_TT2yJxgz4PH0q65V8aM7QZxmTLQdww29_SMAPTPnT-acvxlmfdbHs1VH3PoVBxtGt1iTppfMkxsOhrpJ7rVcZ3VSeh3Lk0oMzgVJJOz8LOuCWqhhPCBWdfnjSZAo=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFfgrGHFYccs8CpOCsXjzjvcLD4uPwb8yKG3visPZIaf_paMZtNcMHPiRSyYxS6G5Iaoa1eZCHWWQEeEQWVI5JXqYMa6GNz8XdIcVkOgBhNHD9b0o9aDOgQIT2LuII=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEypHFCWfJEI71hM2JnbZu1B3reOaikswryBquLHULr_8e25iIlA4Gbxd9hv69WbG6890BI39_c-NB9kZkdmaBYJzv1pwW1xcb0f199Mo_IPqCJ_vNq0Sv6Zgt3MVY5ec5tVF8uJCKtqOJMksYAQByhP4fqgJlSZwjq4Dk9qdvRKANOPcKexcyVM-AxYqUicwQGwKCcm7H0DSIsXe3TsXx2t8u2
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFduEvohDwr45Pry2O4zRys-BCyz_ymj6lZCVP-j9kgVk7xWHa4DSAZCZCU5OpAKKjwMuBkVG8Fyp5hXzneq23O8y1XEUye8Z32anHhd0uFQU_GI18srgOA96kYwWdaAIkJv0Td6st--vbtSkQ5B9OQkdQP5qXPW2SsxxnzztsEoeZj6Y3o1MzgN6dE
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE0BHMjUSTswTLpZqzElBCDEzbPgKHxFw-1Cs-khhF90RbB0b_KObOxjDmf572A6a2ao15gLgDq9Vp8ABkSguOEbJPHKj3Wd6fE2ougUghYQpJJ_RdvfMDmkHyjqzU8c-tjC5TWaRrbN38NRSJzCWVCnTyids6Qla_g33MTK5ITxgo-FmSTcg==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE6eW-OjQ5Ek7JFYgHuta4gt2jNDNK2XbxDedVWROelhAwfZi_8nHbXvVSGSIaViQsHJZeX_v3cdvlP8B1JMlefquFSiJDgHMipv1_VJH9bRDsRA7PixhbpOesrX-UmiZMyO1nJtFwWcTAzs-gcf_sOIIGU-_TpJypzkAGCvRpOeF1SGvHigG8Ya2JpmE5Uj4xaKaXInE11wnzOlToJAfRWQ2Q=