2010-07-08 44 views
1

我正在使用第三方共享庫,我需要檢查一個函數是否以編程方式導出共享庫。如何在程序中檢查共享庫暴露函數

如何做到這一點。我需要這個,因爲如果函數不存在,我需要在本地運行一些其他函數。

+2

嘗試'納米-C -D |如果您使用shell腳本,則使用grep -F'T';在C/C++中使用'dlopen','dlsym'和'dlclose'函數。否則,請至少指定您正在使用的編程語言。 – Philipp 2010-07-08 09:18:09

回答

2

您可以使用dlsym

如果使用dlopen加載庫,您將使用它返回的句柄。

如果你對這個庫鏈接你可以使用特殊的僞句柄(10倍到CAF指點出來):

從對dlsym人:

有兩個特殊的僞 - 手柄,RTLD_DEFAULT和RTLD_NEXT。前者將使用默認庫搜索順序查找所需符號的第一個匹配項。後者將在當前庫之後的搜索順序中查找下一個函數。這使得人們可以在另一個共享庫中的函數中提供一個包裝。

+1

在Linux上,您不需要用'dlopen()'打開它 - 如果目標庫與主程序鏈接,則可以將僞句柄RTLD_DEFAULT傳遞給dlsym()。 – caf 2010-07-08 11:31:23

+0

這是一個很好的說明,謝謝。我會編輯我的答案 – 2010-07-08 14:12:33

+0

這解決了我的問題,謝謝 – Poorna 2010-07-09 05:12:24

0

檢查目標庫的頭文件以獲取函數簽名。 使用dlopen您可以動態加載庫,並在符號庫中顯示並隨後調用dlsym和dlclose時獲取該符號。

0

可能是你可以使用objdump的命令檢查暴露這樣 objdump的-T所有符號libtest.so