- 程序從源代碼.c文件到可執(zhí)行.o文件需要哪幾步?
- 預(yù)編譯:main.c --> main.i 把c文件變成中間文件,去除注釋、展開宏等操作;
- 編譯:main.i --> main.s 把中間文件翻譯成匯編代碼文件;
- 匯編:main.s --> main.o 把匯編代碼文件轉(zhuǎn)變成目標(biāo)文件;
- 鏈接:將可重定位目標(biāo)文件進(jìn)行鏈接生成可執(zhí)行目標(biāo)文件;
- 目標(biāo)文件(elf文件)有哪幾種?
- 可重定位目標(biāo)文件:被用來(lái)鏈接成可執(zhí)行目標(biāo)文件或共享目標(biāo)文件;
- 可執(zhí)行目標(biāo)文件:可以直接執(zhí)行的程序;
- 共享目標(biāo)文件:可以鏈接到可重定位目標(biāo)或共享目標(biāo)文件生成新的目標(biāo)文件,也可以當(dāng)做動(dòng)態(tài)庫(kù)直接與可執(zhí)行目標(biāo)文件結(jié)合
- coredump文件是一種特殊的ELE文件
- 在進(jìn)程意外終止時(shí),將進(jìn)程的地址空間的內(nèi)容和終止時(shí)的一些其他信息轉(zhuǎn)儲(chǔ)到coredump文件
- elf文件由段結(jié)構(gòu)組成,有三個(gè)比較關(guān)鍵的段:
- data段:保存已初始化的全局變量和局部靜態(tài)變量;
- bss段:保存未初始化的全局變量和局部靜態(tài)變量;
- text段:保存代碼;
- 靜態(tài)鏈接如何合并兩個(gè)目標(biāo)文件?
- 鏈接器采用兩步鏈接的方法:
- 第一步,空間與地址分配:掃描所有輸入的目標(biāo)文件,獲取各個(gè)段的長(zhǎng)度、屬性和位置,并收集符號(hào)表和符號(hào)引用統(tǒng)一放到全局符號(hào)表,把多個(gè)文件按照相似段合并成一個(gè)輸出文件(例如三個(gè)data段合并成一個(gè)data段);
- 空間分配是指重新分配虛擬地址空間(進(jìn)程空間);
- 地址分配是指進(jìn)程中的虛擬地址;
- 虛·擬地址和物理地址的映射關(guān)系是另外的一個(gè)話題
- 第二步,符號(hào)解析和重定位: 在輸出文件中完成符號(hào)解析和重定位;
- 第一步,空間與地址分配:掃描所有輸入的目標(biāo)文件,獲取各個(gè)段的長(zhǎng)度、屬性和位置,并收集符號(hào)表和符號(hào)引用統(tǒng)一放到全局符號(hào)表,把多個(gè)文件按照相似段合并成一個(gè)輸出文件(例如三個(gè)data段合并成一個(gè)data段);
- 鏈接器采用兩步鏈接的方法:
- 符號(hào)解析和重定位的過程是什么?
- 符號(hào)解析:對(duì)于輸入的目標(biāo)文件來(lái)說(shuō),符號(hào)解析就是對(duì)外部符號(hào)的引用進(jìn)行解析;
- 重定位:把每個(gè)段中需要重定位的指令和數(shù)據(jù)進(jìn)行“修補(bǔ)”,指向正確的位置
- 符號(hào)解析和重定位具體作用或者說(shuō)過程是怎么樣的?
- 符號(hào)解析:當(dāng)一個(gè)目標(biāo)文件中引用了其他目標(biāo)文件的符號(hào)時(shí),該目標(biāo)文件是不知道這個(gè)符號(hào)正確的地址是多少,只有鏈接時(shí)才可以在其他目標(biāo)文件找到符號(hào)定義和地址,尋找外部符號(hào)地址的過程就是”符號(hào)解析“;解析外部符號(hào)后需要修正外部符號(hào)引用的地址,這個(gè)修正過程就叫做“重定位”
關(guān)于編譯鏈接的幾個(gè)自問自答
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。