2014-10-28 123 views
2

有沒有辦法動態鏈接有依賴關係的共享庫?動態鏈接共享庫與依賴關係

例如,我有兩個庫,libA.so和libB.so. libB.so調用libA.so中定義的函數。

在我的主程序中,我希望用dlopen加載這兩個庫。但是,如果我嘗試:

dlopen(libA.so); 
dlopen(libB.so); 

然後第二個dlopen將失敗,因爲libB具有無法識別的符號。

我可以想到一些解決方法,比如將所有的目標文件構建到一個共享庫中,或者讓libB.so在libA.so上調用dlopen,但這是額外的工作。

我想我想象這個工作的方式就像在內核模塊的情況下,你可以使用「EXPORT_SYMBOL()」來允許其他模塊調用在以前加載的模塊中定義的函數。

可以用共享庫做類似的事情嗎?或者我將不得不使用我的解決方法?

回答

2

我經歷了類似的情況,這是對我工作(使用gcc工具):

當您創建的共享對象libB.so,你無條件鏈接庫libA.so,命令應該是這樣的:

gcc -shared -Wl,--no-as-needed -lA -o libB.so b.o 

然後,您可以檢查libA.so確實成爲了動態鏈接的相關性:

$ ldd libB.so 
    linux-gate.so.1 => (0xb77ba000) 
    libA.so => not found 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75f7000) 
    /lib/ld-linux.so.2 (0xb77bb000) 

在你的主程序中,應該只需要dlopen()libB.so,另一個庫應該由動態鏈接器自動鏈接。

+0

謝謝!這正是我想要的 – Tony 2014-10-30 21:05:47

0

您是否嘗試過使用RTLD_GLOBAL?通過該庫中定義

RTLD_GLOBAL 的符號將被提供用於隨後加載庫的符號解析。

這應該很好地工作,即使B依賴於答:

void * const handleA = dlopen("libA.so", RTLD_NOW | RTLD_GLOBAL); 
void * const handleB = dlopen("libB.so", RTLD_NOW);