避免在golang上调试信息

dv1*_*729 14 go

我认为gc默认包含调试信息.但是,我想避免反编译.

在使用gc编译go代码时如何删除调试信息?

注意:使用gccgo无法解决问题.如果我不使用'-g'编译,则可执行文件被破坏并且只输出:

ELF可执行文件中没有调试信息错误-1致命错误:ELF可执行文件中没有调试信息

运行时堆栈:在恐慌期间ELF可执行程序中没有调试信息errno -1恐慌"

sna*_*nap 10

go链接器有一个标志-w,用于禁用DWARF调试信息的生成.您可以提供链接器标志以执行工具构建命令,如下所示:

go build -ldflags '-w'
Run Code Online (Sandbox Code Playgroud)

Linux/Unix平台上的另一种方法是strip对编译的二进制文件使用命令.这似乎比上面的链接器选项产生更小的二进制文件.

  • Go团队不推荐使用Strip,它可能会破坏可执行文件.最好使用`go build -ldflags'-s'`来省略符号表,但是我不确定你是否可以完全隐藏每个符号名称. (7认同)
  • Go运行时可能需要的任何信息仍保留在二进制文件中.这包括恐慌消息,类型信息等所需的信息.我不知道有任何剥离方法.这与纯调试信息不​​同. (4认同)

Tom*_*mas 9

我推荐使用-ldflags="-s -w"which 删除符号表和调试信息。

作为 Go 1.13 的奖励,-trimpath用于减少存储在文件中的文件路径的长度