共享缓存机制、PIC技术、符号绑定、符号查找

一、共享缓存机制

苹果为了节约内存以及提高加载速度,将系统的动态库放在内存的一块特殊位置,然后将这块内存共享给其他的应用。这块区域就是动态库共享缓存(dyld shared cache

二、PIC技术(位置代码独立)

编译的时候,符号地址。dyld加载的时候,将符号地址和真实地址绑定

  • 由于有了共享缓存,那么我们所调用的系统函数在编译时刻是没法确定其内存地址。
  • 所以苹果采用了PIC技术。在MachO文件DATA段建立两张表,懒加载和非懒加载表,利用存放指向外部函数的指针(符号)!
  • 当我们首次调用懒加载表内的函数时,DYLD会对该函数进行绑定。

三、符号绑定过程分析

  • 符号表,分两种,一种非懒加载表、一种懒加载表
共享缓存机制、PIC技术、符号绑定、符号查找_第1张图片
  • 获取 offset 0x00008010

  • image list 获取所有模块列表,然后找到 内存地址(MachO的首地址)0x0000000100754000

共享缓存机制、PIC技术、符号绑定、符号查找_第2张图片
  • 获取符号地址:0x0000000100754000 + offset(0x00008010) = 0x10075C010
共享缓存机制、PIC技术、符号绑定、符号查找_第3张图片
  • memory read 0x10075C010(内存地址) 读内存
  • iOS小端模式,从右往左读 0x010075a574

  • dis -s 0x010075a574 看汇编

共享缓存机制、PIC技术、符号绑定、符号查找_第4张图片
  • 第二个断点重复操作
共享缓存机制、PIC技术、符号绑定、符号查找_第5张图片
  • 第三个断点重复操作,已经执行了rebind_symbols
共享缓存机制、PIC技术、符号绑定、符号查找_第6张图片

四、通过符号找到字符串

共享缓存机制、PIC技术、符号绑定、符号查找_第7张图片
  • Section64(_DATA,_la_symbol_ptr) -> Lazy Symbol PointersDynamic Symbol Table -> Indirect Symbols 是对应的
共享缓存机制、PIC技术、符号绑定、符号查找_第8张图片
  • 000000B2 换成十进制 178,对应为Symbol Table -> Symbols中的角标
共享缓存机制、PIC技术、符号绑定、符号查找_第9张图片
  • 000000D7 对应为String Table偏移值
  • 000000D7 + 0000D3D0 = 0xD4A7
共享缓存机制、PIC技术、符号绑定、符号查找_第10张图片
共享缓存机制、PIC技术、符号绑定、符号查找_第11张图片

你可能感兴趣的:(共享缓存机制、PIC技术、符号绑定、符号查找)