iOS--编译连接的过程_2

这篇具有很好参考价值的文章主要介绍了iOS--编译连接的过程_2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一般可以将编程语言分为两种,编译语言和直译式语言。

像C++,Objective C都是编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高。

像JavaScript,Python都是直译式语言。直译式语言不需要经过编译的过程,而是在执行的时候通过一个中间的解释器将代码解释为CPU可以执行的代码。所以,较编译语言来说,直译式语言效率低一些,但是编写的更灵活

iOS编译

Objective C采用Clang(swift采用swiftc)作为编译器前端,LLVM作为编译器后端。

简单的编译过程如图
iOS--编译连接的过程_2,ios

(一)编译器前端

编译器前端的任务是进行:词法分析,语法分析,语义分析,生成中间代码(intermediate representation )。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。
iOS--编译连接的过程_2,ios

编译器后端

编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。iOS的编译过程,后端的处理如下

  • LVVM优化器会进行BitCode的生成,链接期优化等等

  • iOS--编译连接的过程_2,ios

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

  • iOS--编译连接的过程_2,ios

执行一次XCode build的流程

当你在XCode中,选择build的时候(快捷键command+B),会执行如下过程

编译信息写入辅助文件,创建编译后的文件架构(name.app)
处理文件打包信息,例如在debug环境下

Entitlements:
{
“application-identifier” = “app的bundleid”;
“aps-environment” = development;
}

执行CocoaPod编译前脚本
例如对于使用CocoaPod的工程会执行CheckPods Manifest.lock
编译各个.m文件,使用CompileC和clang命令。

CompileC ClassName.o ClassName.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
export LANG=en_US.US-ASCII
export PATH=“…”
clang -x objective-c -arch x86_64 -fmessage-length=0 -fobjc-arc… -Wno-missing-field-initializers … -DDEBUG=1 … -isysroot iPhoneSimulator10.1.sdk -fasm-blocks … -I 上文提到的文件 -F 所需要的Framework -iquote 所需要的Framework … -c ClassName.c -o ClassName.o

通过这个编译的命令,我们可以看到

clang是实际的编译命令
-x objective-c 指定了编译的语言
-arch x86_64制定了编译的架构,类似还有arm7等
-fobjc-arc 一些列-f开头的,指定了采用arc等信息。这个也就是为什么你可以对单独的一个.m文件采用非ARC编程。
-Wno-missing-field-initializers 一系列以-W开头的,指的是编译的警告选项,通过这些你可以定制化编译选项
-DDEBUG=1 一些列-D开头的,指的是预编译宏,通过这些宏可以实现条件编译
-iPhoneSimulator10.1.sdk 制定了编译采用的iOS SDK版本
-I 把编译信息写入指定的辅助文件
-F 链接所需要的Framework
-c ClassName.c 编译文件
-o ClassName.o 编译产物

  • 链接需要的Framework,例如Foundation.framework,AFNetworking.framework,ALiPay.fframework
  • 编译xib文件
  • 拷贝xib,图片等资源文件到结果目录
  • 编译ImageAssets
  • 处理info.plist
  • 执行CocoaPod脚本
  • 拷贝Swift标准库
  • 创建.app文件和对其签名

IPA包的内容

例如,我们通过iTunes Store下载微信,然后获得ipa安装包,然后实际看看其安装包的内容。
iOS--编译连接的过程_2,ios

二进制文件的内容

通过XCode的Link Map File,我们可以窥探二进制文件中布局。 在XCode -> Build Settings -> 搜索map -> 开启Write Link Map File
![

iOS Link Map File文件说明

1. Link Map File 是什么

Link Map File 直译为 链接映射文件,是 Xcode 生成可执行文件时一起生成的文本,用于记录链接相关信息。

可执行文件的路径
CPU架构
.o目标路径
方法符号

2. Link Map File 有什么用

查看代码加载顺序
理解内存分段分区
Crash 时通过 Symbols 定位源码的机制
分析可执行文件中类或库体积,优化包体积

3. 生成 Link Map File

Xcode 在生成可执行文件的时候默认情况下不生成该文件。 在Xcode的配置中 Target -> Build Setting -> Linking 将Write Link Map File设置为YES来生成Link Map File,运行代码即可生成Link Map FileiOS--编译连接的过程_2,ios

查看Link Map File

主要分为三个部分

  • 路径部分,展示生成的相关文件路径
  • Section部分,展示相关地址段
  • Symbols部分,方法符号段
1)路径部分
  • Path是.app文件路径
  • Object files是.o文件路径
  • iOS--编译连接的过程_2,ios
计算机系统知识

a. text 段
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。

在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

b. data 段

数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。

c. bss 段

bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

bss是英文Block Started by Symbol的简称。

d. 堆(heap)

堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);

当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。

e. 栈(stack)

栈又称堆栈,是用户存放程序临时创建的局部变量,

也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。

除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。

由于栈的先进先出(FIFO)特点,所以栈特别方便用来保存/恢复调用现场。

从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

(3)Section 部分

Mach-O 文件中的虚拟地址最终会映射到物理地址上。这些地址被分成不同的Segement: TEXT段、DATA段、__LINKEDIT段。

__TEXT 包含 Mach header,被执行的代码和只读常量(如C 字符串),只读可执行(r-x)。
__DATA 包含全局变量,静态变量等,可读写(rw-)。
__LINKEDIT 包含了加载程序的元数据,比如函数的名称和地址,只读(r–)。

Segement 划分成了不同的 Section,不同的 Section 存储着不同的信息,下面是一些常用的 Section 的介绍。

a. __TEXT段中的 Section

iOS--编译连接的过程_2,ios

b. __DATA段中的 Section

iOS--编译连接的过程_2,ios
iOS--编译连接的过程_2,ios

(4) Symbols 部分
  • Address:方法代码的地址
  • Size:方法占用的空间
  • File:文件的编号
  • Name:.o文件里面的方法符号
(5)二进制重排

二进制重排 就是要重新排列这些 方法符号的顺序 ,中心思想就是把启动用到的代码挪到前面的位置加载!文章来源地址https://www.toymoban.com/news/detail-602845.html

到了这里,关于iOS--编译连接的过程_2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【iOS】—— 编译链接

    编译流程分为四步 预处理(Prepressing) 编译(Compilation) 汇编(Assembly) 链接(Linking) 作为编译的第一步,首先将 main.m 文件编译成了 main.i 文件,指令如下: 预处理的过程虽然是将main.m文件编译成了mian.i文件,但是实际上的过程并不是这么简单的,那么具体的预编译情况

    2024年02月16日
    浏览(34)
  • 【iOS】编译与链接

    计算机语言分为机器语言、汇编语言和高级语言。 可以将高级语言分为两种:编译语言和解释型语言(直译式语言)。 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行, 即解释一条代码,执行一条代码 。 优点:可移植好,因为只需要各种系

    2024年02月17日
    浏览(39)
  • WebRTC 源码 编译 iOS端

    1. 获取依赖工具 首先,确保你已经安装了以下工具: Git Depot Tools Xcode(确保已安装命令行工具) 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中: /path/to/depot_tools 替换为自己的路径 3. 获取 WebRTC 源码 创建一个新目录来存放 WebRTC 源码,并在其中检出源码:

    2024年02月09日
    浏览(43)
  • iOS--编译链接的过_1

    iOS 开发中使用的是编译语言,所谓编译语言是在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高,是使用 Clang / LLVM 来编译的。LLVM是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-

    2024年02月16日
    浏览(34)
  • 编译zlib库给IOS平台用

    打开zlib官方网: zlib Home Site    找到github仓库地址: 复制zlib的github地址      执行下面脚本克隆zlib库 克隆成功    zlib自带CMakeLists.txt 所以用CMake-GUI来生成 选择zlib源码目录及输出目录,输入下图的CMAKE参数  

    2024年02月16日
    浏览(44)
  • iOS开发之编译OpenSSL静态库

    项目审查发现OpenSSL1.0.2d有漏洞,所以需要升级更新OpenSSL版本,借此机会,记录一下编译OpenSSL静态库的流程。 Xcode使用的是14.2,OpenSSL使用的是1.0.2u、1.1.1u,由于是对两个不同版本进行的编译操作,所以相关命令和操作方式是有区别的,我会在下面分别描写,操作时要看清对

    2024年02月07日
    浏览(46)
  • macos编译libtiff库给IOS用

         

    2024年02月12日
    浏览(45)
  • Xcode 15(iOS17)编译适配报错

    报错:No template named \\\'unary_function\\\' in namespace \\\'std\\\'; did you mean \\\'__unary_function\\\'?  解决: Xcode点击Pods点击Build Settings点击 Basic找到Apple Clang-Preprocessing下的Preprocessor Macros  添加:_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION

    2024年03月17日
    浏览(62)
  • 驱动开发,IO多路复用实现过程,epoll方式

    被称为当前时代最好用的io多路复用方式; 核心操作:一棵树(红黑树)、一张表(内核链表)以及三个接口;  思想:(fd代表文件描述符)         epoll要把检测的事件fd挂载到内核空间红黑树上,遍历红黑树,调用每个fd对应的操作方法,找到发生事件的fd,如果没有发

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包