从dSYM中排除特定符号

时间:2014-05-21 22:07:14

标签: xcode symbols llvm-clang dwarf dsym

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我知道,一旦创建了dSYM,就无法有选择地从{{1}}删除调试信息。这是可能的,但我认为没有人写过这样的工具。