cmDynamicLoader.cxx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*=========================================================================
  2. Program: Insight Segmentation & Registration Toolkit
  3. Module: $RCSfile$
  4. Language: C++
  5. Date: $Date$
  6. Version: $Revision$
  7. Copyright (c) 2002 Insight Consortium. All rights reserved.
  8. See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
  9. This software is distributed WITHOUT ANY WARRANTY; without even
  10. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. PURPOSE. See the above copyright notices for more information.
  12. =========================================================================*/
  13. #include "cmDynamicLoader.h"
  14. extern "C"
  15. {
  16. cmDynamicLoaderFunction cmDynamicLoaderGetSymbolAddress(cmLibHandle,
  17. const char*);
  18. }
  19. // Dispatch to C implementation.
  20. cmDynamicLoaderFunction cmDynamicLoader::GetSymbolAddress(cmLibHandle lib,
  21. const char* sym)
  22. {
  23. return cmDynamicLoaderGetSymbolAddress(lib, sym);
  24. }
  25. // This file is actually 4 different implementations.
  26. // 1. HP machines which uses shl_load
  27. // 2. Apple OSX which uses NSLinkModule
  28. // 3. Windows which uses LoadLibrary
  29. // 4. Most unix systems which use dlopen (default )
  30. // Each part of the ifdef contains a complete implementation for
  31. // the static methods of cmDynamicLoader.
  32. // ---------------------------------------------------------------
  33. // 1. Implementation for HPUX machines
  34. #ifdef __hpux
  35. #define CMDYNAMICLOADER_DEFINED 1
  36. #include <dl.h>
  37. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  38. {
  39. return shl_load(libname, BIND_DEFERRED | DYNAMIC_PATH, 0L);
  40. }
  41. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  42. {
  43. return 0;
  44. }
  45. const char* cmDynamicLoader::LibPrefix()
  46. {
  47. return "lib";
  48. }
  49. const char* cmDynamicLoader::LibExtension()
  50. {
  51. return ".sl";
  52. }
  53. const char* cmDynamicLoader::LastError()
  54. {
  55. return 0;
  56. }
  57. #endif
  58. // ---------------------------------------------------------------
  59. // 2. Implementation for Darwin (including OSX) Machines
  60. #ifdef __APPLE__
  61. #define CMDYNAMICLOADER_DEFINED
  62. #include <mach-o/dyld.h>
  63. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  64. {
  65. NSObjectFileImageReturnCode rc;
  66. NSObjectFileImage image;
  67. rc = NSCreateObjectFileImageFromFile(libname, &image);
  68. return NSLinkModule(image, libname, TRUE);
  69. }
  70. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  71. {
  72. return 0;
  73. }
  74. const char* cmDynamicLoader::LibPrefix()
  75. {
  76. return "";
  77. }
  78. const char* cmDynamicLoader::LibExtension()
  79. {
  80. return ".dylib";
  81. }
  82. const char* cmDynamicLoader::LastError()
  83. {
  84. return 0;
  85. }
  86. #endif
  87. // ---------------------------------------------------------------
  88. // 3. Implementation for Windows win32 code
  89. #ifdef _WIN32
  90. #include <windows.h>
  91. #define CMDYNAMICLOADER_DEFINED 1
  92. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  93. {
  94. #ifdef UNICODE
  95. wchar_t *libn = new wchar_t [mbstowcs(NULL, libname, 32000)];
  96. mbstowcs(libn, libname, 32000);
  97. cmLibHandle ret = LoadLibrary(libn);
  98. delete [] libn;
  99. return ret;
  100. #else
  101. return LoadLibrary(libname);
  102. #endif
  103. }
  104. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  105. {
  106. return (int)FreeLibrary(lib);
  107. }
  108. const char* cmDynamicLoader::LibPrefix()
  109. {
  110. return "";
  111. }
  112. const char* cmDynamicLoader::LibExtension()
  113. {
  114. return ".dll";
  115. }
  116. const char* cmDynamicLoader::LastError()
  117. {
  118. LPVOID lpMsgBuf;
  119. FormatMessage(
  120. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  121. NULL,
  122. GetLastError(),
  123. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  124. (LPTSTR) &lpMsgBuf,
  125. 0,
  126. NULL
  127. );
  128. // Free the buffer.
  129. LocalFree( lpMsgBuf );
  130. static char* str = 0;
  131. delete [] str;
  132. str = strcpy(new char[strlen((char*)lpMsgBuf)+1], (char*)lpMsgBuf);
  133. return str;
  134. }
  135. #endif
  136. // ---------------------------------------------------------------
  137. // 4. Implementation for default UNIX machines.
  138. // if nothing has been defined then use this
  139. #ifndef CMDYNAMICLOADER_DEFINED
  140. #define CMDYNAMICLOADER_DEFINED
  141. // Setup for most unix machines
  142. #include <dlfcn.h>
  143. cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname )
  144. {
  145. return dlopen(libname, RTLD_LAZY);
  146. }
  147. int cmDynamicLoader::CloseLibrary(cmLibHandle lib)
  148. {
  149. return (int)dlclose(lib);
  150. }
  151. const char* cmDynamicLoader::LibPrefix()
  152. {
  153. return "lib";
  154. }
  155. const char* cmDynamicLoader::LibExtension()
  156. {
  157. return ".so";
  158. }
  159. const char* cmDynamicLoader::LastError()
  160. {
  161. return dlerror();
  162. }
  163. #endif