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

cyp*_*har 6 go static-linking

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

package main

import _ "crypto/tls"

func main() {

}
Run Code Online (Sandbox Code Playgroud)

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

一个人如何转到静态建立这样一个计划?

Jim*_*imB 8

crypto/tls使用cgo 的唯一操作系统是darwin,它需要调用FetchPEMRoots以获取根CA.

程序使用cgo的原因是crypto/tls导入net包,默认情况下链接到主机解析程序.您可以net使用"netgo"构建标记构建不使用cgo 的包.

go build -tags netgo
Run Code Online (Sandbox Code Playgroud)

或者,如果您处于默认情况下不会构建std lib包的版本中,则可以触发它们使用新的installsuffix进行编译

go build -installsuffix netgo -tags netgo
Run Code Online (Sandbox Code Playgroud)

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