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

can*_*dry 11 go

语境:

去1.2,ubuntu 12.10

目标:

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

目前在我的构建过程中,我运行"go install"来生成二进制文件.我从某个地方读到,如果我传入-w它会收缩二进制文件.我尝试将它传递给-ldflags选项&我的二进制文件丢失了1MB的大小.

  1. 这个-w标志记录在哪里吗?它实际上做了什么?
  2. 然后我发现了这个strip -s <binary>命令,然后在上面运行-w了另一个减重750KB!生成的二进制文件运行正常 剥离会在任何情况下造成问题吗?

Rus*_*Cox 24

如果使用-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 - 应该影响实际程序的执行.它们只影响您是否可以使用其他工具调试或分析程序.


Kav*_*avu 8

这样go help build

-ldflags 'flag list'
    arguments to pass on each 5l, 6l, or 8l linker invocation. 
Run Code Online (Sandbox Code Playgroud)

因此,我们可以调用go tool 6l以查看所有选项.其中之一是

-w  disable DWARF generation 
Run Code Online (Sandbox Code Playgroud)

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

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


Sub*_*Sub 8

你可以从 go tool link

$ go tool link
  ...
  -s    disable symbol table
  -w    disable DWARF generation
Run Code Online (Sandbox Code Playgroud)