背景:
去1.2,ubuntu 12.10
目标:
减少已编译二进制文件的大小
目前在我的构建过程中,我运行“go install”来生成二进制文件。
我从某个地方读到,如果我传入-w
,它将收缩二进制文件。
我通过将其传递到-ldflags
选项&我的二进制文件大小减少了1MB。
-w
标志是否记录在任何地方?它实际上做了什么?strip -s <binary>
命令并在-w
之上运行了该命令并得到了
另一个减重750KB!生成的二进制文件运行正常剥离
在任何情况下都会引起问题?答案 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,但是在当今大多数环境中,编译程序的大小实际上并不是太过关注的大问题。