2011-04-22 94 views
15

上周我发布了Linux和windows版本的应用程序。剥离符号的最佳方式

在发布之后,我们意识到符号没有被剥离,我的经理认为(我不同意)它可能允许用户理解我们的算法。现在,我将不得不清理符号并重新发布应用程序。

我的问题,

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

我认为调试符号_could_可以帮助人们理解你的算法。如果他们在程序执行过程中的不同位置检查调用堆栈,并且他们可以看到描述性函数名称,那么... – 2011-04-22 00:40:40

+0

根据应用程序的构建方式,剥离还可以减少大量应用程序占用空间(特别是如果你使用大量的静态库)!一般来说,剥离是您运送任何物品的好习惯。 – photoionized 2011-04-22 00:42:31

回答

21

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

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

+2

如果你有私人ms pdb的,并且想将它们转换为公共的,你可以将这个答案[私人公开](http://stackoverflow.com/questions/1525648/how-can-i-convert-private-pdb -to-公共PDB/1526031#1526031) – msh 2011-04-22 04:53:23

13

对于GNU工具链,存在手的很酷的花招:

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

现在你可以压缩你的程序所在的文件夹(或将其打包成一个安装程序或其他),就不会有更多的调试它中的符号。
但是:如果启动调试器或运行诸如addr2lineobdump之类的工具,该工具将(通过调试链接信息)自动知道在哪里找到符号并加载它们。

这真是太棒了,因为这意味着您拥有在您的终端上使用符号的好处,而无需将它们分发给用户。