這一章重讀讀了比較久。按照書裡參考文獻說明這一欄的說明,鏈結處在編譯器、計算機體系結構和作業系統的交叉點上,要求理解**生成、機器語言程式設計、程式例項化和虛擬儲存器。這一章和上一章的風格相去甚遠,上一章給我留下的就是不斷的計算、更優的計算,這一章記憶為主。現在重讀,感覺有些工具是可以記錄一下的。這一章裡,我比較關注實際工具的使用,以及命令本身。對於編譯原理不做深究。
靜態鏈結過程
靜態鏈結器ld
【可重定位目標檔案(*.o)】
靜態全域性變數、非靜態全域性變數、靜態區域性變數、非靜態區域性變數都放在什麼位置?
使用gnu readelf工具顯示.o檔案的符號表表目
符號解析
帶像gcc-warn-common呼叫鏈結器(ld),解析多定義的全域性符號定義時,輸出一條警告資訊。
靜態庫 *.a
將所有標準c函式放在乙個單獨的可重定位目標模組中
為每個標準函式建立乙個分離的可重定位檔案
【存檔】一組連線起來的可重定位目標檔案的集合,頭部描述每個成員目標檔案的大小和位置。unix下建立可以使用ar工具:
使用靜態庫解析引用
出於以上考慮,要十分注意編譯時的依賴需求(從右往左為依賴增加?)。如果出現兩個靜態庫互相依賴,比如libx.a與liby.a互相依賴,則需要在命令裡寫"libx.a liby.a libx.a",也即libx.a重寫一遍。
【可執行目標檔案(p)】
【共享目標檔案,動態鏈結共享庫(unix, *.so; microsoft, *dll)】
共享-fpic指示生成與位置無關**。-shared指示鏈結器建立乙個共享的目標檔案。
unix> gcc -o p2 main2.c ./libvector.so從應用程式中載入和鏈結共享庫
【pic】不做贅述
【gnu binutils】
深入理解計算機第七章
在第七章鏈結中,鏈結可以在編譯時由經他編譯器完成,也可以在載入時和執行時由動態鏈結器來完成。鏈結器處理可以為目標檔案的二進位制檔案,它有三種不同的形式 可重定位和可執行和共享的。靜態鏈結是由像gcc這樣的編譯驅動器呼叫的。多個目標檔案可以被絨對映到儲存器中,並執行這個程式。載入器將可執行檔案的內容對...
《深入理解計算機系統》第七章讀書筆記
前言 鏈結是將各種 和資料部分收集起來並組合成為乙個單一檔案的過程,這個檔案可被載入 或拷貝 到儲存器並執行。鏈結可以執行於編譯時,也就是在源 被翻譯成機器 時 也可以執行於載入時,也就是在程式被載入器載入到儲存器並執行時 甚至執行於執行時,由應用程式來執行。在早期的計算機系統中,鏈結是手動執行的。...
《深入理解計算機系統》 鏈結
一.原始檔到目標檔案的轉化過程 1 過程 預處理 編譯 彙編 鏈結 2 圖示及解析 預處理階段 預處理器 cpp 根據以字元 開頭的命令,修改原始的c程式。結果就得到另外乙個c程式,通常是以.i作為副檔名。即.c檔案轉化為.i檔案的過程。編譯階段 編譯器 ccl 將文字檔案.i翻譯成文字檔案.s,它...