2012-02-22 79 views
2

我有一個庫foo,爲此我生成了一個靜態對象(libfoo.a)。將靜態對象中的符號複製到共享對象

我有第二個庫,爲此我生成了一個共享對象(libbar.so),它從libfoo.a中選取一些符號。

我有第三個庫,巴茲,我試圖鏈接到酒吧。在調用鏈接器時,我會遇到關於條中缺少符號的錯誤(對應於foo中的符號)。 nm告訴我這些符號存在於libfoo.a中,但不在libbar.so中;然而,在libbar.so中有一些來自libfoo.a的符號。

爲什麼不是所有的符號都被複制?

回答

5

A .a庫不是「靜態對象」。 A .a文件是一個檔案,理論上與tar類似,但格式不同,並且由ar命令生成。檔案中的每個對象都是不同的和獨立的。通常這些對象是.o文件,它們是編譯的,未鏈接的對象。這些.o文件之一中的所有符號將在鏈接期間包含在另一個文件中(ld)。但是,在鏈接過程中並不需要存檔中的所有對象,其他對象文件中的符號將不會在鏈接文件中看到。

例如,在libdialog.a中,有mouse.ocolumns.o目標文件。您的程序使用列,但不使用鼠標功能。所以,你的計劃包括在columns.o所有的符號,但沒有在mouse.o符號被包括在內。

隨着一個「共享對象」(.so),它是一個單一的對象,所以對連接它將包括在對象中的所有符號,需要與否。在上面的例子中,如果我們鏈接到libdialog.so,那麼程序將包括來自columns.omouse.o的符號,即使沒有使用基於鼠標的代碼。

當生成共享對象(.so)時,使用歸檔文件時會應用相同的鏈接規則(.a)。所以.so文件將只包括在存檔文件.o所使用的符號。

+0

感謝您的澄清。但在我的場景中,baz並沒有使用任何該欄沒有的東西,那麼爲什麼它會尋找bar中沒有包含在其'.so'中的符號? – notlesh 2012-02-22 05:23:57

+1

沒有看到代碼我無法回答。鏈接器('ld')會查看需要解析的符號並查找任何具有該符號的庫('.a'或'.so')或對象文件。我會採取下一步行動是看哪些符號需要解決的('納米-g')在目標文件進入'libbaz.so'('bas.o'等) – Arcege 2012-02-22 12:55:39