2009-06-20 76 views

回答

10

是的,你需要靜態庫來建立一個靜態鏈接的可執行文件。

靜態庫是編譯對象的包。當靜態鏈接到庫時,它與獲取該庫的編譯結果,在當前項目中解壓縮它們並將它們用作自己的對象相同。

動態庫已經鏈接。這意味着像重定位這樣的信息已經被修復並被拋出。

此外,動態庫必須編譯爲位置無關的代碼。這不是對靜態庫的限制,並且會在某些常見平臺(如x86)上導致性能的顯着差異。

存在諸如ELF Statifier這樣的工具,它們試圖將動態鏈接的庫綁定到動態鏈接的可執行文件中,但在任何情況下都很難生成正確運行的結果。

+1

感謝您的一個很好的答案。但爲什麼這麼難? – 2009-06-20 18:10:13

+2

ELF Statfier加載可執行文件及其所有庫,然後獲取進程內存的快照。當輸出圖像運行時,會導致內存佈局改變的任何事情(例如隨機化的VDSO)將導致錯誤的操作。任何其他方法都需要重新創建動態鏈接器。 – ephemient 2009-06-20 19:00:06

6

沒有靜態編譯,只有靜態鏈接。爲此,您需要靜態庫。靜態鏈接和動態鏈接之間的區別在於,前者的名稱在鏈接時(僅在編譯時之後)解析,而後者則在程序開始運行時解析。

靜態和動態庫可能包含或不包含相同的信息,具體取決於許多因素。關於是否靜態或動態鏈接您的代碼的決定非常重要,並且通常會影響應用程序體系結構。

+0

謝謝,糾正'編譯'爲'鏈接'。 – 2009-06-20 18:06:27

2

鏈接到靜態鏈接程序的所有庫必須是靜態變體。雖然動態(libfoo.so)和靜態(libfoo.a)庫在它們中具有相同的功能,但它們是不同的格式文件,因此您需要程序的匹配類型。