作家
登录

iOS编译过程的原理和应用

作者: 来源: 2017-04-11 09:44:33 阅读 我要评论

  • 0x10090C6C0 0x00000008  __DATA  __objc_nlcatlist 
  • 0x10090C6C8 0x00000510  __DATA  __objc_protolist // OC协定列表 
  • 0x10090CBD8 0x00000008  __DATA  __objc_imageinfo 
  • 0x10090CBE0 0x00129280  __DATA  __objc_const // OC 常量 
  • 0x100A35E60 0x00010908  __DATA  __objc_selrefs 
  • 0x100A46768 0x00000038  __DATA  __objc_protorefs 
  • 0x100A467A0 0x000020E8  __DATA  __objc_classrefs 
  • 0x100A48888 0x000019C0  __DATA  __objc_superrefs // OC 父类引用 
  • 0x100A4A248 0x0000A500  __DATA  __objc_ivar // OC iar 
  • 0x100A54748 0x00015CC0  __DATA  __objc_data 
  • 0x100A6A420 0x00007A30  __DATA  __data 
  • 0x100A71E60 0x0005AF70  __DATA  __bss 
  • 0x100ACCDE0 0x00053A4C  __DATA  __common  
  • Symbols

    Section部分将二进制文件进行了一级划分。而,Symbols对Section中的各个段进行了二级划分,

    例如,对于__TEXT __text,表示代码段中的代码内容。

    1. 0x1000021B0 0x0077EBC3 __TEXT __text //代码 

    而对应的Symbols,肇端地址也是0x1000021B0。个中,文件编号和上文的编号对应

    1. [2]/EPlusPan4Phone.build/Objects-normal/x86_64/ULWBigResponseButton.o 

    具体内容如下

    1. # Symbols: 
    2.   地址     大年夜小          文件编号    办法名 
    3. # Address   Size        File       Name 
    4. 0x1000021B0 0x00000109  [  2]     -[ULWBigResponseButton pointInside:withEvent:] 
    5. 0x1000022C0 0x00000080  [  3]     -[ULWCategoryController liveAPI] 
    6. 0x100002340 0x00000080  [  3]     -[ULWCategoryController categories] 
    7. ....  

    到这里,我们知道OC的办法是若何存储的,我们再来看看ivar是若何存储的。

    起首找到数据栈中__DATA __objc_ivar

    1. 0x100A4A248 0x0000A500 __DATA __objc_ivar 

    然后,搜刮这个地址0x100A4A248,就能找到ivar的存储区域。

    1. 0x100A4A248 0x00000008 [ 3] _OBJC_IVAR_$_ULWCategoryController._liveAPI 

    值得一提的是,对于String,会显式的存储到数据段中,例如,

    1. 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。

    比如

    1. __attribute__ ((warn_unused_result)) //如不雅没有应用返回值,编译的时刻给出警告 

    __attribtue__ 是一个高等的的编译器指令,它许可开辟者指定更更多的编译检查和一些高等的编译期优化。


      推荐阅读

      在Node.js中看JavaScript的引用

    早期进修 Node.js 的时刻 (2011-2012),有挺多是大年夜 PHP 转过来的,当时有部分人对于 Node.js 编辑完代码须要重启一下表示麻烦(PHP不须要这个过程),于是社区里的同伙就开端倡导应用 >>>详细阅读


    本文标题:iOS编译过程的原理和应用

    地址:http://www.17bianji.com/lsqh/34703.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)