生成Mach-O可執(zhí)行文件,中間會經(jīng)過目標文件,即.o文件
?成
.o目標文件的過程:
- 將代碼匯編化
- 將符號進行歸類;此時地址還沒有虛擬化(沒有生成虛擬內(nèi)存地址)。對于外部導入符號,它的調(diào)用地址無法得知,需要將其放到重定位符號表中
- 生成一個或多個
.o目標文件- 此時鏈接器(
llvm-ld)并沒有被執(zhí)?外部導入符號存儲的是
.m/.o文件中用到的API。例如:NSLog
?成
Mach-O可執(zhí)行文件的過程:
- 多個目標文件合并
- 符號表(包括重定位符號表)合并成一張表
- 生成一個
Mach-O可執(zhí)行文件靜態(tài)鏈接:
- 代碼經(jīng)過編譯鏈接最后分配虛擬內(nèi)存地址生成可執(zhí)行文件或動態(tài)庫
動態(tài)鏈接:
- 在運行時,由
dyld動態(tài)加載
靜態(tài)/動態(tài)鏈接
總結
- 編譯本質(zhì):將代碼匯編化,并將符號進行歸類。外部導入符號,放到重定位符號表。生成一個或多個
.o目標文件- 鏈接本質(zhì):多個目標文件合并,符號表(包括重定位符號表)合并成一張表,生成一個
Mach-O可執(zhí)行文件




