【问题标题】:How to statically link a Go binary that uses crypto/tls?如何静态链接使用 crypto/tls 的 Go 二进制文件?
【发布时间】:2016-04-22 17:58:03
【问题描述】:

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

package main

import _ "crypto/tls"

func main() {

}

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

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

【问题讨论】:

    标签: go static-linking


    【解决方案1】:

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

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

    go build -tags netgo
    

    或者,如果您在默认情况下不会构建 std lib 包的版本,您可以使用新的安装后缀触发它们进行编译

    go build -installsuffix netgo -tags netgo
    

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

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多