MachO文件
Mach-O其實(shí)是Mach Object
文件格式的縮寫(xiě)歉井,是mac以及iOS上可執(zhí)行文件的格式眷蜈, 類似于windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format)
Mach-O為Mach object文件格式的縮寫(xiě)巍杈,它是一種用于可執(zhí)行文件闺金、目標(biāo)代碼拒课、動(dòng)態(tài)庫(kù)的文件格式狼牺。作為a.out格式的替代羡儿,Mach-O提供了更強(qiáng)的擴(kuò)展性。
屬于MachO格式的常見(jiàn)文件有:
- 目標(biāo)文件.o
- 庫(kù)文件
- .a
- .dylib
- Framework
- 可執(zhí)行文件
- dyld
- .dsym
File指令
通過(guò) $file
文件路徑 查看文件類型
通用二進(jìn)制文件(Universal binary)
蘋(píng)果公司提出的一種程序代碼是钥。能同時(shí)適用多種架構(gòu)的二進(jìn)制文件,同一個(gè)程序包中同時(shí)為多種架構(gòu)提供最理想的性能掠归。因?yàn)樾枰獌?chǔ)存多種代碼,通用二進(jìn)制應(yīng)用程序通常比單一平臺(tái)二進(jìn)制的程序要大悄泥。但是 由于兩種架構(gòu)有共通的非執(zhí)行資源虏冻,所以并不會(huì)達(dá)到單一版本的兩倍之多。而且由于執(zhí)行中只調(diào)用一部分代碼弹囚,運(yùn)行起來(lái)也不需要額外的內(nèi)存厨相。
lipo命令
使用lifo -info 可以查看MachO文件包含的架構(gòu)
$lipo -info MachO文件
使用lifo –thin 拆分某種架構(gòu)
$lipo MachO文件 –thin 架構(gòu) –output 輸出文件路徑
使用lipo -create 合并多種架構(gòu)
$lipo -create MachO1 MachO2 -output 輸出文件路徑
MachO文件結(jié)構(gòu)
因?yàn)镸achO文件本身是一種文件格式,所以我們一定需要了解其文件內(nèi)部結(jié)構(gòu)。
如圖所示蛮穿,MachO文件的結(jié)構(gòu)包括:
Header 包含該二進(jìn)制文件的一般信息
字節(jié)順序庶骄、架構(gòu)類型、加載指令的數(shù)量等践磅。
使得可以快速確認(rèn)一些信息单刁,比如當(dāng)前文件用于32位還是64位,對(duì)應(yīng)的處理器是什么府适、文件類型是什么Load commands 一張包含很多內(nèi)容的表
內(nèi)容包括區(qū)域的位置羔飞、符號(hào)表、動(dòng)態(tài)符號(hào)表等檐春。Data 通常是對(duì)象文件中最大的部分
包含Segement的具體數(shù)據(jù)
其具體內(nèi)容和結(jié)構(gòu)自己可以使用工具MachOView
來(lái)詳細(xì)查看逻淌,使用工具查看后相信你會(huì)有更深刻的認(rèn)識(shí)。
Header的數(shù)據(jù)結(jié)構(gòu)
/*
* The 64-bit mach header appears at the very beginning of object files for
* 64-bit architectures.
*/
struct mach_header_64 {
uint32_t magic; /* 魔數(shù)疟暖,快速定位屬于64還是32位 */
cpu_type_t cputype; /* CPU類型卡儒,比如ARM */
cpu_subtype_t cpusubtype; /* CPU的具體類型 arm64\armv7 */
uint32_t filetype; /* 文件類型,比如可執(zhí)行文件 */
uint32_t ncmds; /* loadCommands條數(shù) */
uint32_t sizeofcmds; /* LoadCommands的大小 */
uint32_t flags; /* 標(biāo)志位標(biāo)識(shí)二進(jìn)制文件支持的功能誓篱。主要是和系統(tǒng)加載、鏈接有關(guān) */
uint32_t reserved; /* reserved */
};
LoadCommands
LoadCommands結(jié)構(gòu)及其含義如下表:
-- | -- |
---|---|
LC_SEGMENT_64 | 將文件中(32位或64位)的段映射到進(jìn)程地址空間中 |
LC_DYLD_INFO_ONLY | 動(dòng)態(tài)鏈接相關(guān)信息 |
LC_SYMTAB | 符號(hào)地址 |
LC_DYSYMTAB | 動(dòng)態(tài)符號(hào)表地址 |
LC_LOAD_DYLINKER | 使用誰(shuí)加載凯楔,我們使用dyld |
LC_UUID | 文件的UUID |
LC_VERSION_MIN_MACOSX | 支持最低的操作系統(tǒng)版本 |
LC_SOURCE_VERSION | 源代碼版本 |
LC_MAIN | 設(shè)置程序主線程的入口地址和棧大小 |
LC_LOAD_DYLIB | 依賴庫(kù)的路徑窜骄,包含三方庫(kù) |
LC_FUNCTION_STARTS | 函數(shù)起始地址表 |
LC_CODE_SIGNATURE | 代碼簽名 |
DYLD
dyld(the dynamic link editor)是蘋(píng)果的動(dòng)態(tài)鏈接器,是蘋(píng)果操作系統(tǒng)一個(gè)重要組成部分摆屯,在系統(tǒng)內(nèi)核做好程序準(zhǔn)備工作之后邻遏,交由dyld負(fù)責(zé)余下的工作。
神秘代碼
444a5584b601a81fa12a3958f2e2a354`