【问题标题】:Exclude specific symbols from dSYM从 dSYM 中排除特定符号
【发布时间】:2014-07-10 18:33:19
【问题描述】:

我正在构建一个 iOS 项目,其中包含一个我希望从产品的 .dSYM DWARF 文件中排除其符号的子项目。

情况是子项目(一个静态库)包含有价值的专有代码,我不希望攻击者能够对其进行符号化,即使他们拥有用于重新符号化整个应用程序崩溃报告的 dSYM 文件。该子项目涵盖了一个非常具体的领域,并且经过了独立测试,因此我不担心无法在该代码中重新符号化堆栈跟踪。但是,我确实需要能够为应用程序的其余部分重新符号化崩溃报告,所以我需要一个 dSYM(因为与应用程序一起分发符号不是一种选择)。

我已经设法确保从二进制文件中删除所有相关符号,并且设置 GCC_GENERATE_DEBUGGING_SYMBOLS=NO 从 dSYM 中删除了很多内容,但我仍然在 dSYM 中看到类私有 C++ 方法名称文件。作为参考,我正在使用clang。

如何在不影响该子项目符号的情况下为我的应用生成 dSYM?

【问题讨论】:

    标签: xcode symbols llvm-clang dwarf dsym


    【解决方案1】:

    对于标准的 Xcode 工作流程,这可能会很困难。您可能可以使用 shell 脚本阶段执行某些操作,将静态库移动到不同的文件名(“隐藏”它),然后在主应用程序二进制文件上运行 dsymutil 以创建 dSYM。因为dsymutil 找不到静态库,所以它不能包含这些函数的任何调试信息。或者,您可以创建静态库的无调试信息版本,尽管这将需要更多的脚本。静态库实际上是对象 (.o) 文件的 zip 文件——您需要创建一个目录,提取 .o 文件 (ar x mylib.a),剥离 .o 文件,然后创建一个新的静态库(ar q mylib-nodebuginfo.a *.o 我认为)并在运行 dsymutil 之前将其落实到位。

    不过,我不知道如何在 dSYM 创建后选择性地删除调试信息。这是可能的,但我认为没有人编写过这样的工具。

    【讨论】:

    • 子项目静态库中的调试符号如何传播到整个应用程序的 dSYM 中?似乎这可以通过链接静态库来完成,就好像它是我没有调试符号的第 3 方库一样,但也许我没有正确理解流程。
    • 调试信息位于 .o 文件中。静态库(“ranlib 库”)是 .o 文件的集合。主应用程序具有指向 .o 文件的指针(文件名)。当您在应用程序上运行 dsymutil 时,它会按照这些文件名获取所有调试信息,并将它们收集到 dSYM 包中。
    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多