Mach-O 文件一

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í))

  1. 新建一個(gè) test.c 的 C 文件,寫(xiě)一個(gè)方法:
int main(){
    printf("測(cè)試一下");
    return 0;
}
  1. 編譯一下:

clang -c test.c

即生成 test.o 文件。

  1. 再通過(guò) file 命令查看一下:

file test.o

既可以看到,test.o 為 Mach-O 文件,object 文件
test.o: Mach-O 64-bit object x86_64

但是不是一個(gè)可執(zhí)行的文件,怎么變成一個(gè)可執(zhí)行的文件呢?

  1. 通過(guò) clang 鏈接一下目標(biāo)文件 test.o 即可:

clang test.o

這時(shí),text.c 就轉(zhuǎn)變成一個(gè) a.out 的可執(zhí)行文件。

  1. 執(zhí)行

./a.out

轉(zhuǎn)換執(zhí)行過(guò)程

補(bǔ)充:

clang -o test1 test.o
鏈接 test.0 目標(biāo)文件,生成 test1 的可執(zhí)行文件

  1. 同 1

clang -o test2 test.c
直接一次性將源文件生成 test2 的可執(zhí)行文件

image.png
  1. 同時(shí)將多個(gè)源文件生成一個(gè)可執(zhí)行文件:

clang -o Demo test.c test1.c
先后順序無(wú)關(guān),文件間方法聲明相互調(diào)用

  1. 同時(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ù)共享緩存里面!

Mac

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

  • dynamic linker
  • dynamic loader
image.png
文件類(lèi)型

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

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

image.png
符號(hào)表文件中的可執(zhí)行文件類(lèi)型
  • Release 模式:
    會(huì)生成 armv7 和 arm64 兩種架構(gòu)。11.4 還是一樣的arm64
    開(kāi)始測(cè)試還是arm64,是因?yàn)榘姹镜膯?wèn)題,切換到 10.3 就是兩種了,如下:
image.png
image.png

環(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ù)

  1. 查看靜態(tài)庫(kù)支持的CPU架構(gòu)

lipo -info libname.a(或者libname.framework/libname)

如:lipo -info macho_arm64

  1. 靜態(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

  1. 合并靜態(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • [TOC] 指針的基礎(chǔ) 指針寬度:在64位系統(tǒng)中占8個(gè)字節(jié)=64bit; 編譯器決定了指針不能做乘法和除法,但能進(jìn)...
    _順_1896閱讀 364評(píng)論 0 0
  • 指針&MachO文件 指針 指針自增、自減的結(jié)果,其實(shí)就是指針指向的數(shù)據(jù)類(lèi)型寬度決定的! 指針加上或減去一個(gè)整數(shù)的...
    為自己丶拼個(gè)未來(lái)閱讀 186評(píng)論 0 0
  • 熟悉Linux和windows開(kāi)發(fā)的同學(xué)都知道,ELF是Linux下可執(zhí)行文件的格式,PE32/PE32+是win...
    Klaus_J閱讀 4,122評(píng)論 1 10
  • Mach-O類(lèi)型的文件 Mach-O是一種文件的格式; 是iOS/Mac OS上存儲(chǔ)程序以及庫(kù)的標(biāo)準(zhǔn)格式Mach ...
    其字德安閱讀 5,525評(píng)論 0 13
  • 本文所讀的源碼,可以從這里找到,這是 Mach-O 系列的第一篇 我們的程序想要跑起來(lái),肯定它的可執(zhí)行文件格式要被...
    Joy___閱讀 24,430評(píng)論 9 97

友情鏈接更多精彩內(nèi)容