動(dòng)態(tài)庫與靜態(tài)庫解析

1.動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別?
動(dòng)態(tài)庫代碼符號(hào)表都是放到一起的,在編譯時(shí)不會(huì)被拷貝到目標(biāo)程序中,只會(huì)存儲(chǔ)指向動(dòng)態(tài)庫的引用,運(yùn)行時(shí)才會(huì)被真正加載進(jìn)來。
靜態(tài)庫符號(hào)是以.o文件進(jìn)行存儲(chǔ)的

靜態(tài)庫是.o文件的集合體,再往后鏈接就是可執(zhí)行文件或者動(dòng)態(tài)庫
動(dòng)態(tài)庫是編譯鏈接的最終產(chǎn)物

可以使用 nm -pa 動(dòng)靜態(tài)庫路徑 查看

objdump -macho -d 動(dòng)靜態(tài)庫路徑 打印代碼段里的內(nèi)容

man ld 查看連接器手冊

ar -t 靜態(tài)庫路徑 查看.o文件

objdump -macho -d /Users/mawentao/Desktop/靜態(tài)庫與動(dòng)態(tài)庫/上課代碼/05-靜態(tài)庫與動(dòng)態(tài)庫鏈接優(yōu)化/dead\ strip/test 查看可執(zhí)行文件代碼段的內(nèi)容

2.動(dòng)靜態(tài)庫的空間哪個(gè)???為什么?
動(dòng)態(tài)庫小,動(dòng)態(tài)庫沒有冗余的信息,靜態(tài)庫有。即
動(dòng)態(tài)庫中的所有文件都放在Mach header 、Segment、Section、blob,而靜態(tài)庫每個(gè).o下都有這四項(xiàng)。
有一種情況靜態(tài)庫.o所占的空間沒有達(dá)到對齊所占的空間,就是代碼比較少時(shí)靜態(tài)庫小,動(dòng)態(tài)庫是經(jīng)過對齊的

3.連接器鏈接靜態(tài)庫場景的4個(gè)級別,靜態(tài)庫的代碼剝離
-noall_load 只把APP中使用的代碼加載進(jìn)來
-all_load 所有代碼加載進(jìn)來,包括系統(tǒng)其他代碼
-ObjC 加載與OC相關(guān)的代碼
-force_load<file> 哪個(gè)靜態(tài)庫作為主鏈接,是一種解決靜態(tài)庫沖突的方式
ld -> 靜態(tài)庫 -> APP有沒有用到靜態(tài)庫的代碼,即類的代碼

靜態(tài)庫中的分類不會(huì)鏈接進(jìn)APP,所以靜態(tài)庫默認(rèn)使用-all_load、-ObjC

-dead_strip 整個(gè)APP的代碼剝離
ls->針對場景:就會(huì)被剝離 比如全局函數(shù)不會(huì)被鏈接進(jìn)代碼段
1.沒有被入口函數(shù)使用
2.不能成為導(dǎo)出符號(hào)

4.靜態(tài)庫鏈接到主程序,靜態(tài)庫存放在什么位置?動(dòng)態(tài)庫呢?
動(dòng)態(tài)庫在APP的目錄里去保存動(dòng)態(tài)庫的路徑。
靜態(tài)庫的.o和APP的.o鏈接到了一起做了合并到了代碼段。

ipa:可執(zhí)行文件、簽名、Frameworks(動(dòng)靜態(tài)庫)

5.靜態(tài)庫與動(dòng)態(tài)庫與framework的關(guān)系?
framework是一種打包方式,包括靜態(tài)庫和動(dòng)態(tài)庫。
靜態(tài)庫:header + .a + 簽名 + 資源文件
動(dòng)態(tài)庫:header + .dylib+ 簽名 + 資源文件

靜態(tài)庫,系統(tǒng)framework不需要拷貝到APP中
動(dòng)態(tài)庫,自己做出來的framework(又叫Embedded Framework)哪怕是動(dòng)態(tài)的 要拷貝到APP中

6.不同APP使用相同的動(dòng)態(tài)庫在系統(tǒng)中只有一份嗎?
如果是系統(tǒng)動(dòng)態(tài)庫是只有一份的,
如果是Embedded Framework 動(dòng)態(tài)庫是會(huì)在多個(gè)APP中各自打包、簽名加載一份。

7.什么是xcframework,使用有什么優(yōu)勢?
可以表示一個(gè)多個(gè)平臺(tái)和架構(gòu)的分發(fā)二進(jìn)制庫的先進(jìn)格式。
和傳統(tǒng)Framework相比的優(yōu)勢:
(1)可以用單個(gè).xcframework文件提供多個(gè)平臺(tái)的分發(fā)二進(jìn)制文件
(2)與Fat Header相比,可以按照平臺(tái)劃分,可以包含相同架構(gòu)的不同平臺(tái)的文件
(3)在使用時(shí),不需要再通過腳本去剝離不需要的架構(gòu)體系。

fat 二進(jìn)制 是把所有的架構(gòu)放在一起

lipo -info 路徑 查看Framework支持的架構(gòu)

8.什么是dead strip與-ObjC參數(shù)與-force_load之間有聯(lián)系嗎?
沒聯(lián)系,針對的場景不一樣。dead strip針對整個(gè)APP的文件,-ObjC、-force_load針對的靜態(tài)庫。

9.什么是tbd文件,在日常開發(fā)中有哪些應(yīng)用場景?簡單理解為動(dòng)態(tài)庫的描述文件。開發(fā)環(huán)境中。

text-based stub libraries ,本質(zhì)是一個(gè)YAML描述的文本文件,YAML是一個(gè)可讀性高,用來表達(dá)數(shù)據(jù)序列化的格式。

作用是用于記錄動(dòng)態(tài)庫的一些信息,包括導(dǎo)出符號(hào)、動(dòng)態(tài)庫的架構(gòu)信息、動(dòng)態(tài)庫的依賴信息;
用于避免在真機(jī)開發(fā)過程中直接使用傳統(tǒng)的dylib.

對于真機(jī)來說,由于動(dòng)態(tài)庫都是在設(shè)備上,在Xcode上使用基于tbd格式的偽Framework可以大大減少Xcode的大小。

10.要減小APP的體積,應(yīng)該使用靜態(tài)庫還是動(dòng)態(tài)庫,為什么?
分情況:
代碼少時(shí),用靜態(tài)庫。
代碼多時(shí),用動(dòng)態(tài)庫。

靜態(tài)庫.o所占的空間沒有達(dá)到對齊所占空間,使用靜態(tài)庫,否則使用動(dòng)態(tài)庫。

static 修飾的作用域只在本文件

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

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

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