如何避免iOS二进制文件中的符号和源路径?

zmi*_*pie 8 c++ xcode symbols ios

当我编译我的iOS应用程序的发布版本(基于标准的Apple提供的iOS应用程序模板)时,查看生成的可执行二进制文件,我看到各种符号甚至本地cpp源文件和标题路径.我真的很难过为什么会这样(我没有启用RTTI*).特别是源文件路径让我感到不舒服在全球范围内发送这个应用程序(为什么每个人都能看到我的开发机器的目录布局?).

这是两个(随机选择,主持)摘录:

TS/../ACTORS/CActorCanvasCharPart.cpplastMeshcapVerticesOFF BOUNDSupload VERTICES: %d 20CActorCanvasCharPartgrassscrub/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.cppbaseShadowmowerstartmowerloopmowermowerCharcutGrassChargrassStuffgrassParticles/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.h17CStateGame2_grasssinwriteStroke/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_flowers.hflowerBedsandTrailclickstart3inplace2sandDrag/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame

以下是自定义类型和结构的许多符号:

CAssetMgr="_vptr$CMgrBase"^^?"pMain"^{CMain}"inited"B"curveCount"S"curveSpecs"^{CCurveSpec}"gameSpecs"[23{CGameStateSpec="header"{SpecDiskHeader="type"i"version"S}"gameID"C"backgroundColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointIconColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"hintColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}}]"currentFont"^{CCharset}"userCharParts"^^{CCharPart}"words"{CDataSet<CName4,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l}"sets"{CDataSet<CName16,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l

这可以避免,怎么样?

*更新:我刚发现RTTI默认开启.所以我清理了目标,禁用了RTTI(GCC_ENABLE_CPP_RTTI = NO)并重新编译.我仍然在二进制文件中看到很多符号和源路径.

更新2:我从应用程序商店检查了一些其他应用程序,其中许多也显示了他们的源文件路径.非常可怕,如果你问我:

Joined Up Lite
/Users/lloydy/Documents/Development/iPhone/ABC Joined Up/main.m
/Users/lloydy/Documents/Development/iPhone/ABC Joined Up/Classes/SettingsView.m

Crayon Physics
/Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/gameutils/killspriteslowly/killspriteslowly.cpp
/Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/tasks/task/sdl/mixer/ctaskaudiosdlmixer.cpp

Wall Times
/Users/fred/_WORK/ZDNDRP/WallTimes/main.m
/Users/fred/_WORK/ZDNDRP/WallTimes/Classes/SystemCategories.m

Jumbo Calculator
/Users/Christopher/Documents/Development/JumboCalculator 1.0.3/main.m
/Users/Christopher/Documents/Development/JumboCalculator 1.0.3/Classes/CalculatorFaceViewController.m

Wil*_*ith 6

文件路径很可能来自断言宏,__FILE__它们将其作为失败消息的一部分进行字符串化.iOS的实现assert(3)就像NSAssert宏一样.

您可以通过定义NDEBUG(对于C断言)和NS_BLOCK_ASSERTIONS(对于NSAsserts)来删除发布版本中的断言.


小智 5

在Xcode中,将Deployment Prostprocessing设置为Yes,以触发Xcode在构建过程中调用strip命令。然后,您不会通过nm -a看到任何源路径。

但是,我仍然通过字符串命令:/看到了一些m文件的源路径。


jba*_*100 1

是否在构建设置中勾选了条带调试符号?您可以执行此操作(或不执行此操作),具体取决于配置(构建/发布)。您还可以查看Objective-C 代码混淆(这是冗长的)。根据我收集的信息,您无法完全删除 Objective-C 信息,因为所有方法调用都是动态完成的,因此库必须拥有有关您的类/方法名称的信息才能正常运行。这里有一个有用的提示。

如果你有 C++ 代码,那么你可以使用gcc strip 实用程序,尽管我不确定它与 Objetive-C++ 有何相似之处,如果没有,你可以将所有 cpp 编译到一个 lib 中,剥离它并在你的iOS 项目。