为了账号安全,请及时绑定邮箱和手机立即绑定

通过 ldflags 选项传入 go 命令时 w 标志是什么意思?

通过 ldflags 选项传入 go 命令时 w 标志是什么意思?

Go
米琪卡哇伊 2021-07-30 13:01:06
语境:转到 1.2,Ubuntu 12.10目标:减少已编译二进制文件的大小目前在我的构建过程中,我运行“go install”来生成二进制文件。我从某处读到,如果我传入-w它将缩小二进制文件。我通过将它传递到-ldflags选项中进行了尝试,我的二进制文件大小丢失了 1MB。这个-w标志在任何地方都有记录吗?它实际上有什么作用?然后我发现了这个strip -s <binary>命令并在上面运行它,-w然后又减少了 750KB!生成的二进制文件运行良好。剥离在任何情况下都会引起问题吗?
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

如果使用 -ldflags '-w -s' 编译,您将获得最小的二进制文件。-w 关闭 DWARF 调试信息:您将无法在二进制文件上使用 gdb 来查看特定函数或设置断点或获取堆栈跟踪,因为将不包括 gdb 需要的所有元数据。您也将无法使用依赖于信息的其他工具,例如 pprof 分析。-s 关闭 Go 符号表的生成:您将无法使用“go tool nm”来列出二进制文件中的符号。Strip -s 就像将 -s 传递给 -ldflags 一样,但它并没有剥离那么多。在 'strip -s' 之后,'Go tool nm' 可能仍然有效。我不完全确定。

这些 - 不是 -ldflags -w,不是 -ldflags -s,不是 strip -s - 都不会影响实际程序的执行。它们仅影响您是否可以使用其他工具调试或分析程序。


查看完整回答
反对 回复 2021-08-02
?
largeQ

TA贡献2039条经验 获得超7个赞

go help build

-ldflags 'flag list'
    arguments to pass on each 5l, 6l, or 8l linker invocation.

所以,我们可以调用go tool 6l来查看它的所有选项。其中之一是

-w  disable DWARF generation

顺便说一下,5l代表ARM ( $GOARCH = arm),6l代表x86-64 ( $GOARCH = amd64),8l代表x86 ( $GOARCH = 386)。

如果你真的想查看原始DWARF信息,你应该dwarfdump -a在 OS X 和objdump -wgLinux 上使用。警告!输出会很长,很长。


查看完整回答
反对 回复 2021-08-02
?
喵喔喔

TA贡献1735条经验 获得超5个赞

你可以从 go tool link

$ go tool link
  ...
  -s    disable symbol table
  -w    disable DWARF generation


查看完整回答
反对 回复 2021-08-02
  • 3 回答
  • 0 关注
  • 437 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信