如何静态 link 使用 crypto/tls 的 Go 二进制文件?

How to statically link a Go binary that uses crypto/tls?

如果您尝试编译以下 Go 程序:

package main

import _ "crypto/tls"

func main() {

}

您将得到一个动态链接的 Go 二进制文件。这对我来说很烦人(我正在 Docker 容器中构建一个 Go 二进制文件,它使用与我的主机不同的 libc,这将导致二进制文件在我的主机上不是 运行)。

如何force去静态构建这样一个程序?

唯一 OS crypto/tls 使用 cgo 的是 darwin,它需要调用 FetchPEMRoots 来获取根 CA。

你的程序使用 cgo 的原因是因为 crypto/tls 导入了 net 包,默认链接到主机解析器。您可以使用 "netgo" 构建标签构建 net 包而无需 cgo。

go build -tags netgo

或者,如果您使用的是默认不构建标准库包的发行版,您可以触发它们使用新的安装后缀进行编译

go build -installsuffix netgo -tags netgo

由于您不需要或没有能力在您的环境中使用 cgo,您可能只想使用 CGO_ENABLED=0 构建所有内容以完全禁用 cgo。