2011-05-26 172 views
2

我有一個加載.so插件的可執行文件。動態加載:共享靜態庫中的未定義符號

可執行文件與-rdynamic鏈接,以便可能發生符號回調。

我有一個包含在可執行文件中的靜態庫。這在.a

中有一個叫做BLAH_hello()的功能。在可執行文件中不使用靜態庫。即在可執行代碼中沒有對BLAH_hello()的調用。

但是,.so確實呼叫BLAH_hello()

當我dlopen().so它抱怨未定義符號的BLAH_hello()

如果我包括在可執行代碼BLAH_hello()僞呼叫,像BLAH_hello(NULL);。該符號包含在可執行文件中,並且當加載.so時,它會找到該符號。

我敢肯定,我也可以鏈接.so.a但多個動態加載.so的使用BLAH_hello調用,這樣是有意義的有它的可執行文件。如果我將庫鏈接到每個.so,我也擔心符號衝突。

所以我想知道的是,如何將.a的符號放到可執行文件中,即使它們實際上不是在可執行文件中使用了

+1

將.so與.a鏈接是明顯而正確的事情。 – 2011-05-26 08:23:00

+0

謝謝尼爾。我有三個需要與'.a'鏈接的'.so'插件當我將所有'.so'加載到我的可執行文件中時,我不會遇到符號衝突? – 2011-05-26 17:40:30

+1

不,您不會,否則您將無法在.sos中使用操作系統和其他標準功能。 – 2011-05-26 18:17:10

回答

1

@nbt:

鏈接的.so.a是 明顯的,正確的事情做。

.so加載到可執行文件時,不應該產生符號衝突。

3

當我dlopen的()中的。所以它抱怨未定義符號的BLAH_hello()

如果我包括在可執行代碼BLAH_hello()僞呼叫,像BLAH_hello(NULL);.該符號包含在可執行文件中,並且當.so被加載時,它會找到該符號。

這是完全正常的和預期的。這只是how linkers work with archive libraries

如果您必須在主可執行文件中包含BLAH_hello,請將-Wl,-u,BLAH_hello添加到可執行文件鏈接行。

+0

謝謝,我會試試這個。 :) – 2011-07-26 16:58:11

0

如上所述,鏈接器丟棄沒有引用符號的.o文件。這是問題,當可執行文件需要dlopen()外部共享庫。在這種情況下,當鏈接可執行文件時,可以使用鏈接器選項' - 整個存檔'和' - 無整個存檔'。全部。這些選項之間的庫將包含所有符號。它增加了可執行文件的大小,但是不需要鏈接到可執行文件的靜態庫。