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

iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来看看吧。

       首先,我们来了解下dyld缓存。在iOS系统中,几乎所有的程序都会用到动态库,而动态库在加载的时候都需要用dyld(位于/usr/lib/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缓存文件中的所有库原始二进制文件:


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 -extract name path/to/dyld_shared_cache_armvx


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


以上就是iOS中dyld缓存的相关使用方法,大家可以在系统中去找找对应的缓存文件,结合本文的分享,深入研究下。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态库是开发中必然会用的,在Xcode中我们会碰到各种格式的“库”,framework、dylib、tbd,其实系...
    haiyangHiya阅读 3,846评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,774评论 0 9
  • 成功,一个令无数人为之神往的字眼,从古到今魅力不减,让人为之颠倒。美国石油大王洛克菲勒关于成功,曾经说过这样一句话...
    夜泊痕阅读 1,723评论 35 44
  • 最近,又把《低俗小说》看了几十遍,非常喜欢,越往后,越觉得这部电影要比乍看上去要复杂和微妙。已经有很多人把这部电影...
    王磊之阅读 1,499评论 8 8