關於鏈結,這些你都知道嗎?

2021-09-30 04:40:25 字數 1008 閱讀 5290

其實乙個靜態庫可以簡單地看成一組目標檔案的集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。

例如visual c++工具lib.exe,這個程式可以用來建立、提取、列舉.lib檔案中的內容。「lib /list libcmt.lib」

鏈結過程中,目標檔案(包括靜態庫中的目標檔案)被鏈結成最終可執行的檔案。鏈結器為它們分配在輸出檔案中的空間和位址,進行符號解析與重定位。

注:鏈結器在鏈結靜態庫的時候是一目標檔案為單位的。比如我們引用了靜態庫中的printf()函式,那麼鏈結器就會把庫中包含printf()函式的那個目標檔案鏈結進來。那些沒有被用到的(或者間接依賴的)目標檔案就不會被鏈結到最終的輸出檔案中。

鏈結過程可控嗎?absolutely yes!

鏈結器一般提供如下三種方法,以用來生成使用者所需要的檔案。

*使用命令列來給鏈結器制定引數,例如ld的-o、-e引數就屬於這類。

*將鏈結指令存放在目標檔案裡面,編譯器通常會通過這種方法向鏈結器傳遞指令。比如visual c++編譯器會把鏈結引數放在pe目標檔案的.drective段以用來傳遞引數。

*使用鏈結控制指令碼。比如intel ia32下的普通可執行elf檔案鏈結指令碼檔案為elf_i386.x;共享庫的鏈結指令碼檔案為elf_i386.xs。其實ld會根據命令列要求使用相應的鏈結指令碼檔案來控制鏈結過程。

注意,請注意。visual c++也允許使用指令碼來控制整個鏈結過程,visual c++把這種控制指令碼叫做模組定義檔案(module-definition file),它們的副檔名一般為.def。(嘿嘿,這下你熟悉了吧!)

對於一些特殊要求的程式,比如作業系統核心、bios(basic input output system)或一些在沒有作業系統的情況下執行的程式(如引導程式boot loader,或者嵌入式系統的程式,或者一些脫離作業系統的硬碟分割槽軟體pqmagic等),以及一些需要特殊鏈結過程的程式,如一些核心驅動等,他們往往受限於一些特殊的條件,因為這些特殊的環境,特別是某些硬體條件的限制,往往對程式的各個段的位址有著特殊的要求。有興趣的話研究一下它們是如何實現鏈結的。

這些你都知道嗎?

如果身邊有胃不好的人,請分享給ta 1 最養胃的,麵條 2 如果熬粥,少放點蘇打進去,3 小公尺粥就饅頭,可以養胃。4 有兩種飲料應該多喝,一是牛奶,二是熱水。5 胃不好,要少食多餐。6 大棗 豆腐 白菜 牛奶 胡蘿蔔 健脾和胃。7 花生,蜂蜜都是養胃的。8 紅茶 蜂蜜.十分養胃。計 喝水 法 1 ...

HTTP狀態碼 這些你都知道嗎

http狀態碼是網路響應的三位數字 下來我們來看一下http狀態碼有哪些,並且有什麼具體意義 狀態碼意義 100表示客戶端應該繼續傳送請求 101伺服器知曉了客戶端的請求,通知客戶端用不同協議完成這個請求 102代表處理將被繼續執行 200表示伺服器已經成功處理了請求 201表示請求成功並且伺服器穿...

pycharm的這些配置,你都知道嗎

1 字型大小調整 2 顯示你需要的工具視窗,比如終端命令列 3 常用一些快捷鍵 4 設定 模板 5 更換預設的用例執行庫 pycharm在安裝後,預設的字型很小,為了方便編寫 都會調的大一些。調整方式 windows file settings editor font mac pycharm pre...