如何静态 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。
如果您尝试编译以下 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。