123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
- #include "kwsysPrivate.h"
- #include KWSYS_HEADER(DynamicLoader.hxx)
- #if defined(__BEOS__) || defined(__HAIKU__)
- #include <be/kernel/OS.h> /* disable_debugger() API. */
- #endif
- // Work-around CMake dependency scanning limitation. This must
- // duplicate the above list of headers.
- #if 0
- #include "DynamicLoader.hxx.in"
- #endif
- #include <iostream>
- #include <string>
- // Include with <> instead of "" to avoid getting any in-source copy
- // left on disk.
- #include <testSystemTools.h>
- static std::string GetLibName(const char* lname)
- {
- // Construct proper name of lib
- std::string slname;
- slname = EXECUTABLE_OUTPUT_PATH;
- #ifdef CMAKE_INTDIR
- slname += "/";
- slname += CMAKE_INTDIR;
- #endif
- slname += "/";
- slname += kwsys::DynamicLoader::LibPrefix();
- slname += lname;
- slname += kwsys::DynamicLoader::LibExtension();
- return slname;
- }
- /* libname = Library name (proper prefix, proper extension)
- * System = symbol to lookup in libname
- * r1: should OpenLibrary succeed ?
- * r2: should GetSymbolAddress succeed ?
- * r3: should CloseLibrary succeed ?
- */
- static int TestDynamicLoader(const char* libname, const char* symbol, int r1,
- int r2, int r3)
- {
- std::cerr << "Testing: " << libname << std::endl;
- kwsys::DynamicLoader::LibraryHandle l =
- kwsys::DynamicLoader::OpenLibrary(libname);
- // If result is incompatible with expectation just fails (xor):
- if ((r1 && !l) || (!r1 && l)) {
- std::cerr << kwsys::DynamicLoader::LastError() << std::endl;
- return 1;
- }
- kwsys::DynamicLoader::SymbolPointer f =
- kwsys::DynamicLoader::GetSymbolAddress(l, symbol);
- if ((r2 && !f) || (!r2 && f)) {
- std::cerr << kwsys::DynamicLoader::LastError() << std::endl;
- return 1;
- }
- #ifndef __APPLE__
- int s = kwsys::DynamicLoader::CloseLibrary(l);
- if ((r3 && !s) || (!r3 && s)) {
- std::cerr << kwsys::DynamicLoader::LastError() << std::endl;
- return 1;
- }
- #else
- (void)r3;
- #endif
- return 0;
- }
- int testDynamicLoader(int argc, char* argv[])
- {
- #if defined(_WIN32)
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
- #elif defined(__BEOS__) || defined(__HAIKU__)
- disable_debugger(1);
- #endif
- int res = 0;
- if (argc == 3) {
- // User specify a libname and symbol to check.
- res = TestDynamicLoader(argv[1], argv[2], 1, 1, 1);
- return res;
- }
- // dlopen() on Syllable before 11/22/2007 doesn't return 0 on error
- #ifndef __SYLLABLE__
- // Make sure that inexistent lib is giving correct result
- res += TestDynamicLoader("azerty_", "foo_bar", 0, 0, 0);
- // Make sure that random binary file cannot be assimilated as dylib
- res += TestDynamicLoader(TEST_SYSTEMTOOLS_SOURCE_DIR "/testSystemTools.bin",
- "wp", 0, 0, 0);
- #endif
- #ifdef __linux__
- // This one is actually fun to test, since dlopen is by default
- // loaded...wonder why :)
- res += TestDynamicLoader("foobar.lib", "dlopen", 0, 1, 0);
- res += TestDynamicLoader("libdl.so", "dlopen", 1, 1, 1);
- res += TestDynamicLoader("libdl.so", "TestDynamicLoader", 1, 0, 1);
- #endif
- // Now try on the generated library
- std::string libname = GetLibName(KWSYS_NAMESPACE_STRING "TestDynload");
- res += TestDynamicLoader(libname.c_str(), "dummy", 1, 0, 1);
- res += TestDynamicLoader(libname.c_str(), "TestDynamicLoaderSymbolPointer",
- 1, 1, 1);
- res += TestDynamicLoader(libname.c_str(), "_TestDynamicLoaderSymbolPointer",
- 1, 0, 1);
- res += TestDynamicLoader(libname.c_str(), "TestDynamicLoaderData", 1, 1, 1);
- res += TestDynamicLoader(libname.c_str(), "_TestDynamicLoaderData", 1, 0, 1);
- return res;
- }
|