【问题标题】:Best way to strip off symbols剥离符号的最佳方法
【发布时间】:2011-08-10 17:00:30
【问题描述】:

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

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

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

我的问题,

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

【问题讨论】:

  • 我认为调试符号可以帮助人们理解你的算法。如果他们在程序执行的各个点检查调用堆栈,并且可以看到描述性的函数名称,那么...
  • 根据您的应用程序的构建方式,剥离还可以大大减少您的应用程序占用空间(尤其是如果您使用大量静态库)!一般来说,剥离对于您运送的任何东西都是一种很好的做法。

标签: c++ c visual-c++ gcc symbols


【解决方案1】:

对于 GNU 工具链,有一个很酷的花招:

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

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

这太棒了,因为这意味着您可以在末端拥有符号,而无需将它们分发给用户。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果您有私有的 ms pdb 并希望将它们转换为公共的,您可以查看此答案 private to public
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2010-10-04
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多