cris
(chris)
1
1、Links those libraries into the executable by immediately binding non-lazy symbols and setting up the necessary tables for lazy binding.
为什么dynamic libraries要跟non-lazy smybol绑定?
2、In short, the non-lazy symbol pointers are just zero bytes, and the lazy symbol pointer points right back to the stub helper section!上面这句话什么意思。
non-lazy ~ __DATA,__ni_symbol_ptr
lazy ~ __DATA, __la_symbol_ptr
3、这个symbol到底是起了什么作用在macho文件运行过程中。
cris
(chris)
3
感谢张总的指点,我去查了下,但是我还是有点疑惑。在mach-o中的__LINKEDIT段中确实存在一个symbol table,这个或许就是您说的外部符号,这个table中每一项都是一个nlist。其中包含了OC中所有类中方法的method&IMP的对应关系(不知我这么理解对不对)。
所以dyld在load一个dynamic library的时候会将这个符号表同这个动态库在内存中真正地址对应起来,因为是动态库所以是non-lazy的(but why,如果是lazy会有什么问题吗?)
但是在__DATA段的__lasymbol_ptr section下还有一个indirect pointer的对应关系:如下图
这里的对应关系都是系统方法,这又是什么。我都有点晕了。。。。
Zhang
4
不。
lazy可以大致当作实现不在当前macho里的symbol看待,non lazy反之。
__lasymbol_ptr section这个就是存储这个dylib需要但是实现在其他地方的符号,dyld会负责bind
4ch12dy
(xia0)
5
1 个赞
cris
(chris)
6
我按照你的操作,为什么我无法反汇编呢?
error: Cannot disassemble around the current function without a selected frame.
cris
(chris)
7
看了你的文章,对于lazy bind的函数的调用过程基本有个了解了,但是我发现machoview确有个很怪的地方。
在symbol table里明显表示了printf 和 dyld_stub_binder都来自同一个动态库,也都被标识了non
-lazy绑定。
但在__DATA段里,printf是lazy的。。。dyld_stub_binder却是non-lazy的?
这是为什么呢?
按照张总的意思,这两个方法应该其实现都不在当前的macho里的,应该都属于lazy的啊。。。
printf应该是ok的。
4ch12dy
(xia0)
8
不对, dyld_stub_binder的符号绑定在进程获得执行权之前,也就是说这时候还是由操作系统在接管。你可以在动态库链接完成之前也就是main函数执行之前查看对应地址,你会发现地址里的内容为空,只有在链接完成后,才可以查看dyld_stub_binder的地址。因此就算是一个动态库,但它的绑定方式并不是符合lazy的方式即不是在执行中动态绑定符号。