1. 从编码到启动 app 的过程?(源码→可执行文件→内存)这三个点回答
过程2. 思考下图中的 Swift.String.init()
方法是存放在哪里?(Mach-O 还是 动态库)
示例代码
- 这是Swift 的官方函数,一般并不存放在
Mach-O
文件中,苹果使用共享动态库技术
,将它们存放在了统一的动态库中
3. 思考:Swift.String.init()
这样的官方方法调用,我们在使用汇编跟进去的时候,经常会看到 dyld_stub_binder
函数,这个函数是干什么的呢?
dyld_stub_binder
-
stub
一般翻译为符号
-
dyld_stub_binder
其实是一个符号绑定的过程 - 前面我们了解到,Swift 的官方函数
Swift.String.init()
其实都是放在动态库
中,所以我们程序在编译的时候并不知道Swift.String.init()
函数的具体地址,但是编译阶段必须确定一个调用地址,所以编译阶段写的Swift.String.init()
地址是一个桥接地址
- 我们在程序运行时,必须知道
Swift.String.init()
的真实地址,这就是dyld_stub_binder
的作用了,会把真实地址找到,并且进行绑定。
4. 思考如何侧面证明上面对 dyld_stub_binder
说法呢?
两个Swift.String.init()
-上图中有两个Swift.String.init()
,如果汇编跟进去,发现只有第一个会调用 dyld_stub_binder
- 因为
符号绑定
是懒加载
的,只有调用了才会进行绑定,并且只需要绑定一次
网友评论