2012-01-13 82 views
0

在Solaris中,我有一個exe文件,按照指南我需要添加一個共享庫(.so)來擴展功能。我創建了一個lthmyplugin.so文件,並按照所述添加。現在,utlity運行完美,直到它調用我的函數調用我的函數後失敗。EMF文件(.so)調試,找不到符號VTable錯誤

問題:

  1. 有什麼辦法調試?
  2. 當我運行命令桁架它標識aa.so

而且LDD -d lthmyplugin.so顯示,除了

symbol not found: __1cIMyPluginG__vtbl_   (./lthmyplugin.so)  
    symbol not found: __1cIThPluginG__vtbl_   (./lthmyplugin.so)  
    symbol not found: __1cOThLocalOptionsG__vtbl_   (./lthmyplugin.so)  
    symbol not found: __1cJThOptionsG__vtbl_    (./lthmyplugin.so)  

沒有錯誤這可能會導致程序失敗?

僅供參考,我沒有使用任何虛函數,構造函數和析構函數

這是什麼意思沒有找到符號:_ 1cIThPluginG _vtbl_?

感謝,

+0

嘗試運行通過'cppfilt'名稱。我將成爲該類的vtable(虛擬函數調度表)。 – Rup 2012-01-13 11:33:32

+0

@RUP cppfilt不可用是否有任何其他選項 – AKS 2012-01-13 11:52:37

+0

應該是C++ filt,而不是cppfilt。 – alanc 2012-01-16 16:52:57

回答

2

可以使用nm工具查看由露出文件中的函數。您可以撥打電話:

nm -g lthmyplugin.so 

...查看它公開的功能。除此之外,考慮到你已經將這個標籤標記爲C++,我將採取刺探並問:你是否指定了C風格的調用約定?如果你不這樣做,它會破壞名字,使它們變得醜陋,難以理解,在99.9%的案例中,這些名稱是不可取的。你可以告訴GCC不加__attribute __((CDECL)),像這樣以裂傷您的功能:

int not_mangled(int some_arg) __attribute__((cdecl)) 
{ 
    return some_arg * 3; 
}