Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过ldflags选项传入go命令时,w标志意味着什么?_Go - Fatal编程技术网

通过ldflags选项传入go命令时,w标志意味着什么?

通过ldflags选项传入go命令时,w标志意味着什么?,go,Go,背景: go 1.2,ubuntu 12.10 目标: 减少已编译二进制文件的大小 目前在我的构建过程中,我运行“go install”来生成二进制文件。 我从某处读到,如果我传入-w,它将收缩二进制文件。 我尝试将其传递到-ldflags选项中&我的二进制文件丢失了1MB大小 此-w标志是否记录在任何地方?它实际上做什么 然后我发现了strip-s命令,并在-w上运行该命令,得到了 又一次减重750KB!生成的二进制文件运行良好。脱衣舞 在任何情况下都会导致问题 go-help-build中说

背景:

go 1.2,ubuntu 12.10

目标:

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

目前在我的构建过程中,我运行“go install”来生成二进制文件。 我从某处读到,如果我传入
-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中到底是什么更改修复了这个问题,但如果符号被剥离,某些操作(例如使用运行时包询问函数指针的名称)会导致程序崩溃。