通过ldflags选项传入go命令时w标志的含义是什么?

时间:2014-03-08 08:50:24

标签: go

背景:

  

去1.2,ubuntu 12.10

目标:

  

减少已编译二进制文件的大小

目前在我的构建过程中,我运行“go install”来生成二进制文件。 我从某个地方读到,如果我传入-w,它将收缩二进制文件。 我通过将其传递到-ldflags选项&我的二进制文件大小减少了1MB。

  1. 这个-w标志是否记录在任何地方?它实际上做了什么?
  2. 然后我发现了strip -s <binary>命令并在-w之上运行了该命令并得到了 另一个减重750KB!生成的二进制文件运行正常剥离 在任何情况下都会引起问题?

4 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分: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信息,则应在OS X上使用dwarfdump -a,在Linux上使用objdump -wg。警告!输出将很长很长。

答案 2 :(得分:1)

您可以从go tool link

获得帮助
$ go tool link
  ...
  -s    disable symbol table
  -w    disable DWARF generation

答案 3 :(得分:0)

我担心可能导致使用Go 1.2的gc工具套件编译的程序出现问题 - 请参阅this discussion

一般的想法是,虽然Go像C一样编译为机器代码,但它比C更高级。例如,它具有内置的详细panic()堆栈跟踪,这取决于调试信息。 gc生成的二进制文件的大小确实可以更小,it might be addresseed while cooking Go 1.3,但是在当今大多数环境中,编译程序的大小实际上并不是太过关注的大问题。