剥离符号的最佳方法

Alp*_*neo 19 c c++ gcc symbols visual-c++

上周我发布了应用程序的Linux和Windows版本.

在发布之后,我们意识到符号没有被剥离,我的经理认为(我不同意)它可能允许用户理解我们的算法.

无论如何,现在,我将不得不清理符号并重新发布应用程序.

我的问题,

  1. 在Linux中删除符号的最佳方法是什么?
  2. 在Windows中删除符号的最佳方法是什么?

Jam*_*lis 24

使用Windows上的Visual C++(和其他Microsoft编译器),符号不是二进制文件的一部分.相反,它们存储在称为"程序数据库"文件(.pdb文件)的单独文件中.只是不提供.pdb文件.

使用GNU工具链,您将使用strip从二进制文件中删除符号.

  • 如果你有私人ms pdb并希望将它们转换为公共的,你可以解答这个答案[私人公开](http://stackoverflow.com/questions/1525648/how-can-i-convert-private-pdb-对公共PDB/1526031#1526031) (3认同)

Dam*_*mon 18

对于GNU工具链,存在一个很酷的手法:

objcopy --only-keep-debug yourprogram ../somepath/yourprogram.dbg
strip yourprogram
objcopy --add-gnu-debuglink=../somepath/yourprogram.dbg yourprogram
Run Code Online (Sandbox Code Playgroud)

现在您可以压缩程序所在的文件夹(或将其打包到安装程序或其他任何程序),其中不再有调试符号.
但是:如果您启动调试器或运行类似addr2lineobdump的工具,该工具将(由于调试链接信息)自动知道在哪里找到符号并加载它们.

哪个很棒,因为这意味着你可以在你的头上使用符号,而不必将它们分发给用户.