11 | 热点问题答疑(一):基础模块问题答疑
戴铭
该思维导图由 AI 生成,仅供参考
你好,我是戴铭。
专栏上线以来,我通过评论区收到了很多同学提出的问题、建议、心得和经验,当然提的问题居多。虽然我未在评论区对每条留言做出回复,但是我对大家提出的问题却都一一记录了下来,等待这次答疑文章的到来。其实,不光是在留言区,也有一些朋友通过私信跟我反馈了学习专栏遇到的问题。
所以,今天我就借此机会,汇总并整理了几个典型并重要的问题,和你详细说一说,希望可以解答你在学习前面 10 篇文章时的一些困惑。
动态库加载方式的相关问题
为了帮助大家理解这个问题,我把与这个问题相关的内容,再和你展开一下。
我在文章中,是这么阐述这部分内容的:
Mach-O 文件是编译后的产物,而动态库在运行时才会被链接,并没参与 Mach-O 文件的编译和链接,所以 Mach-O 文件中并没有包含动态库里的符号定义。也就是说,这些符号会显示为“未定义”,但它们的名字和对应的库的路径会被记录下来。运行时通过 dlopen 和 dlsym 导入动态库时,先根据记录的库路径找到对应的库,再通过记录的名字符号找到绑定的地址。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
这篇技术答疑文章涵盖了动态库加载方式、App启动速度优化等技术内容。作者通过回复读者提出的问题,详细解答了关于动态库加载方式、App启动速度优化等技术问题。文章首先对动态库加载方式进行了深入讨论,解释了动态库参与链接的问题,并补充了加载动态库的两种方式。此外,作者还提到了关于InjectionIII的工作原理和对运行时动态库加载原理的理解。在回答读者关于App启动速度优化的问题时,作者推荐了苹果公司的WWDC 2016 Session 406 视频和一篇博客作为进一步阅读资料。文章还涉及了关于汇编代码的学习和Clang的相关问题。总的来说,这篇文章对读者解决相关技术问题具有一定的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》,新⼈⾸单¥59
《iOS 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(20)
- 最新
- 精选
- Mad Mark关于Mike Ash的那篇objc_msgSend文章,我写过一篇译文 http://madmark.cc/2017/08/01/ARM64_objc-msgSend/
作者回复: 赞
2019-04-04312 - 绝影可以分享多一些您关注的博客或博主吗?
作者回复: 在后面学习资料推荐篇里我会统一整理好推荐给大家哈
2019-04-048 - 时间都去哪了请问一个新项目在这个时间点用OC还是swift呢?能说说两者应该如何选择呢?
作者回复: 新项目用 Swift。不用犹豫
2019-04-073 - melody想问下您平时都利用什么途径去获取一些优质苹果的官方文档和博客内容呢?
作者回复: 官方文档直接就在官网搜索。发现好的博客文章会订阅博主的博客了,通过 RSS 阅读器看。
2019-04-102 - IAMCJ“一种是,在程序开始运行时通过 dyld 动态加载。通过 dyld 加载的动态库需要在编译时进行链接,链接时会做标记,绑定的地址在加载后再决定” 所以大部分动态库是会在编译的时候链接是吗?这个时候的“链接”是并没有绑定地址吗?那这个“链接”主要做了什么内容呢?
作者回复: 做标记
2019-07-232 - HeminWon戴铭老师👊🏼北国之恋我正好全部看完
作者回复: 赞
2019-04-04 - 贰叁垠神是coder的三大浪漫之一编译原理世界顶级的大神2019-04-202
- 沧海行舟看完第二篇就在动手写hook objc_msg_send的代码,这是学习汇编中记录的一些arm64汇编知识https://github.com/wzpziyi1/Arm64- 有需要的童鞋可以看看。 在学习过程中,发现一个问题(或者说我以为的bug)。 在戴老师的代码中,hook objc_msgSend之前保存个寄存器的状态时,并未保存向量寄存器的状态: "stp q6, q7, [sp, #-32]!\n" \ "stp q4, q5, [sp, #-32]!\n" \ "stp q2, q3, [sp, #-32]!\n" \ "stp q0, q1, [sp, #-32]!\n" \ "stp x8, x9, [sp, #-16]!\n" \ "stp x6, x7, [sp, #-16]!\n" \ "stp x4, x5, [sp, #-16]!\n" \ "stp x2, x3, [sp, #-16]!\n" \ "stp x0, x1, [sp, #-16]!\n" \ 只是保存了通用寄存器x0--x9寄存器的值,在调试代码时,发现这样的c代码: struct TestOne { double a; double b; double number; double type; }TestOne; void test(struct TestOne x) { x.a = 10; x.b = 20; x.number = 2; x.type = 11; } void call() { struct TestOne x = {0,0,0,0}; test(x); } 转成arm64汇编时,结构体的值是保存在向量寄存器d0--d4中的: _test: ; @test fmov d4, #11.00000000 fmov d5, #2.00000000 fmov d6, #20.00000000 fmov d7, #10.00000000 str d0, [sp] str d1, [sp, #8] str d2, [sp, #16] str d3, [sp, #24] str d7, [sp] str d6, [sp, #8] str d5, [sp, #16] str d4, [sp, #24] add sp, sp, #32 ; =32 ret _call: ; @call sub sp, sp, #48 ; =48 stp x29, x30, [sp, #32] ; 8-byte Folded Spill add x29, sp, #32 ; =32 mov x8, #0 str x8, [sp, #24] str x8, [sp, #16] str x8, [sp, #8] str x8, [sp] ldr d3, [sp, #24] ldr d2, [sp, #16] ldr d1, [sp, #8] ldr d0, [sp] bl _test ldp x29, x30, [sp, #32] ; 8-byte Folded Reload add sp, sp, #48 ; =48 ret 如果在项目中,有开发童鞋直接这么写: - (void)doSomething:(struct TestOne)test; 那么hook objc_msgSend时没保存的向量寄存器的状态,会出现问题的吧?2019-04-162
- addSubview工程师能介绍下iOS设计架构嘛MVVM啥的最近面试被问的多了2019-04-042
- 陈阿票将代码编写成动态库,可不可以减少启动时间?2019-04-1021
收起评论