上周我发布了Linux和windows版本的应用程序。剥离符号的最佳方式
在发布之后,我们意识到符号没有被剥离,我的经理认为(我不同意)它可能允许用户理解我们的算法。现在,我将不得不清理符号并重新发布应用程序。
我的问题,
- 什么是Linux的剥离符号的最佳方法?
- 在Windows中去除符号的最佳方式是什么?
上周我发布了Linux和windows版本的应用程序。剥离符号的最佳方式
在发布之后,我们意识到符号没有被剥离,我的经理认为(我不同意)它可能允许用户理解我们的算法。现在,我将不得不清理符号并重新发布应用程序。
我的问题,
在Windows上使用Visual C++(以及其他Microsoft编译器)时,符号不是二进制文件的一部分。相反,它们存储在称为“程序数据库”文件(.pdb文件)的单独文件中。只是不提供.pdb文件。
使用GNU工具链,您可以使用strip
从二进制文件中删除符号。
如果你有私人ms pdb的,并且想将它们转换为公共的,你可以将这个答案[私人公开](http://stackoverflow.com/questions/1525648/how-can-i-convert-private-pdb -to-公共PDB/1526031#1526031) – msh 2011-04-22 04:53:23
对于GNU工具链,存在手的很酷的花招:
objcopy --only-keep-debug yourprogram ../somepath/yourprogram.dbg
strip yourprogram
objcopy --add-gnu-debuglink=../somepath/yourprogram.dbg
现在你可以压缩你的程序所在的文件夹(或将其打包成一个安装程序或其他),就不会有更多的调试它中的符号。
但是:如果启动调试器或运行诸如addr2line
或obdump
之类的工具,该工具将(通过调试链接信息)自动知道在哪里找到符号并加载它们。
这真是太棒了,因为这意味着您拥有在您的终端上使用符号的好处,而无需将它们分发给用户。
我认为调试符号_could_可以帮助人们理解你的算法。如果他们在程序执行过程中的不同位置检查调用堆栈,并且他们可以看到描述性函数名称,那么... – 2011-04-22 00:40:40
根据应用程序的构建方式,剥离还可以减少大量应用程序占用空间(特别是如果你使用大量的静态库)!一般来说,剥离是您运送任何物品的好习惯。 – photoionized 2011-04-22 00:42:31