DYLD 摘录

2017-05-22  本文已影响0人  邋了个邋遢

原文: iOS中dyld缓存的实现原理是怎样的?

什么是dyld

在iOS系统中,几乎所有的程序都会用到动态库,而动态库在加载的时候都需要用dyld程序进行链接

dyld(位于/usr/lib/dyld)

什么是dyld缓存

很多系统库几乎都是每个程序都要用到的,与其在每个程序运行的时候一个一个将这些动态库都加载进来,还不如先把它们打包好,一次加载进来来的快

dyld缓存在系统中位于“/System/Library/Caches/com.apple.dyld/”目录

文件名是以“dyld_shared_cache_”开头,再加上这个dyld缓存文件所支持的指令集。在这个目录下,有可能有多个dyld缓存文件,对应所支持的不同指令集。

比如,在iPad Air 2上,该目录下就存在两个缓存文件:



因为iPad Air 2是64位的ARM(ARM v8)处理器,同时它也兼容32位的ARM应用,所以就要有两个缓存文件。

dyld_shared_cache_arm64    对应64位的版本
dyld_shared_cache_armv7s    对应32位的版本。

到目前为止,所有iOS支持的ARM指令集有以下四种:

1)armv6

 

2)armv7

 

3)armv7s

 

4)arm64

没有了系统库的原始二进制版本是不是就没法分析了呢?当然不是,我们还可以从dyld缓存文件中将系统库的原始二进制文件给解出来。

目前,有两个工具可以做到这点,一是dyld_decache,还有一个就是jtool。

dyld_decache

使用dyld_decache可以整体提取dyld缓存文件中的所有库原始二进制文件:

dyld_decache [-o folder] [-f name [-f name] ...] path/to/dyld_shared_cache_armvX

-o用来指定提取出来的文件所要保存的路径,如果不指定,默认就在当前目录下创建一个叫做“library”的目录保存。
-f用来说明要提取库的名字,如果要提取的库不止一个,那么每个库的名字前面都要带上-f。如果不指定默认行为就是把缓存文件中所有的库文件全部都提取出来。

例如,如果想要解压Security库,可以使用下面的命令:

dyld_decache -o ./Security -f Security ./dyld_shared_cache_armv7s


jtool

前面也提到了,还可以用jtool来达到提取指定库文件的目的:

jtool -extract name path/to/dyld_shared_cache_armvx

-extract用来指定要提取库的名字。jtool默认不支持提取全部缓存中库文件的功能,只能一个一个提取。

上一篇下一篇

猜你喜欢

热点阅读