簡介
Mach-O是Mach object的縮寫,是Mac\iOS上用于存儲程序祭衩、庫的標準格式
屬于Mach-O格式的文件類型有
可以在xnu源碼中诵竭,查看到Mach-O格式的詳細定義
xnu/EXTERNAL_HEADERS/mach-o/loader.h
#define MH_OBJECT 0x1 /* relocatable object file */
#define MH_EXECUTE 0x2 /* demand paged executable file */
#define MH_FVMLIB 0x3 /* fixed VM shared library file */
#define MH_CORE 0x4 /* core file */
#define MH_PRELOAD 0x5 /* preloaded executable file */
#define MH_DYLIB 0x6 /* dynamically bound shared library */
#define MH_DYLINKER 0x7 /* dynamic link editor */
#define MH_BUNDLE 0x8 /* dynamically bound bundle file */
#define MH_DYLIB_STUB 0x9 /* shared library stub for static */
/* linking only, no section contents */
#define MH_DSYM 0xa /* companion file with only debug */
/* sections */
#define MH_KEXT_BUNDLE 0xb /* x86_64 kexts */
常見的Mach-O文件類型
-
MH_OBJECT
目標文件(.o)
靜態(tài)庫文件(.a)环形,靜態(tài)庫其實就是N個.o合并在一起 -
MH_EXECUTE:可執(zhí)行文件
.app/xx -
MH_DYLIB:動態(tài)庫文件
.dylib
.framework/xx -
MH_DYLINKER:動態(tài)鏈接編輯器
/usr/lib/dyld - MH_DSYM:存儲著二進制文件符號信息的文件
Mach-O的基本結(jié)構(gòu)
一個Mach-O文件包含3個主要區(qū)域
-
Header
文件類型、目標架構(gòu)類型等 -
Load commands
描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)汗销、布局 -
Raw segment data
在Load commands中定義的Segment的原始數(shù)據(jù)
窺探Mach-O的結(jié)構(gòu)
1、命令行工具
file
:查看Mach-O的文件類型
file 文件目錄
otool
:查看Mach-O特定部分和段的內(nèi)容
lipo
:常用于多架構(gòu)Mach-O文件的處理
查看架構(gòu)信息:
lipo -info 文件路徑
導出某種特定架構(gòu):
lipo 文件路徑 -thin 架構(gòu)類型 -output 輸出文件路徑
合并多種架構(gòu):
lipo 文件路徑1 文件路徑2 -output 輸出文件路徑
2抵窒、GUI工具
dyld和Mach-O
- dyld也是Mach-O格式文件弛针,屬于
MH_DYLINKER
類型 -
dyld用于加載以下類型的Mach-O文件
MH_EXECUTE
MH_DYLIB
MH_BUNDLE - APP的可執(zhí)行文件、動態(tài)庫都是由dyld負責加載的
其他
在Xcode中查看target的Mach-O類型
Build Settings->Mach-O Type