iOS App 啟動原理(一) mian之前

2021-10-03 06:39:42 字數 763 閱讀 2548

什麼是dyld?

dyld的全稱是dynamic loader,它的作用是載入乙個程序所需要的image。這裡提到的image並不是我們認知的意思,指的是executable,dylib或者bundle的一種。

此時核心對dyld都做了哪些事?首先先講解乙個概念——aslr

為什麼需要rebase 和 bind?

rebase:rebasing過程就是從__linkedit取出函式指標,根據偏移量修改函式指標,存入__data中,rebase解決了內部的符號引用問題。

binding:當引用動態庫其他的函式或者變數時,當前mach-o檔案會指向其他dylib。這時候就需要binding操作,dyld會根據符號表去找到相應函式和變數位址,binding解決了修正外部指標指向的問題。

objective c是動態語言,為了維持它的動態性,在啟動時,所以在執行main函式之前,需要把類的資訊註冊到乙個全域性的table中。同時,objective c支援category,基於runtime的特性,在初始化的時候,也會把category中的方法插入類結構體的方法列表中。

完成objc的相關工作之後,需要完成動態庫一些初始化工作:包括了執行 +load() 方法、attribute((constructor)) 修飾的函式的呼叫、建立 c++ 靜態全域性變數。執行「自下而上」,這樣每個初始化器都可以呼叫它下面的dylibs,最後,dyld在可執行檔案中呼叫main()。

參考:ios啟動原理

iOS App 簽名的原理

數字簽名的作用是我對某乙份資料打個標記,表示我認可了這份資料 籤了個名 然後我傳送給其他人,其他人可以知道這份資料是經過我認證的,資料沒有被篡改過。首先用一種演算法,算出原始資料的摘要。需滿足 a.若原始資料有任何變化,計算出來的摘要值都會變化。b.摘要要夠短。這裡最常用的演算法是md5。生成乙份非...

iOS APP啟動過程詳解

int argc,char argv,nsstring principalclassname,nsstring delegateclassname 應用程式啟動完畢。當由於其它方法開啟應用程式 如url指定或者連線 通知委託啟動完畢 通知委託,應用程式將在關閉 退出,請做一些清理工作。通知委託,應用...

iOS APP啟動時間優化

第乙個階段 程式啟動到main函式。第二個階段 main函式到顯示第乙個介面。1.載入可執行檔案。2.載入動態鏈結庫。3.objc 執行時的初始處理,包括 objc 相關類的註冊 category 註冊 selector 唯一性檢查等。4.初始化,包括了執行 load 方法 建立 c 靜態全域性變數...