Symbols
Section部分将二进制文件进行了一级划分。而,Symbols对Section中的各个段进行了二级划分,
例如,对于__TEXT __text,表示代码段中的代码内容。
- 0x1000021B0 0x0077EBC3 __TEXT __text //代码
而对应的Symbols,肇端地址也是0x1000021B0。个中,文件编号和上文的编号对应
- [2]/EPlusPan4Phone.build/Objects-normal/x86_64/ULWBigResponseButton.o
具体内容如下
- # Symbols:
- 地址 大年夜小 文件编号 办法名
- # Address Size File Name
- 0x1000021B0 0x00000109 [ 2] -[ULWBigResponseButton pointInside:withEvent:]
- 0x1000022C0 0x00000080 [ 3] -[ULWCategoryController liveAPI]
- 0x100002340 0x00000080 [ 3] -[ULWCategoryController categories]
- ....
到这里,我们知道OC的办法是若何存储的,我们再来看看ivar是若何存储的。
起首找到数据栈中__DATA __objc_ivar
- 0x100A4A248 0x0000A500 __DATA __objc_ivar
然后,搜刮这个地址0x100A4A248,就能找到ivar的存储区域。
- 0x100A4A248 0x00000008 [ 3] _OBJC_IVAR_$_ULWCategoryController._liveAPI
值得一提的是,对于String,会显式的存储到数据段中,例如,
- 0x1008065C2 0x00000029 [ 11] literal string: http://sns.whalecloud.com/sina2/callback
所以,若不雅你的加密Key以明文的情势写在文件里,是一件很危险的工作。
dSYM 文件
我们在每次编译过后,都邑生成一个dsym文件。dsym文件中,存储了16进制的函数地址映射。
在App实际履行的二进制文件中,是经由过程地址来调用办法的。在App crash的时刻,第三方对象(Fabric,友盟等)会帮我们抓到崩溃的调用栈,调用栈里会包含crash地址的调用信息。然后,经由过程dSYM文件,我们就可以由地址映射到具体的函数地位。
XCode中,选择Window -> Organizer可以看到我们生成的archier文件
然后,
- 右键 -> 在finder中显示。
- 右键 -> 查看包内容。
关于若何用dsym文件来分析崩溃地位,可以查看我之前的一篇博客。
- iOS 若何调试第三方统计到的崩溃申报
那些你想到和想不到的应用处景
__attribute__
或多或少,你都邑在第三方库或者iOS的头文件中,见到过attribute。
比如
- __attribute__ ((warn_unused_result)) //如不雅没有应用返回值,编译的时刻给出警告
__attribtue__ 是一个高等的的编译器指令,它许可开辟者指定更更多的编译检查和一些高等的编译期优化。
推荐阅读
早期进修 Node.js 的时刻 (2011-2012),有挺多是大年夜 PHP 转过来的,当时有部分人对于 Node.js 编辑完代码须要重启一下表示麻烦(PHP不须要这个过程),于是社区里的同伙就开端倡导应用 >>>详细阅读
本文标题:iOS编译过程的原理和应用
地址:http://www.17bianji.com/lsqh/34703.html
1/2 1