【问题标题】:Flags needed to create static binaries in golang在 golang 中创建静态二进制文件所需的标志
【发布时间】:2020-08-02 18:59:21
【问题描述】:

我正在使用scratch 作为基础构建 Docker 映像。

以下构建命令:

RUN go build -o /go/bin/myapp

创建了一个执行时一直失败的二进制文件:

standard_init_linux.go:211: exec user process caused "no such file or directory"

经过反复试验,我发现我需要构建如下:

RUN CGO_ENABLED=0 go build -o /go/bin/myapp -a -ldflags '-extldflags "-static"' . 

为什么CGO_ENABLED=0 -ldflags '-extldflags "-static"' 都需要?

这两个选项都不会创建静态二进制文件吗? (即,在它们将运行的环境中完全不需要任何库的二进制文件?)

【问题讨论】:

  • 有些系统并不真正允许完全静态的二进制文件。如果您使用系统提供的东西(例如名称解析),其他工作会更好。禁用 cgo 可确保不使用 C 代码,而 -static 指示链接器静态链接所有内容。

标签: go build compilation


【解决方案1】:

就在我们开始之前,Russ Cox 的提醒:Comment

也请阅读:Comment

是的,我同意 Volker 的评论,即某些系统实际上并不允许静态二进制文件。

继续阅读:Compile packages and dependencies

-a
    force rebuilding of packages that are already up-to-date.

-ldflags '[pattern=]arg list'
    arguments to pass on each go tool link invocation.

阅读:go tool link

-extldflags flags
    Set space-separated flags to pass to the external linker.

因此,它会尝试在禁用 CGO 的情况下重建所有包(以及依赖项),并且 -static 表示不链接到共享库。

关于静态链接的一些观点解释得很好:Linking golang statically

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2011-12-01
    • 2017-11-11
    相关资源
    最近更新 更多