我知道這些問題之前已經被問到 - 但我仍然無法將所有內容協調到一個整體畫面。鏈接,加載和虛擬內存
- 靜態VS動態庫
- 靜態庫有自己的代碼複製並鏈接到生成的可執行文件
- 靜態庫只複製所需的模塊鏈接到可執行文件,而不是整個庫實現
- 靜態庫不需要編譯爲PIC,因爲它們是生成的可執行文件的一部分
- 動態庫在描述h的存根中複製和鏈接負載/鏈接(?)運行時的功能實現
- 動態庫可以是PIC或可重定位的
- 爲什麼存在單獨的靜態和動態庫?以上所有內容似乎都是靜態或動態鏈接器的工作。爲什麼我需要2個實現
scanf
的庫? - (獎金#1)共享庫是指什麼?我聽說它被用作(1)總括術語,與庫的同義詞,(2)直接用於動態庫,(3)使用虛擬內存將庫的相同物理內存映射到多個地址空間。你只能用動態庫來做到這一點嗎? (4)在內存中具有相同動態庫的不同版本。
- (獎金#2)是默認情況下動態或靜態鏈接的標準庫(libc,libC++,stdlibC++,..)嗎?我從來不需要
dlopen()
..
- 靜態VS動態鏈接
- 這怎麼比靜態VS動態庫有什麼不同?我不明白爲什麼不只有一個庫,我們使用靜態或動態鏈接器(PIC問題除外)。我們是否應該討論更一般的靜態動態鏈接,而不是談論靜態庫和動態庫?
- 是仍然在編譯時爲兩者執行的符號分辨率?
- 靜態VS動態加載
- 靜態加載裝置執行它之前複製完整的可執行到MM
- 動態加載意味着僅可執行標頭執行前複製到MM,附加功能被裝入MM請求時。這與分頁有什麼不同?
- 如果可執行文件是動態鏈接的,爲什麼不能動態加載?
- 靜態負載和動態加載可能會或可能不會進行拆遷
我知道有很多事情我感到困惑在這裏 - 我沒有必要找人來解決每個問題。我希望通過列出所有令我困惑的事情,理解這一點的人會看到我理解中的失誤在廣泛的層面上,並且能夠描繪出這些事物如何協作的更大的圖片。
如果在Linux上,請閱讀[Drepper的論文:*如何編寫共享庫*](http://people.redhat.com/drepper/dsohowto.pdf)。這是一篇很長的論文,但它回答了你的大部分問題。 – 2014-11-04 20:45:32
@BasileStarynkevitch謝謝你的論文 - 我會讀它!操作系統的概念差異很大嗎? – user167524 2014-11-04 20:48:32
另請參見[Levine的書:*鏈接器和加載器*](http://www.iecc.com/linker/) – 2014-11-04 20:49:12