2012-03-02 14 views
0

我使用我不能加載它的gcc /克+ +在Fedora 116,和我的想法是:我可以加載動態庫函數與鏈接此DL,但在代碼中使用「對dlsym」沒有鏈接這個DL

c program -> load c++ dynamic library A -> load c++ dynamic library B 

C++動態庫B是第三方提供的,我無法對其進行修改。

當complinng C++動態庫中的與連接C++動態庫B,A可以在B.找到符號但是,當我的負載b函數A碼使用 '對dlsym'(未連接),A告訴我

/path/to/B.so: undefined symbol: some_func 

=============================

使用納米-DC

0000000000014a80 T BinarySearch(int, int*, int) 
0000000000007210 T CheckLicense() 
0000000000009370 T GetEnd(stCha*, int&, int) 
000000000000a970 T IC_Exit() 
000000000000a740 T IC_Init(char const*) 

錯誤報告:

/path/to/some.so undefined symbol: IC_Init 

在庫中的代碼:

IC_API bool (* IC_Init)(const char *); 
IC_Init = (IC_API bool (*)(const char *)) dlsym(dl_ic, "IC_Init"); 
if(IC_Init) { 
    printf("function loaded"); 
} 
在庫中的

,它可以使用dlopen加載庫B:

void *dl_ic = dlopen(ic_lib_path, RTLD_LAZY); 
+2

也許你可以顯示A使用的代碼,包括'dlopen()'和'dlsym()'鏈接到B中的函數? – 2012-03-02 01:29:38

+0

當構建'libA.so'時,你鏈接'libB.so'嗎?你使用'-rdynamic'來鏈接你的整個可執行文件。 – 2012-03-02 06:14:17

回答

3

你有沒有考慮名字改編? C++標識符通常會「受到損壞」,以便在其名稱空間和參數中引入信息(歷史上,這有助於鏈接器區分重載函數)。您可能希望使功能extern "C"防止變形,或找到與dlsym一起使用的損壞名稱(例如,Linx在對象上使用nm或在源上使用)。

+0

你的意思是「找到它與dlsym一起使用的名稱」?你的意思是我必須在'dlsym'中使用另一個名稱而不是最初定義的名稱?我已經更新了我的問題,請幫助檢查,謝謝 – 2012-03-02 08:33:46

+0

或者只是取消OP已經發布的nm命令中的'-C'開關,這將關閉符號 - 不加密 – araqnid 2012-03-02 08:34:20

+1

@Mickey:as araqnid指出,您正在使用帶nm的-C開關,以便您可以獲得您在源代碼中使用的可讀功能簽名。在幕後,C++編譯器實際上將它們轉換爲下劃線和字母數字的糾結,編碼函數出現的名稱空間和/或類/結構體作用域以及參數類型和成員函數常量。這是對象符號表中的「真實」符號名稱 - 您需要提供給dlsym的名稱。如果你有'extern「C」IC_API bool IC_Init(const char *)',編譯器不會對它進行破壞。 – 2012-03-02 09:13:46

相關問題