2016-11-10 18 views
0

我想爲必須替換另一個庫的嵌入式系統構建共享庫。我試圖簡單地用相同的符號來構建一個lib。當我將原始庫與mylib進行比較時,會有細微差別。因此,可執行文件在我的假lib中找不到這個符號。使用與另一個lib相同的符號構建一個庫

假lib目錄下:

0000000000000c90 g DF .text 0000000000000098 Base  dbus_pending_call_unref(DBusPendingCall*) 

原始的lib:

0000000000020430 g DF .text 0000000000000070 Base  dbus_pending_call_unref 

正如你可以看到函數的參數是不是在原來的LIB可見。可能這是爲什麼可執行文件找不到符號的原因?我如何使符號中的參數對我的假lib不可見?

我用objdump -TC來查看符號,並在我的src文件中使用了CMake導出頭來導出符號。

+0

假設你正在試圖在不重新編譯使用共享庫的原始庫的情況下執行此操作,因此當您嘗試使用假lib運行二進制文件時,您會收到ldd錯誤或類似錯誤。你得到的錯誤究竟是什麼? – Smeeheey

+1

它知道參數類型。建議你使用C++並忘記'extern「C」'。 –

+0

我得到的錯誤是:符號查找錯誤:/usr/lib64/libtest.so:undefined symbol:dbus_pending_call_unref – Paul

回答

0

您已經指出,該溶液中加入extern "C",但上下文,這裏的答案:

C++允許函數依賴於輸入參數過載,因此,例如以下兩個功能可以分別定義:

void foo(char *bar); 
void foo(const char *bar); 

對於這個工作,你需要確保這些符號是不同的,所以符號名稱是「錯位」,編碼參數作爲符號名稱的一部分。在現代Linux(以及大多數其他現代Unices)上,這種修改的慣例是Itanium convention,它以_Z開頭。可以使用c++filt軟件將這些損壞的符號編碼/解碼爲人類可讀的東西。

相反,C不支持重載函數,所以唯一的函數名稱(而不是其參數)是符號名稱的一部分。

相關問題