void *dlopen(const char *path, int WXUNUSED(mode) /* mode is ignored */)
{
- int dyld_result;
NSObjectFileImage ofile;
NSModule handle = NULL;
- dyld_result = NSCreateObjectFileImageFromFile(path, &ofile);
- if (dyld_result != NSObjectFileImageSuccess)
+ int dyld_result = NSCreateObjectFileImageFromFile(path, &ofile);
+ if ( dyld_result != NSObjectFileImageSuccess )
{
- TranslateError(path, dyld_result);
+ handle = NULL;
}
else
{
- // NSLinkModule will cause the run to abort on any link error's
- // not very friendly but the error recovery functionality is limited.
- handle = NSLinkModule(ofile, path, NSLINKMODULE_OPTION_BINDNOW);
+ handle = NSLinkModule
+ (
+ ofile,
+ path,
+ NSLINKMODULE_OPTION_BINDNOW |
+ NSLINKMODULE_OPTION_RETURN_ON_ERROR
+ );
}
+ if ( !handle )
+ TranslateError(path, dyld_result);
+
return handle;
}
void *dlsym(void *handle, const char *symbol)
{
- void *addr;
-
- NSSymbol nsSymbol = NSLookupSymbolInModule( handle , symbol ) ;
-
- if ( nsSymbol)
- {
- addr = NSAddressOfSymbol(nsSymbol);
- }
- else
- {
- addr = NULL;
- }
- return addr;
+ // as on many other systems, C symbols have prepended underscores under
+ // Darwin but unlike the normal dlopen(), NSLookupSymbolInModule() is not
+ // aware of this
+ wxCharBuffer buf(strlen(symbol) + 1);
+ char *p = buf.data();
+ p[0] = '_';
+ strcpy(p + 1, symbol);
+
+ NSSymbol nsSymbol = NSLookupSymbolInModule( handle, p );
+ return nsSymbol ? NSAddressOfSymbol(nsSymbol) : NULL;
}
#endif // defined(__DARWIN__)
#if defined(__HPUX__)
const wxChar *wxDynamicLibrary::ms_dllext = _T(".sl");
#elif defined(__DARWIN__)
- const wxChar *wxDynamicLibrary::ms_dllext = _T(".dylib");
+ const wxChar *wxDynamicLibrary::ms_dllext = _T(".bundle");
#else
const wxChar *wxDynamicLibrary::ms_dllext = _T(".so");
#endif
#endif
}
-void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const
+void *wxDynamicLibrary::DoGetSymbol(const wxString &name, bool *success) const
{
wxCHECK_MSG( IsLoaded(), NULL,
_T("Can't load symbol from unloaded library") );
- bool failed = FALSE;
void *symbol = 0;
wxUnusedVar(symbol);
#error "runtime shared lib support not implemented"
#endif
+ if ( success )
+ *success = symbol != NULL;
+
+ return symbol;
+}
+
+void *wxDynamicLibrary::GetSymbol(const wxString& name, bool *success) const
+{
+ void *symbol = DoGetSymbol(name, success);
if ( !symbol )
{
#if defined(HAVE_DLERROR) && !defined(__EMX__)
wxLogError(wxT("%s"), err);
}
#else
- failed = TRUE;
wxLogSysError(_("Couldn't find symbol '%s' in a dynamic library"),
name.c_str());
#endif
}
- if( success )
- *success = !failed;
return symbol;
}
-
/*static*/
wxString
wxDynamicLibrary::CanonicalizeName(const wxString& name,