2011-11-26 38 views
0

出於某種原因,下面的代碼會導致SIGSEGV當我嘗試打電話CFShow_New調用函數指針會導致段錯誤?

的類型定義:

typedef void* (*CFShow_XX)(CFTypeRef lol); 

的實際代碼:

ImageLoaderMachO* loader = 
dyld::getDyldImage("/XXX/CoreFoundation"); 

Symbol cfshow_sym = loader->findSymbol("_CFShow"); 
CFShow_XX* CFShow_New = (CFShow_XX*)cfshow_sym.nl.n_value; 

assert(cfshow_sym.nl.n_value == (uint32_t)CFShow); 

CFStringRef str = CFSTR("Test123"); 

CFShow(str); /* Works */ 
(*CFShow_New)(str); /* SIGSEGV's */ 

可能是什麼問題? CFShow是一個extern "C",可能導致它?如果是這樣,我該如何解決?

+0

如果你檢查,而不是假設他們總是返回= NULL的返回值,這將有助於。 –

+0

斷言確認加載的符號是正確的。 –

回答

2

您定義的指針指向功能做到這一點:

CSShow_XX CFShow_New = (CFShow_XX)cfshow_sym.nl.n_value; 

,並呼籲:

CSShow_New(str); 
相關問題