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

11 | 热点问题答疑(一):基础模块问题答疑

你好,我是戴铭。
专栏上线以来,我通过评论区收到了很多同学提出的问题、建议、心得和经验,当然提的问题居多。虽然我未在评论区对每条留言做出回复,但是我对大家提出的问题却都一一记录了下来,等待这次答疑文章的到来。其实,不光是在留言区,也有一些朋友通过私信跟我反馈了学习专栏遇到的问题。
所以,今天我就借此机会,汇总并整理了几个典型并重要的问题,和你详细说一说,希望可以解答你在学习前面 10 篇文章时的一些困惑。

动态库加载方式的相关问题

@五子棋在看完第 5 篇文章“链接器:符号是怎么绑定到地址上的?”后,关于动态库是否参与链接的问题,通过私信和我反馈了他的观点。他指出:动态库也是要参与链接的,不然就没法知道函数的标记在哪儿。
为了帮助大家理解这个问题,我把与这个问题相关的内容,再和你展开一下。
我在文章中,是这么阐述这部分内容的:
Mach-O 文件是编译后的产物,而动态库在运行时才会被链接,并没参与 Mach-O 文件的编译和链接,所以 Mach-O 文件中并没有包含动态库里的符号定义。也就是说,这些符号会显示为“未定义”,但它们的名字和对应的库的路径会被记录下来。运行时通过 dlopen 和 dlsym 导入动态库时,先根据记录的库路径找到对应的库,再通过记录的名字符号找到绑定的地址。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • Mad Mark
    关于Mike Ash的那篇objc_msgSend文章,我写过一篇译文 http://madmark.cc/2017/08/01/ARM64_objc-msgSend/

    作者回复: 赞

    3
    12
  • 绝影
    可以分享多一些您关注的博客或博主吗?

    作者回复: 在后面学习资料推荐篇里我会统一整理好推荐给大家哈

    8
  • 时间都去哪了
    请问一个新项目在这个时间点用OC还是swift呢?能说说两者应该如何选择呢?

    作者回复: 新项目用 Swift。不用犹豫

    3
  • melody
    想问下您平时都利用什么途径去获取一些优质苹果的官方文档和博客内容呢?

    作者回复: 官方文档直接就在官网搜索。发现好的博客文章会订阅博主的博客了,通过 RSS 阅读器看。

    2
  • IAMCJ
    “一种是,在程序开始运行时通过 dyld 动态加载。通过 dyld 加载的动态库需要在编译时进行链接,链接时会做标记,绑定的地址在加载后再决定” 所以大部分动态库是会在编译的时候链接是吗?这个时候的“链接”是并没有绑定地址吗?那这个“链接”主要做了什么内容呢?

    作者回复: 做标记

    2
  • HeminWon
    戴铭老师👊🏼北国之恋我正好全部看完

    作者回复: 赞

  • 贰叁
    垠神是coder的三大浪漫之一编译原理世界顶级的大神
    2
  • 沧海行舟
    看完第二篇就在动手写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时没保存的向量寄存器的状态,会出现问题的吧?
    2
  • addSubview工程师
    能介绍下iOS设计架构嘛MVVM啥的最近面试被问的多了
    2
  • 陈阿票
    将代码编写成动态库,可不可以减少启动时间?
    2
    1
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部