iOS 底层原理 day04 dyld Mach-O
2020-07-27 本文已影响0人
望穿秋水小作坊
一、动态库共享缓存(dyld shared cache)
- 从 iOS3.1 开始,为了提高性能,绝大部分的系统动态库文件都打包存放到了一个缓存文件中(dyld shared cache)
- 缓存文件iPhone路径: /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
- dyld_shared_cache_armX 的
X
代表 ARM 处理器指令集架构 - 目前仅有 iPhone5、iPhone5C、iPad4 是
v7s
架构,iPhone5s 以后的手机和 iPad 都是arm64
的架构。 - 所有指令集原则上都是向下兼容的
- 动态库共享缓存非常明显的好处是节省内存(节约一些动态化共有信息描述)
- 现在 ida、hopper 反编译工具都可以识别动态库共享缓存
二、** Mach-O 的基本结构**: Mach-O 文件包含 3 个主要区域
- Header
- 文件类型、目标架构类型等
- Load commands
- 描述文件在虚拟内存中的逻辑结构、布局
- Raw segment data
- 在 Load commands 中定义的 Segement 的原始数据
三、常见的 Mach-O 文件类型
- MH_OBJECT
- 目标文件 (.o)
- 静态库文件 (.1),静态库其实就是 N 个 .o 合并在一起
-
MH_EXCUTE:可执行文件
-
MH_DYLIB:动态库文件
- .dylib
- .framework/xx
- MH_DYLINKER:动态链接编辑器
- /usr/lib/dyld
- MH_DSYM:存储着二进制文件符号信息的文件
- .dSYM/Contents/Resources/DWARF/xx(常用语分享 APP 的崩溃信息)
四、查看的 Mach-O 文件类型信息的方法
- file 指令
carrotdeMacBook-Pro:clutch carrot__lsp$ file Beautiful_clutch
Beautiful_clutch: Mach-O 64-bit executable arm64
- otool 指令
carrotdeMacBook-Pro:clutch carrot__lsp$ otool -l Beautiful_clutch | grep crypt
cryptoff 16384
cryptsize 98304
cryptid 0
- MachOView Mac 上的 GUI 工具
五、dyld 和 Mach-O
- dyld 用于节奏一下类型的 Mach-O 文件
- MH_EXECUTE
- MH_DYLIB
- MH_BUNDLE
- APP 的可执行文件、动态库都是由 dyld 负责加载的