testDynamicLoader.cxx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*=========================================================================
  2. Program: KWSys - Kitware System Library
  3. Module: $RCSfile$
  4. Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
  5. See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even
  7. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  8. PURPOSE. See the above copyright notices for more information.
  9. =========================================================================*/
  10. #include "kwsysPrivate.h"
  11. #include KWSYS_HEADER(DynamicLoader.hxx)
  12. #include KWSYS_HEADER(ios/iostream)
  13. #include KWSYS_HEADER(stl/string)
  14. #if defined(__BEOS__)
  15. #include <be/kernel/OS.h> /* disable_debugger() API. */
  16. #endif
  17. // Work-around CMake dependency scanning limitation. This must
  18. // duplicate the above list of headers.
  19. #if 0
  20. # include "DynamicLoader.hxx.in"
  21. # include "kwsys_ios_iostream.h.in"
  22. # include "kwsys_stl_string.hxx.in"
  23. #endif
  24. #include "testSystemTools.h"
  25. kwsys_stl::string GetLibName(const char* lname)
  26. {
  27. // Construct proper name of lib
  28. kwsys_stl::string slname;
  29. slname = EXECUTABLE_OUTPUT_PATH;
  30. #ifdef CMAKE_INTDIR
  31. slname += "/";
  32. slname += CMAKE_INTDIR;
  33. #endif
  34. slname += "/";
  35. slname += kwsys::DynamicLoader::LibPrefix();
  36. slname += lname;
  37. slname += kwsys::DynamicLoader::LibExtension();
  38. return slname;
  39. }
  40. /* libname = Library name (proper prefix, proper extension)
  41. * System = symbol to lookup in libname
  42. * r1: should OpenLibrary succeed ?
  43. * r2: should GetSymbolAddress succeed ?
  44. * r3: should CloseLibrary succeed ?
  45. */
  46. int TestDynamicLoader(const char* libname, const char* symbol, int r1, int r2, int r3)
  47. {
  48. kwsys_ios::cerr << "Testing: " << libname << kwsys_ios::endl;
  49. kwsys::DynamicLoader::LibraryHandle l
  50. = kwsys::DynamicLoader::OpenLibrary(libname);
  51. // If result is incompatible with expectation just fails (xor):
  52. if( (r1 && !l) || (!r1 && l) )
  53. {
  54. kwsys_ios::cerr
  55. << kwsys::DynamicLoader::LastError() << kwsys_ios::endl;
  56. return 1;
  57. }
  58. kwsys::DynamicLoader::SymbolPointer f
  59. = kwsys::DynamicLoader::GetSymbolAddress(l, symbol);
  60. if( (r2 && !f) || (!r2 && f) )
  61. {
  62. kwsys_ios::cerr
  63. << kwsys::DynamicLoader::LastError() << kwsys_ios::endl;
  64. return 1;
  65. }
  66. #ifndef __APPLE__
  67. int s = kwsys::DynamicLoader::CloseLibrary(l);
  68. if( (r3 && !s) || (!r3 && s) )
  69. {
  70. kwsys_ios::cerr
  71. << kwsys::DynamicLoader::LastError() << kwsys_ios::endl;
  72. return 1;
  73. }
  74. #else
  75. (void)r3;
  76. #endif
  77. return 0;
  78. }
  79. int main(int argc, char *argv[])
  80. {
  81. #if defined(_WIN32)
  82. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
  83. #elif defined(__BEOS__)
  84. disable_debugger(1);
  85. #endif
  86. int res;
  87. if( argc == 3 )
  88. {
  89. // User specify a libname and symbol to check.
  90. res = TestDynamicLoader(argv[1], argv[2],1,1,1);
  91. return res;
  92. }
  93. // Make sure that inexistant lib is giving correct result
  94. res = TestDynamicLoader("azerty_", "foo_bar",0,0,0);
  95. // Make sure that random binary file cannnot be assimilated as dylib
  96. res += TestDynamicLoader(TEST_SYSTEMTOOLS_BIN_FILE, "wp",0,0,0);
  97. #ifdef __linux__
  98. // This one is actually fun to test, since dlopen is by default loaded...wonder why :)
  99. res += TestDynamicLoader("foobar.lib", "dlopen",0,1,0);
  100. res += TestDynamicLoader("libdl.so", "dlopen",1,1,1);
  101. res += TestDynamicLoader("libdl.so", "TestDynamicLoader",1,0,1);
  102. #endif
  103. // Now try on the generated library
  104. kwsys_stl::string libname = GetLibName("testDynload");
  105. res += TestDynamicLoader(libname.c_str(), "dummy",1,0,1);
  106. res += TestDynamicLoader(libname.c_str(), "TestDynamicLoaderSymbolPointer",1,1,1);
  107. res += TestDynamicLoader(libname.c_str(), "_TestDynamicLoaderSymbolPointer",1,0,1);
  108. res += TestDynamicLoader(libname.c_str(), "TestDynamicLoaderData",1,1,1);
  109. res += TestDynamicLoader(libname.c_str(), "_TestDynamicLoaderData",1,0,1);
  110. return res;
  111. }