作家
登录

iOS编译过程的原理和应用

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

在XCode -> Build Settings -> 搜刮map -> 开启Write Link Map File 

开启后,在编译,我们可以在对应的Debug/Release目次下看到对应的link map的text文件。

预处理

clang是实际的编译敕令

默认的目次在

~/Library/Developer/Xcode/DerivedData/TARGET-NAME>-对应ID/Build/Intermediates/TARGET-NAME>.build/Debug-iphoneos/TARGET-NAME>.build/

例如,我的TargetName是EPlusPan4Phone,目次如下

/Users/huangwenchen/Library/Developer/Xcode/DerivedData/EPlusPan4Phone-eznmxzawtlhpmadnbyhafnpqpizo/Build/Intermediates/EPlusPan4Phone.build/Debug-iphonesimulator/EPlusPan4Phone.build

这个映射文件的重要包含以下部分:

这个部分包含的内容

– .a文件

– 须要link的framework

  1. #! Arch: x86_64 
  2. #Object files: 
  3. [0] linker synthesized 
  4. [1] /EPlusPan4Phone.build/EPlusPan4Phone.app.xcent 
  5. [2]/EPlusPan4Phone.build/Objects-normal/x86_64/ULWBigResponseButton.o 
  6. … 
  7. [1175]/UMSocial_Sdk_4.4/libUMSocial_Sdk_4.4.a(UMSocialJob.o) 
  8. [1188]/iPhoneSimulator10.1.sdk/System/Library/Frameworks//Foundation.framework/Foundation  

这个区域的存储内容比较简单:前面是文件的编号,后面是文件的路径。文件的编号在后续会用到

Sections

  • LLVM机械码生成器会针对不合的架构,比如arm64等生成不合的机械码。   

这个区域供给了各个段(Segment)和节(Section)在可履行文件中的地位和大年夜小。这个区域完全的描述克可履行文件中的全部内容。

个中,段分为两种

__TEXT 代码段

__DATA 数据段

例如,之前写的一个App,Sections区域如下,可以看到,代码段的

__text节的地址是0x1000021B0,大年夜小是0x0077EBC3,而二者相加的下一?地位正好是__stubs的地位0x100780D74。

  1. # Sections: 
  2. # 地位       大年夜小        段       节 
  3. # Address   Size        Segment Section 
  4. 0x1000021B0 0x0077EBC3  __TEXT  __text //代码 
  5. 0x100780D74 0x00000FD8  __TEXT  __stubs 
  6. 0x100781D4C 0x00001A50  __TEXT  __stub_helper 
  7. 0x1007837A0 0x0001AD78  __TEXT  __const //常量 
  8. 0x10079E518 0x00041EF7  __TEXT  __objc_methname //OC 办法名 
  9. 0x1007E040F 0x00006E34  __TEXT  __objc_classname //OC 类名 
  10. 0x1007E7243 0x00010498  __TEXT  __objc_methtype  //OC 办法类型 
  11. 0x1007F76DC 0x0000E760  __TEXT  __gcc_except_tab 
  12. 0x100805E40 0x00071693  __TEXT  __cstring  //字符串 
  13. 0x1008774D4 0x00004A9A  __TEXT  __ustring   
  14. 0x10087BF6E 0x00000149  __TEXT  __entitlements 
  15. 0x10087C0B8 0x0000D56C  __TEXT  __unwind_info 
  16. 0x100889628 0x000129C0  __TEXT  __eh_frame 
  17. 0x10089C000 0x00000010  __DATA  __nl_symbol_ptr 
  18. 0x10089C010 0x000012C8  __DATA  __got 
  19. 0x10089D2D8 0x00001520  __DATA  __la_symbol_ptr 
  20. 0x10089E7F8 0x00000038  __DATA  __mod_init_func 
  21. 0x10089E840 0x0003E140  __DATA  __const //常量 
  22. 0x1008DC980 0x0002D840  __DATA  __cfstring 
  23. 0x10090A1C0 0x000022D8  __DATA  __objc_classlist // OC 办法列表 
  24. 0x10090C498 0x00000010  __DATA  __objc_nlclslist 
  25. 0x10090C4A8 0x00000218  __DATA  __objc_catlist 

      推荐阅读

      在Node.js中看JavaScript的引用

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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