testDynamicLoader.cxx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*============================================================================
  2. KWSys - Kitware System Library
  3. Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
  4. Distributed under the OSI-approved BSD License (the "License");
  5. see accompanying file Copyright.txt for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even the
  7. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the License for more information.
  9. ============================================================================*/
  10. #include "kwsysPrivate.h"
  11. #include KWSYS_HEADER(DynamicLoader.hxx)
  12. #if defined(__BEOS__) || defined(__HAIKU__)
  13. #include <be/kernel/OS.h> /* disable_debugger() API. */
  14. #endif
  15. // Work-around CMake dependency scanning limitation. This must
  16. // duplicate the above list of headers.
  17. #if 0
  18. # include "DynamicLoader.hxx.in"
  19. #endif
  20. #include <string>
  21. #include <iostream>
  22. // Include with <> instead of "" to avoid getting any in-source copy
  23. // left on disk.
  24. #include <testSystemTools.h>
  25. static std::string GetLibName(const char* lname)
  26. {
  27. // Construct proper name of lib
  28. std::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. static int TestDynamicLoader(const char* libname, const char* symbol, int r1, int r2, int r3)
  47. {
  48. std::cerr << "Testing: " << libname << std::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. std::cerr
  55. << kwsys::DynamicLoader::LastError() << std::endl;
  56. return 1;
  57. }
  58. kwsys::DynamicLoader::SymbolPointer f
  59. = kwsys::DynamicLoader::GetSymbolAddress(l, symbol);
  60. if( (r2 && !f) || (!r2 && f) )
  61. {
  62. std::cerr
  63. << kwsys::DynamicLoader::LastError() << std::endl;
  64. return 1;
  65. }
  66. #ifndef __APPLE__
  67. int s = kwsys::DynamicLoader::CloseLibrary(l);
  68. if( (r3 && !s) || (!r3 && s) )
  69. {
  70. std::cerr
  71. << kwsys::DynamicLoader::LastError() << std::endl;
  72. return 1;
  73. }
  74. #else
  75. (void)r3;
  76. #endif
  77. return 0;
  78. }
  79. int testDynamicLoader(int argc, char *argv[])
  80. {
  81. #if defined(_WIN32)
  82. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
  83. #elif defined(__BEOS__) || defined(__HAIKU__)
  84. disable_debugger(1);
  85. #endif
  86. int res = 0;
  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. // dlopen() on Syllable before 11/22/2007 doesn't return 0 on error
  94. #ifndef __SYLLABLE__
  95. // Make sure that inexistent lib is giving correct result
  96. res += TestDynamicLoader("azerty_", "foo_bar",0,0,0);
  97. // Make sure that random binary file cannot be assimilated as dylib
  98. res += TestDynamicLoader(TEST_SYSTEMTOOLS_SOURCE_DIR "/testSystemTools.bin", "wp",0,0,0);
  99. #endif
  100. #ifdef __linux__
  101. // This one is actually fun to test, since dlopen is by default loaded...wonder why :)
  102. res += TestDynamicLoader("foobar.lib", "dlopen",0,1,0);
  103. res += TestDynamicLoader("libdl.so", "dlopen",1,1,1);
  104. res += TestDynamicLoader("libdl.so", "TestDynamicLoader",1,0,1);
  105. #endif
  106. // Now try on the generated library
  107. std::string libname = GetLibName(KWSYS_NAMESPACE_STRING "TestDynload");
  108. res += TestDynamicLoader(libname.c_str(), "dummy",1,0,1);
  109. res += TestDynamicLoader(libname.c_str(), "TestDynamicLoaderSymbolPointer",1,1,1);
  110. res += TestDynamicLoader(libname.c_str(), "_TestDynamicLoaderSymbolPointer",1,0,1);
  111. res += TestDynamicLoader(libname.c_str(), "TestDynamicLoaderData",1,1,1);
  112. res += TestDynamicLoader(libname.c_str(), "_TestDynamicLoaderData",1,0,1);
  113. return res;
  114. }