講完鏈結之後,接著講載入(load),但是載入不是最重要的,而是第二重要的,其中包括了動態鏈結部分,所以這一章的主題是鏈結。
作者列出了4大好處來**我們看本章:
理解鏈結器將幫助你理解語言作用域規則是如何實現的(個人體會:鏈結器只關心全域性符號和static符號,不關心區域性變數,區域性變數是棧的事情)。
理解鏈結器將幫助你理解其他重要的系統概念(比如載入和執行程式,虛擬儲存器,分頁和儲存器對映)
理解鏈結器將使你能夠利用共享庫(so、dll檔案)
預處理程式:預處理器(cpp)
輸入: .c檔案
輸出:.i檔案(linux)
簡述:將.c檔案中的.h檔案插入到到.c檔案中,以及巨集替換,原來的.c檔案會得到大大的擴張,但是對人來說,.i檔案是可以用文字編輯器開啟閱讀的。 編譯
程式:預處理器(ccl)
輸入: .i檔案
輸出:.s檔案(linux)
簡述:將原始檔翻譯成彙編**,此時對人來說,雖然晦澀了點,但是勉強還能讀,也可以用文字編輯器開啟閱讀。 彙編
程式:預處理器(as)
輸入: .s檔案
輸出:.o檔案(linux)或.obj(windows pe)—統稱目標檔案
簡述:此時彙編**變成二進位制的機器碼,對於絕大多數人來說看不懂的,除非晶元設計的專家級人物,如果強行用用文字編輯器開啟閱讀,只會看見你看不懂的亂碼,不信你就試試(vs的工程裡有不少這樣的檔案) 鏈結
程式:鏈結器(linker)
輸入: .o檔案和靜態庫檔案
輸出:a.out檔案(linux)、.exe(windows pe)、elf檔案(linux)或庫檔案(靜態和動態)
簡述:終於到了萬里長征倒數第二步。也是最關鍵的一步,前面那麼多鋪墊,最終匯流到這裡。這一步絕非易事,難點在於符號解析和重定位,由此引申出了靜態庫和動態庫技術。這一步為每乙個符號連上乙個實際的儲存位址,為載入器指明道路。 載入
程式:載入器(loader)
輸入: elf, .exe 檔案
輸出:程序
簡述:這才是萬里長征最後一步,這一步包括了不少內容,如執行緒的開闢,虛擬位址空間,位址對映,動態載入動態庫等,但這不是本章的主要內容。
我個人覺得是符號解析和重定位,總感覺尊敬的兩位作者在這裡描述了個大概,看了幾遍都覺得沒講透。作者在章末也說鏈結記錄過程沒有詳細的文獻可以參考,只能得到大概的面貌。
話雖如此,但是後續我將繼續整理符號解析和重定位的知識,以我的理解來描寫。
CSAPP第七章筆記
第七章總結圖 注意 1.在linux系統中,生成動態庫時執行的命令 gcc fpic shared o 其中 shared是表明在裝載時進行重定位,fpic是表明生成位址無關 2.顯示使用動態庫的方法 linux系統中 呼叫dlopen dlsym dlerror dlclose 這四個函式進行動態...
第七章筆記
程序就是cpu未完成的工作 檢視程序的相關命令 ps a 關於當前環境的所有程序 x 與當前環境無關的所有程序 f 顯示程序從屬關係 e 顯示當前使用者環境中的所有程序 l 長列表顯示程序的詳細資訊 u 顯示程序的使用者資訊 ps ax o cpu,mem,user,group,comm,nice,...
Think in java第七章筆記
1.通過繼承可將乙個物件當做它自己的型別或者它自己的基礎型別對待。這種能力是非常重要的,因為多個型別 從相同的基礎類中衍生出來 可被當做同一型別對待。而且只需要一段 即可對所有不同的型別進行同樣的處理。2.將乙個方法呼叫同乙個方法主體連線到一起就稱為繫結。若一種語言實現了動態繫結,同時必須提供一些機...