|
@@ -16,20 +16,7 @@
|
|
|
=========================================================================*/
|
|
=========================================================================*/
|
|
|
#include "cmDynamicLoader.h"
|
|
#include "cmDynamicLoader.h"
|
|
|
|
|
|
|
|
-extern "C"
|
|
|
|
|
-{
|
|
|
|
|
-cmDynamicLoaderFunction cmDynamicLoaderGetSymbolAddress(cmLibHandle,
|
|
|
|
|
- const char*);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Dispatch to C implementation.
|
|
|
|
|
-cmDynamicLoaderFunction cmDynamicLoader::GetSymbolAddress(cmLibHandle lib,
|
|
|
|
|
- const char* sym)
|
|
|
|
|
-{
|
|
|
|
|
- return cmDynamicLoaderGetSymbolAddress(lib, sym);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// This file is actually 4 different implementations.
|
|
|
|
|
|
|
+// This file is actually several different implementations.
|
|
|
// 1. HP machines which uses shl_load
|
|
// 1. HP machines which uses shl_load
|
|
|
// 2. Apple OSX which uses NSLinkModule
|
|
// 2. Apple OSX which uses NSLinkModule
|
|
|
// 3. Windows which uses LoadLibrary
|
|
// 3. Windows which uses LoadLibrary
|
|
@@ -53,6 +40,19 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+cmDynamicLoaderFunction
|
|
|
|
|
+cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
|
|
|
|
|
+{
|
|
|
|
|
+ void* addr;
|
|
|
|
|
+ int status;
|
|
|
|
|
+
|
|
|
|
|
+ status = shl_findsym (&lib, sym, TYPE_PROCEDURE, &addr);
|
|
|
|
|
+ void* result = (status < 0) ? (void*)0 : addr;
|
|
|
|
|
+
|
|
|
|
|
+ // Hack to cast pointer-to-data to pointer-to-function.
|
|
|
|
|
+ return *reinterpret_cast<cmDynamicLoaderFunction*>(&result);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
|
{
|
|
{
|
|
|
return "lib";
|
|
return "lib";
|
|
@@ -92,6 +92,22 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+cmDynamicLoaderFunction
|
|
|
|
|
+cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
|
|
|
|
|
+{
|
|
|
|
|
+ void *result=0;
|
|
|
|
|
+ if(NSIsSymbolNameDefined(sym))
|
|
|
|
|
+ {
|
|
|
|
|
+ NSSymbol symbol= NSLookupAndBindSymbol(sym);
|
|
|
|
|
+ if(symbol)
|
|
|
|
|
+ {
|
|
|
|
|
+ result = NSAddressOfSymbol(symbol);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // Hack to cast pointer-to-data to pointer-to-function.
|
|
|
|
|
+ return *reinterpret_cast<cmDynamicLoaderFunction*>(&result);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
|
{
|
|
{
|
|
|
return "";
|
|
return "";
|
|
@@ -136,6 +152,23 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
|
|
|
return (int)FreeLibrary(lib);
|
|
return (int)FreeLibrary(lib);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+cmDynamicLoaderFunction
|
|
|
|
|
+cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
|
|
|
|
|
+{
|
|
|
|
|
+ void* result = 0;
|
|
|
|
|
+#ifdef UNICODE
|
|
|
|
|
+ wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)];
|
|
|
|
|
+ mbstowcs(wsym, sym, 32000);
|
|
|
|
|
+ void *ret = GetProcAddress(lib, wsym);
|
|
|
|
|
+ delete [] wsym;
|
|
|
|
|
+ result = ret;
|
|
|
|
|
+#else
|
|
|
|
|
+ result = GetProcAddress(lib, sym);
|
|
|
|
|
+#endif
|
|
|
|
|
+ // Hack to cast pointer-to-data to pointer-to-function.
|
|
|
|
|
+ return *reinterpret_cast<cmDynamicLoaderFunction*>(&result);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
|
{
|
|
{
|
|
|
return "";
|
|
return "";
|
|
@@ -188,6 +221,15 @@ int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
|
|
|
return (int)dlclose(lib);
|
|
return (int)dlclose(lib);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+cmDynamicLoaderFunction
|
|
|
|
|
+cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym)
|
|
|
|
|
+{
|
|
|
|
|
+ void* result = dlsym(lib, sym);
|
|
|
|
|
+
|
|
|
|
|
+ // Hack to cast pointer-to-data to pointer-to-function.
|
|
|
|
|
+ return *reinterpret_cast<cmDynamicLoaderFunction*>(&result);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
const char* cmDynamicLoader::LibPrefix()
|
|
|
{
|
|
{
|
|
|
return "lib";
|
|
return "lib";
|