2012-06-29 79 views
0

我有了動態庫加載與鏈接到靜態庫

靜態庫(ACE)

靜態庫(common.a)

動態庫插件1(1的程序結構的.so)

插件2(2.so)和可執行

plugin1, plugin2 and executable都使用common.alibACE.a 按照教程在這裏:http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

我只能鏈接編譯可執行文件時這兩個靜態庫,如下圖所示:

g++ -g -DUNIX -DLINUX -Wall -D__NUMBER_FIELD_ID__ -I/opt/ACE_wrappers -Ilib/ -I. -I./common -I./common/lib -I../inc -I/opt/pct/pctlib/inc -o acs_d acs_d.o -L../lib -Wl,--export-dynamic -rdynamic -Wl,--whole-archive /opt/ACE_wrappers/ace/libACE.a common/libcommon_d.a -Wl,--no-whole-archive -ldl -lrt -lpthread 

的一點是,當我使用的dlopen打開這兩個插件,一個成功,一個失敗 成功的一個使用是如下所示抱怨未定義的符號錯誤的詳細ACE功能和:

[CModuleMgr] loadCModule(): Errors occurred when opening the module. nCModuleId[1] pLibHandle[(nil)] sCModulePath[/opt/acs/adapter/libadapter_d.so] sError[/opt/acs/adapter/libadapter_d.so: undefined symbol: _ZN17ACE_Event_Handler10set_handleEi] 

對於主程序中,我曾嘗試使用命令納米找到符號

$ nm acs_d | grep _ZN17ACE_Event_Handler10set_handleEi 
000000000048f240 t _ZN17ACE_Event_Handler10set_handleEi 

它在那裏,但插件無法找到它!我使用了像-Wl,--export-dynamic -rdynamic -Wl,--whole-archive.這樣的選項,但它仍然找不到這個符號。任何想法?

回答

0

它在那裏,但插件找不到它!

不,符號是不是那裏!

或者更確切地說,該符號具有內部聯動(t),並且在其鏈接到的ELF圖像之外不可見或不可用。全局可見符號具有外部鏈接(T)。

符號具有t鏈接的最可能原因是該符號在源級別具有__attribute__((visibility("hidden")))。文檔here

爲什麼ACE開發者將它標記爲這樣,我不知道。