剥离符号的最佳方法

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

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

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

我的问题,

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

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

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

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

 objcopy --only-keep-debug yourprogram ../somepath/yourprogram.dbg strip yourprogram objcopy --add-gnu-debuglink=../somepath/yourprogram.dbg yourprogram 

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

这真是太棒了,因为这意味着你可以在你的头上拥有符号,而不必将它们分发给用户。