この投稿では、DevboxでGo 1.25を使用した際に発生したリンカーエラーと、その解決方法について解説します。macOS環境でGoプログラムをビルドしようとして、Undefined symbols for architecture arm64というエラーに遭遇した方の参考になれば幸いです。
この投稿で知れること
- Devbox + Go 1.25で発生する具体的なエラー内容
- Apple SDKパッケージを追加することでエラーを解決する方法
- エラーの原因となっているシンボル不足の背景
発生したエラー
Go 1.25の環境でgo runを実行したところ、次のようなリンカーエラーが発生しました。
go run cmd/main.go
# command-line-arguments
/nix/store/.../link: running clang failed: exit status 1
Undefined symbols for architecture arm64:
"_SecTrustCopyCertificateChain", referenced from:
_crypto/x509/internal/macos.x509_SecTrustCopyCertificateChain_trampoline.abi0 in go.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
エラーメッセージを見ると、_SecTrustCopyCertificateChainというシンボルが見つからないことが原因のようです。これは、macOSのSecurityフレームワークに関連する関数で、Go標準ライブラリのcrypto/x509パッケージが内部で使用しているものです。
解決方法
この問題は、Apple SDKパッケージをDevbox環境に追加することで解決できます。
手順1: 利用可能なApple SDKを検索する
まず、どのバージョンのApple SDKが利用可能かを確認します。
devbox search apple-sdk
検索結果には、複数のバージョンが表示されます。
Found 11+ results for "apple-sdk":
* apple-sdk (14.4, 11.3, 10.12.2)
* apple-sdk_11 (11.3)
* apple-sdk_12 (12.3)
* apple-sdk_13 (13.3)
* apple-sdk_14 (14.4)
* apple-sdk_15 (15.5, 15.2, 15.0)
...
手順2: Apple SDKパッケージを追加する
検索結果から適切なバージョンを選んで追加します。今回はapple-sdk_15を追加しました。
devbox add apple-sdk_15
実行すると、次のような出力が表示されます。
Info: Adding package "apple-sdk_15@latest" to devbox.json
Info: Installing the following packages to the nix store: apple-sdk_15@latest
✓ Computed the Devbox environment.
手順3: ビルドを再実行する
Apple SDKを追加した後、再度go runを実行すると、今度は正常に動作します。
go run cmd/main.go
Hello world
エラーが解消され、プログラムが無事に実行できました。
なぜこの方法で解決するのか?
Go 1.25では、macOS環境でのビルド時に、より新しいmacOS APIへの依存が追加されたようです。_SecTrustCopyCertificateChainは、macOSのSecurityフレームワークに含まれる関数で、TLS証明書の検証などに使用されます。
Devboxは、Nixパッケージマネージャーを基盤としているため、必要なシステムライブラリやSDKを明示的にパッケージとして追加する必要があります。Apple SDKパッケージを追加することで、リンカーが必要なシンボルを見つけられるようになり、ビルドが成功するというわけです。
どのバージョンのApple SDKを選ぶべきか?
基本的には、使用しているmacOSのバージョンに合わせたSDKを選ぶのが無難です。今回はapple-sdk_15を選びましたが、環境によってはapple-sdk_14や他のバージョンでも動作する可能性があります。
もし特定のバージョンで問題が発生した場合は、別のバージョンを試してみるとよいでしょう。
参考情報
この問題の解決方法は、以下のGitHub issueのコメントを参考にしました。
同様の問題に遭遇している方も多いようなので、コミュニティの情報は貴重ですね。
おわりに
この投稿では、Devbox環境でGo 1.25を使用した際に発生したリンカーエラーと、Apple SDKパッケージを追加することでの解決方法を紹介しました。macOS環境でのGoビルドにおいて、システムフレームワークへの依存が原因でエラーが発生することがあるということを覚えておくと、今後のトラブルシューティングに役立つかもしれません。
最後までお読みくださりありがとうございました。Twitter では、Qiita に書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいです
→Twitter@suin