MachO文件
官方介紹總共有11種格式! 是 Mach Object的縮寫(xiě),是Mac\iOS 上用于存儲(chǔ)程序,庫(kù)的標(biāo)準(zhǔn)格式!
常見(jiàn)的格式:
- 1.可執(zhí)行文件
- 2.objcet
- .o 文件(目標(biāo)文件)
- .a 靜態(tài)庫(kù)文件.其實(shí)就是N個(gè).o文件的集合
- 3.DYLIB: 動(dòng)態(tài)庫(kù)文件
- dylib
- framework
- 4.動(dòng)態(tài)連接器,dynamic linker
- 5.DSYM :分析 APP 崩潰信息。
演示 C 文件 —> 可執(zhí)行文件(C 語(yǔ)言基礎(chǔ)知識(shí))
- 新建一個(gè) test.c 的 C 文件,寫(xiě)一個(gè)方法:
int main(){
printf("測(cè)試一下");
return 0;
}
- 編譯一下:
clang -c test.c
即生成 test.o 文件。
- 再通過(guò) file 命令查看一下:
file test.o
既可以看到,test.o 為 Mach-O 文件,object 文件
test.o: Mach-O 64-bit object x86_64
但是不是一個(gè)可執(zhí)行的文件,怎么變成一個(gè)可執(zhí)行的文件呢?
- 通過(guò) clang 鏈接一下目標(biāo)文件 test.o 即可:
clang test.o
這時(shí),text.c 就轉(zhuǎn)變成一個(gè) a.out 的可執(zhí)行文件。
- 執(zhí)行
./a.out

補(bǔ)充:
clang -o test1 test.o
鏈接 test.0 目標(biāo)文件,生成 test1 的可執(zhí)行文件
- 同 1
clang -o test2 test.c
直接一次性將源文件生成 test2 的可執(zhí)行文件

- 同時(shí)將多個(gè)源文件生成一個(gè)可執(zhí)行文件:
clang -o Demo test.c test1.c
先后順序無(wú)關(guān),文件間方法聲明相互調(diào)用
- 同時(shí)將多個(gè)源文件生成一個(gè).0 目標(biāo)文件:
clang -c test.c test1.c
靜態(tài)庫(kù)
find . -name "*.a"
在當(dāng)前目錄中查找名字 .a 擴(kuò)展名的 靜態(tài)庫(kù)。
find /usr/lib -name "*.dylib"
在指定目錄下查找動(dòng)態(tài)庫(kù)
動(dòng)態(tài)庫(kù)共享緩存
為了提高性能,系統(tǒng)的動(dòng)態(tài)庫(kù)文件都存在了動(dòng)態(tài)庫(kù)共享緩存里面!

動(dòng)態(tài)加載器/連接器(dyld)
- dynamic linker
- dynamic loader


Xcode 中的 Mach-O 文件類(lèi)型

Mach-O 文件編譯架構(gòu):
- Debug 模式:
手機(jī)鏈接編譯,查看 002--可執(zhí)行文件.app 找到可執(zhí)行文件,查看:
file 002--可執(zhí)行文件
002--可執(zhí)行文件: Mach-O 64-bit executable arm64


- Release 模式:
會(huì)生成 armv7 和 arm64 兩種架構(gòu)。11.4 還是一樣的arm64
開(kāi)始測(cè)試還是arm64,是因?yàn)榘姹镜膯?wèn)題,切換到 10.3 就是兩種了,如下:


環(huán)境變量一般為:arm64 和 armv7.
拆分二進(jìn)制文件
同時(shí)包含了多個(gè)架構(gòu)的二進(jìn)制文件叫做 通用二進(jìn)制文件
lipo 經(jīng)常用于整合靜態(tài)庫(kù)
瘦身
- 拆分名字為 macho_armv7 的 armv7 版本。
$ lipo 002--可執(zhí)行文件 -thin armv7 -output macho_armv7
- 拆分名字為 macho_arm64 的 arm64 版本。
$ lipo 002--可執(zhí)行文件 -thin arm64 -output macho_arm64
整合
- 合并為 arm64 和 armv7 的版本。
$ lipo -create macho_armv7 macho_arm64 -output machO_v7_64
附:lipo命令
lipo 是一個(gè)在 Mac OS X 中處理通用程序(Universal Binaries 即 通用二進(jìn)制文件)的工具。
使用 lipo 命令來(lái)查看整合靜態(tài)庫(kù)
- 查看靜態(tài)庫(kù)支持的CPU架構(gòu)
lipo -info libname.a(或者libname.framework/libname)
如:lipo -info macho_arm64
- 靜態(tài)庫(kù)拆分
lipo 靜態(tài)庫(kù)源文件路徑 -thin CPU架構(gòu)名稱(chēng) -output 拆分后文件存放路徑(名稱(chēng))
- 架構(gòu)名為armv7/armv7s/arm64等,與lipo -info 輸出的架構(gòu)名一致
如上面的:
$ lipo 002--可執(zhí)行文件 -thin arm64 -output macho_arm64
- 合并靜態(tài)庫(kù)
合并多個(gè)靜態(tài)庫(kù)
lipo -create 靜態(tài)庫(kù)存放路徑(名稱(chēng))1 靜態(tài)庫(kù)存放路徑2 ... -output 整合后存放的路徑
framework 合并(例util.framework)
lipo -create arm7/util i386/util -output util.framework