关于链接器

编译器和解释器执行代码的特点如下:

  • 采用编译器生成机器码执行的好处就是效率高,缺点就是调试时间长
  • 采用解释器执行的好处是编写调试方便,缺点是执行效率低

iOS开发采用的编译器是 LLVM

LLVM是编译器工具链接技术的一个集合。其中 lld 项目是内置链接器。编译器会对每个文件进行编译,生成Mach-O(可执行文件);链接器会将项目中的多个 Mach-O 文件合并成一个

LLVM编译过程如下:

  • 首先 LLVM会预处理代码,如把宏嵌入到对应的位置。
  • 预处理完后,LLVM 会对代码进行词法分析和语法分析,生成 AST。AST 是抽象语法树,结构上比代码更精简,遍历起来更快,所以使用AST 能够更快速地进行静态检查。
  • 最后 AST 生成 IR, IR是一种更接近机器码的语言,区别在于和平台无关,通过IR 可以生成多份适合不同平台的机器码。对于 iOS 系统来说,IR 生成的可执行文件就是 Mach-O.

Mach-O 文件里的内容,主要是代码和数据:代码是函数的定义;数据是全局变量的定义,包括全局变量的初始值。

链接器的作用就是完成变量、函数符号和其他地址绑定的任务。

链接器会把项目中的多个 Mach-O 文件最终合并成一个,为什么呢?自己想想看。

链接器在链接多个目标文件时,会创建一个符号表,用于记录所用已定义的和所有未定义的符号。

库链接

静态库时编译时链接的库,需要链接到 Mach-O 文件里,如果需要更新就要重新编译一次,无法动态加载和更新;而动态库是运行时链接的库,使用 dyld 就可以实现动态加载。运行时通过 dlopen 和 dlsym 导入动态库时,先根据记录的库路径找到对应的库,再通过记录的名字符号找到绑定的地址。

dyld 加载动态库有两种方法:有程序启动加载时绑定和符号第一次被用到时绑定。为了减少启动时间,大部分动态库使用的都是符号第一次被用到时再绑定的方式。

编译、链接、执行、动态库加载、 main 函数开始执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值