通过ldflags选项传入go命令时,w标志意味着什么?
背景: go 1.2,ubuntu 12.10 目标: 减少已编译二进制文件的大小 目前在我的构建过程中,我运行“go install”来生成二进制文件。 我从某处读到,如果我传入通过ldflags选项传入go命令时,w标志意味着什么?,go,Go,背景: go 1.2,ubuntu 12.10 目标: 减少已编译二进制文件的大小 目前在我的构建过程中,我运行“go install”来生成二进制文件。 我从某处读到,如果我传入-w,它将收缩二进制文件。 我尝试将其传递到-ldflags选项中&我的二进制文件丢失了1MB大小 此-w标志是否记录在任何地方?它实际上做什么 然后我发现了strip-s命令,并在-w上运行该命令,得到了 又一次减重750KB!生成的二进制文件运行良好。脱衣舞 在任何情况下都会导致问题 go-help-build中说
-w
,它将收缩二进制文件。
我尝试将其传递到-ldflags
选项中&我的二进制文件丢失了1MB大小
-w
标志是否记录在任何地方?它实际上做什么strip-s
命令,并在-w
上运行该命令,得到了
又一次减重750KB!生成的二进制文件运行良好。脱衣舞
在任何情况下都会导致问题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
)
如果你真的想查看原始信息,你应该在OSX上使用dwarfdump-a
,在Linux上使用objdump-wg
。警告输出将非常长。我担心这可能会导致使用Go 1.2的gc
工具套件编译的程序出现问题
一般的想法是,虽然Go像C一样向下编译机器代码,但它的级别比C更高。例如,它有内置的详细的
panic()
堆栈跟踪,这些跟踪依赖于调试信息。gc生成的二进制文件的大小确实可以更小,但在当今大多数环境中,编译程序的大小并不是一个太大的问题。如果使用-ldflags'-w-s'编译,您将得到最小的二进制文件。w关闭DWARF调试信息:您将无法在二进制文件上使用gdb查看特定函数、设置断点或获取堆栈跟踪,因为gdb所需的所有元数据都将不包括在内。您也将无法使用依赖于该信息的其他工具,如pprof分析。-s关闭Go符号表的生成:您将无法使用“Go tool nm”在二进制文件中列出符号。Strip-s类似于将-s传递给-ldflags,但它并没有剥离那么多Go tool nm在“strip-s”之后可能仍然有效。我不能完全肯定
这些-not-ldflags-w、not-ldflags-s、not-strip-s都不应该影响实际程序的执行。它们只影响您是否可以使用其他工具调试或分析程序。您可以从
go-tool-link
$ go tool link
...
-s disable symbol table
-w disable DWARF generation
请注意,如果您运行的是1.2之前的版本,剥离符号实际上可能会导致程序行为异常。我不记得1.2中到底是什么更改修复了这个问题,但如果符号被剥离,某些操作(例如使用运行时包询问函数指针的名称)会导致程序崩溃。