iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

05 | 链接器:符号是怎么绑定到地址上的?

通过dlopen和dlsym加载bundle里的动态库
课后小作业
可以实现一些有趣的功能
链接器提高开发效率
dyld的作用
动态库加载过程
静态库 vs 动态库
去除无用代码
链接多个Mach-O文件
符号绑定到地址
LLVM的编译过程
iOS使用的编译器是LLVM
编译器 vs 解释器
动态库链接
编译时链接器的作用
将符号绑定到地址上
课后小作业
小结
动态库链接
编译时链接器的工作
iOS开发为什么使用编译器
链接器的作用
链接器:符号绑定到地址上的过程

该思维导图由 AI 生成,仅供参考

你好,我是戴铭。
你是不是经常会好奇自己参与的这么些项目,为什么有的编译起来很快,有的却很慢;编译完成后,有的启动得很快,有的却很慢。其实,在理解了编译和启动时链接器所做的事儿之后,你就可以从根儿上找到这些问题的答案了。
所以,在今天这篇文章中,我就重点和你讲解一下链接器相关的知识。简单地说,链接器最主要的作用,就是将符号绑定到地址上。理解了这其中的原理后,你就可以有针对性地去调整和优化项目了。
同时,掌握了链接器的作用,也将有助于你理解后面文章中,关于符号表、加载相关的内容。
现在,我们就从 iOS 开发的起点,也就是编写代码和编译代码开始说起,看看链接器在这其中到底发挥了什么作用。

iOS 开发为什么使用的是编译器?

我们都知道,iOS 编写的代码是先使用编译器把代码编译成机器码,然后直接在 CPU 上执行机器码的。之所以不使用解释器来运行代码,是因为苹果公司希望 iPhone 的执行效率更高、运行速度能达到最快。
为什么说用解释器运行代码的速度不够快呢?这是因为解释器会在运行时解释执行代码,获取一段代码后就会将其翻译成目标代码(就是字节码(Bytecode)),然后一句一句地执行目标代码。
也就是说,解释器,是在运行时才去解析代码,这样就比在运行之前通过编译器生成一份完整的机器码再去执行的效率要低。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了链接器在编译和启动时的重要作用,以及动态库链接在iOS开发中的关键性。文章首先解释了链接器的主要任务,包括符号绑定、Mach-O文件合并和地址重定位,以及去除无用代码以提高程序执行效率。此外,还介绍了动态库链接的重要性,以及dyld实现动态加载的方式。通过对dyld的链接过程和动态链接器的作用顺序的介绍,读者能够更深入地了解链接器和动态库链接的相关知识。文章最后提到了通过otool工具查看符号所需库的方法,为读者提供了实用的技术指导。总的来说,本文内容丰富,深入浅出,对于iOS开发者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(65)

  • 最新
  • 精选
  • 邓斌
    我发现戴大神写几篇的主题跟我最近在写的博客很像哦哈哈ヾノ≧∀≦)o https://www.jianshu.com/p/95896fb96a03

    作者回复: 写的真棒,赞

    2019-03-21
    19
  • straycandy
    你好,请问下oc具有动态特性,链接器在清理无用函数时候,如何保证运行时不会指向这个函数呢?比如页面路由之类的函数,函数名都是拼接而成的。很是疑惑,而且经过实验,链接器确实辨认出来了这些函数,开启dead code stripping 后没有导致崩溃

    作者回复: oc 的不会,c 的会

    2019-04-05
    5
    8
  • smilingmiao
    老师,经过我的实践,你的 -show 应该改成 --show。

    作者回复: 赞

    2019-03-22
    2
    7
  • mαnajay
    这里的共享缓存是 [Diving into WWDC 2017] App Startup Time: Past, Present, and Future 里面说的 Dyld 2.0 开始引入的 prebinding completely replaced by shared cache 吗? 用来进程间共享这块系统的动态库 相关地址信息

    作者回复: 对

    2019-03-23
    6
  • 小小的存在
    大神,编译时的符号绑定和启动时的符号绑定是什么区别呀?

    作者回复: 一种是,在程序开始运行时通过 dyld 动态加载。通过 dyld 加载的动态库需要在编译时进行链接,链接时会做标记,绑定的地址在加载后再决定。 第二种是,显式运行时链接(Explicit Runtime Linking),即在运行时通过动态链接器提供的 API dlopen 和 dlsym 来加载。这种方式,在编译时是不需要参与链接的。不过,通过这种运行时加载远程动态库的App,苹果公司是不允许上线 App Store 的,所以只能用于线下调试环节。

    2019-07-16
    3
    4
  • 陈希敏
    老师请问一下,在 load_images 方法里断点 p path,这一步是怎么做的?

    作者回复: 你先拉 https://github.com/RetVal/objc-runtime ,搜素 load_images 方法,在那里打断点

    2019-04-10
    4
  • 爱弹吉他的纳兰沛容
    老师,我有个疑问:OC是编译语言,Xcode使用的是LLVM编译器,那么生成的ipa包应该是经过编译后的机器码,所以在iOS系统内是不存在编译器的,而安卓系统则存在JVM虚拟机?

    作者回复: 对

    2019-03-31
    4
  • zeroskylian
    在 App 运行时通过 dlopen 和 dlsym 链接加载 bundle 里的动态库。 这个是不是只能用于调试,记得iOS不允许在沙盒中加载动态库

    作者回复: 是的,用于调试

    2019-03-21
    4
  • springday
    老师,iOS目前支持AOT么。另外,感觉iOS目前编辑时间过长,是不是应该采用flutter的预编辑机制呢。

    作者回复: 期待苹果爸爸赶快加上吧

    2019-03-21
    3
    3
  • KK
    再比如,你可以逆向找出其他 App 里你感兴趣功能的使用方法,然后在自己的程序里直接调用它,最后将那个 App 作为动态库加载到自己的 App 里。这样,你感兴趣的这个功能,就能够在你自己的程序里起作用了。 这需要越狱机吧?

    作者回复: 是的

    2019-03-21
    3
收起评论
显示
设置
留言
65
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部