动态库共享缓存(dyld shared cache)

概要

从iOS3.1开始,为了提高性能,绝大部分的系统动态库文件都打包存放到了一个缓存文件中(dyld shared cache),缓存文件路径:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX

指令架构图显示


指令架构图说明

动态缓存图显示


共用缓存图
动态共享缓存图

两者相比的好处是,共用的一些信息内容可以存放到共享缓存中,例如一些header文件信息等

动态库的加载

在Mac、iOS中,是使用了/usr/lib/dyld程序来加载动态库dyld,有两种叫法

dyld:dynamic link editor,动态链接编辑器

dyld:dynamic loader,动态加载器

从动态库共享缓存抽取动态库

1.首先在手机获取下来动态库,方式有如下:

穿越 iPhone firmware. Such as: https://ipsw.me/

通过越狱设备. 路径: /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

2.从源码中获取dsc_extractor二进制命令


使用dyld源码中的launch-cache/dsc_extractor.cpp,将#if 0前面的代码删除或者注释,把后面#endif 也删除,然后变编译dsc_extractor.cpp

clang++ -o dsc_extractor dsc_extractor.cpp

如果没有报错,直接到抽取动态库文件这一步,如果报错请遵循相关错误解决

错误一:$ ./dsc_extractor dyld_shared_cache_arm64 arm64Error: dyld shared cache code signatureforpage 0 is incorrect.dyld_shared_cache_extract_dylibs_progress() =>-1

这个错误说明dsc_extractor.bundle Can't work on Xcode10,So the dsc_extractor.bundle is the Xcode9 version.then modify the ./dyld/launch-cache/dsc_extractor.cpp

#if 0

#if 1

//test program

#include<stdio.h>

#include<stddef.h>

@@ -644,7 +644,7 @@ int main(int argc, const char* argv[])

}

//void* handle = dlopen("/Volumes/my/src/dyld/build/Debug/dsc_extractor.bundle", RTLD_LAZY);

//下面这里的Xcode更改成为10版本以下的

void* handle = dlopen("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/lib/dsc_extractor.bundle", RTLD_LAZY);

void* handle =dlopen("dsc_extractor.bundle", RTLD_LAZY);

if( handle ==NULL) {

fprintf(stderr,"dsc_extractor.bundle could not be loaded\n");

return1;


3.抽取动态库文件

./dsc_extractor 动态库共享缓存文件的路径 用于粗放结果目录


导出图

参考链接

dyld源码

dsc_extractor

推荐阅读更多精彩内容