UIKit的Mach-O文件在哪里雹嗦??
系統(tǒng)的動態(tài)庫
從iOS3.1開始,為了提高性能,絕大部分的系統(tǒng)動態(tài)庫文件都打包存放到了一個緩存文件中(dyld shared cache)
緩存文件路徑:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
dyld_shared_cache_armX的X代表ARM處理器指令集架構(gòu)
v6 | v7 | v7s | arm64 |
---|---|---|---|
iPhone瞻润、iPhone3G | iPhone3GS、iPhone4甜刻、iPhone4S | iPhone5绍撞、iPhone5C | iPhone5S、iPhone6得院、iPhone6 Plus傻铣、iPhone6S、iPhone6S Plus iPhoneSE尿招、iPhone7矾柜、iPhone7 Plus阱驾、iPhone8就谜、iPhone8 Plus、iPhoneX |
4iPod Touch里覆、iPod Touch2 | iPad丧荐、iPad2、iPad3(The New iPad)iPad mini | iPad4 | * iPad5喧枷、iPad Air虹统、iPad Air2弓坞、iPad Pro、iPad Pro2 iPad mini with Retina display车荔、iPad mini3渡冻、iPad mini4 |
iPod Touch3G、iPod Touch4忧便、iPod Touch5 | iPod Touch6 |
所有指令集原則上都是向下兼容的
動態(tài)庫共享緩存一個非常明顯的好處是節(jié)省內(nèi)存
現(xiàn)在的ida族吻、Hopper反編譯工具都可以識別動態(tài)庫共享緩存
動態(tài)庫的加載
在Mac\iOS中,是使用了/usr/lib/dyld程序來加載動態(tài)庫
dynamic link editor珠增,動態(tài)鏈接編輯器
dynamic loader超歌,動態(tài)加載器
dyld源碼 https://opensource.apple.com/tarballs/dyld/
從動態(tài)庫共享緩存抽取動態(tài)庫
clang++ -o dsc_extractor dsc_extractor.cpp
Mach-O
Mach-O是Mach object的縮寫,是Mac\iOS上用于存儲程序蒂教、庫的標(biāo)準(zhǔn)格式
屬于Mach-O格式的文件類型有
常見的Mach-O文件類型
Mach-O是Mach object的縮寫巍举,是Mac\iOS上用于存儲程序、庫的標(biāo)準(zhǔn)格式
屬于Mach-O格式的文件類型有
MH_OBJECT | MH_EXECUTE | MH_DYLIB | MH_DYLINKER | MH_DSYM |
---|---|---|---|---|
目標(biāo)文件(.o) | 可執(zhí)行文件 | 動態(tài)庫文件 | 動態(tài)鏈接編輯器 | 存儲著二進制文件符號信息的文件 |
靜態(tài)庫文件(.a)凝垛,靜態(tài)庫其實就是N個.o合并在一起 | .app/xx | .dylib .framework/xx | /usr/lib/dyld | .dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩潰信息) |
Mach-O的基本結(jié)構(gòu)
官方描述 https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html
一個Mach-O文件包含3個主要區(qū)域:
- Header
文件類型懊悯、目標(biāo)架構(gòu)類型等
Load commands
描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)、布局
Raw segment data
-
在Load commands中定義的Segment的原始數(shù)據(jù)
窺探Mach-O的結(jié)構(gòu)
命令行工具
file:查看Mach-O的文件類型
file 文件路徑
otool:查看Mach-O特定部分和段的內(nèi)容
lipo:常用于多架構(gòu)Mach-O文件的處理
查看架構(gòu)信息:lipo -info 文件路徑
導(dǎo)出某種特定架構(gòu):lipo 文件路徑 -thin 架構(gòu)類型 -output 輸出文件路徑
合并多種架構(gòu):lipo 文件路徑1 文件路徑2 -output 輸出文件路徑
GUI工具
MachOView(https://github.com/gdbinit/MachOView)
Universal Binary(通用二進制文件)
- 通用二進制文件
- 同時適用于多種架構(gòu)的二進制文件
- 包含了多種不同架構(gòu)的獨立的二進制文件
- 因為需要儲存多種架構(gòu)的代碼梦皮,通用二進制文件通常比單一平臺二進制的程序要大
- 由于兩種架構(gòu)有共同的一些資源定枷,所以并不會達到單一版本的兩倍之多
- 由于執(zhí)行過程中,只調(diào)用一部分代碼届氢,運行起來也不需要額外的內(nèi)存
- 因為文件比原來的要大欠窒,也被稱為“胖二進制文件”(Fat Binary)
dyld和Mach-O
- dyld用于加載以下類型的Mach-O文件
- MH_EXECUTE
- MH_DYLIB
- MH_BUNDLE
- APP的可執(zhí)行文件、動態(tài)庫都是由dyld負(fù)責(zé)加載的