diff options
Diffstat (limited to 'Source/kwsys/DynamicLoader.cxx')
-rw-r--r-- | Source/kwsys/DynamicLoader.cxx | 229 |
1 files changed, 100 insertions, 129 deletions
diff --git a/Source/kwsys/DynamicLoader.cxx b/Source/kwsys/DynamicLoader.cxx index 1941d96..e0268c0 100644 --- a/Source/kwsys/DynamicLoader.cxx +++ b/Source/kwsys/DynamicLoader.cxx @@ -1,14 +1,5 @@ -/*============================================================================ - KWSys - Kitware System Library - Copyright 2000-2009 Kitware, Inc., Insight Software Consortium - - Distributed under the OSI-approved BSD License (the "License"); - see accompanying file Copyright.txt for details. - - This software is distributed WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the License for more information. -============================================================================*/ +/* 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) @@ -17,8 +8,8 @@ // Work-around CMake dependency scanning limitation. This must // duplicate the above list of headers. #if 0 -# include "DynamicLoader.hxx.in" -# include "Configure.hxx.in" +#include "Configure.hxx.in" +#include "DynamicLoader.hxx.in" #endif // This file is actually 3 different implementations. @@ -32,15 +23,15 @@ // --------------------------------------------------------------- // 1. Implementation for HPUX machines #ifdef __hpux -#include <errno.h> #include <dl.h> +#include <errno.h> #define DYNAMICLOADER_DEFINED 1 -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname ) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { return shl_load(libname.c_str(), BIND_DEFERRED | DYNAMIC_PATH, 0L); } @@ -48,25 +39,25 @@ DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libna //---------------------------------------------------------------------------- int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) { - if (!lib) - { + if (!lib) { return 0; - } + } return !shl_unload(lib); } //---------------------------------------------------------------------------- -DynamicLoader::SymbolPointer -DynamicLoader::GetSymbolAddress(DynamicLoader::LibraryHandle lib, const std::string& sym) +DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( + DynamicLoader::LibraryHandle lib, const std::string& sym) { void* addr; int status; /* TYPE_PROCEDURE Look for a function or procedure. (This used to be default) - * TYPE_DATA Look for a symbol in the data segment (for example, variables). + * TYPE_DATA Look for a symbol in the data segment (for example, + * variables). * TYPE_UNDEFINED Look for any symbol. */ - status = shl_findsym (&lib, sym.c_str(), TYPE_UNDEFINED, &addr); + status = shl_findsym(&lib, sym.c_str(), TYPE_UNDEFINED, &addr); void* result = (status < 0) ? (void*)0 : addr; // Hack to cast pointer-to-data to pointer-to-function. @@ -88,12 +79,9 @@ const char* DynamicLoader::LastError() * The specified handle is invalid. */ - if( errno == ENOEXEC - || errno == ENOSYM - || errno == EINVAL ) - { + if (errno == ENOEXEC || errno == ENOSYM || errno == EINVAL) { return strerror(errno); - } + } // else return 0; } @@ -102,38 +90,37 @@ const char* DynamicLoader::LastError() #endif //__hpux - // --------------------------------------------------------------- // 2. Implementation for Mac OS X 10.2.x and earlier #ifdef __APPLE__ #if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 -#include <string.h> // for strlen #include <mach-o/dyld.h> +#include <string.h> // for strlen #define DYNAMICLOADER_DEFINED 1 -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname ) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { NSObjectFileImageReturnCode rc; NSObjectFileImage image = 0; rc = NSCreateObjectFileImageFromFile(libname.c_str(), &image); // rc == NSObjectFileImageInappropriateFile when trying to load a dylib file - if( rc != NSObjectFileImageSuccess ) - { + if (rc != NSObjectFileImageSuccess) { return 0; - } - NSModule handle = NSLinkModule(image, libname.c_str(), - NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR); + } + NSModule handle = + NSLinkModule(image, libname.c_str(), NSLINKMODULE_OPTION_BINDNOW | + NSLINKMODULE_OPTION_RETURN_ON_ERROR); NSDestroyObjectFileImage(image); return handle; } //---------------------------------------------------------------------------- -int DynamicLoader::CloseLibrary( DynamicLoader::LibraryHandle lib) +int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) { // NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED // With this option the memory for the module is not deallocated @@ -148,18 +135,17 @@ int DynamicLoader::CloseLibrary( DynamicLoader::LibraryHandle lib) DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::LibraryHandle lib, const std::string& sym) { - void *result=0; + void* result = 0; // Need to prepend symbols with '_' on Apple-gcc compilers size_t len = sym.size(); - char *rsym = new char[len + 1 + 1]; + char* rsym = new char[len + 1 + 1]; strcpy(rsym, "_"); - strcat(rsym+1, sym.c_str()); + strcat(rsym + 1, sym.c_str()); NSSymbol symbol = NSLookupSymbolInModule(lib, rsym); - if(symbol) - { + if (symbol) { result = NSAddressOfSymbol(symbol); - } + } delete[] rsym; // Hack to cast pointer-to-data to pointer-to-function. @@ -183,19 +169,19 @@ const char* DynamicLoader::LastError() #include <windows.h> #define DYNAMICLOADER_DEFINED 1 -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { DynamicLoader::LibraryHandle lh; int length = MultiByteToWideChar(CP_UTF8, 0, libname.c_str(), -1, NULL, 0); - wchar_t* wchars = new wchar_t[length+1]; + wchar_t* wchars = new wchar_t[length + 1]; wchars[0] = '\0'; MultiByteToWideChar(CP_UTF8, 0, libname.c_str(), -1, wchars, length); lh = LoadLibraryW(wchars); - delete [] wchars; + delete[] wchars; return lh; } @@ -231,21 +217,21 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( // // Note that the "@X" part of the name above is the total size (in // bytes) of the arguments on the stack. - void *result; + void* result; #if defined(__BORLANDC__) || defined(__WATCOMC__) // Need to prepend symbols with '_' size_t len = sym.size(); - char *rsym = new char[len + 1 + 1]; + char* rsym = new char[len + 1 + 1]; strcpy(rsym, "_"); strcat(rsym, sym.c_str()); #else - const char *rsym = sym.c_str(); + const char* rsym = sym.c_str(); #endif result = (void*)GetProcAddress(lib, rsym); #if defined(__BORLANDC__) || defined(__WATCOMC__) delete[] rsym; #endif - // Hack to cast pointer-to-data to pointer-to-function. +// Hack to cast pointer-to-data to pointer-to-function. #ifdef __WATCOMC__ return *(DynamicLoader::SymbolPointer*)(&result); #else @@ -256,28 +242,22 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( //---------------------------------------------------------------------------- const char* DynamicLoader::LastError() { - LPVOID lpMsgBuf=NULL; - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - - if(!lpMsgBuf) - { + LPVOID lpMsgBuf = NULL; + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR)&lpMsgBuf, 0, NULL); + + if (!lpMsgBuf) { return NULL; - } + } static char* str = 0; - delete [] str; - str = strcpy(new char[strlen((char*)lpMsgBuf)+1], (char*)lpMsgBuf); + delete[] str; + str = strcpy(new char[strlen((char*)lpMsgBuf) + 1], (char*)lpMsgBuf); // Free the buffer. - LocalFree( lpMsgBuf ); + LocalFree(lpMsgBuf); return str; } @@ -296,44 +276,39 @@ const char* DynamicLoader::LastError() #define DYNAMICLOADER_DEFINED 1 -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { static image_id last_dynamic_err = B_OK; //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname ) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { // image_id's are integers, errors are negative. Add one just in case we // get a valid image_id of zero (is that even possible?). image_id rc = load_add_on(libname.c_str()); - if (rc < 0) - { + if (rc < 0) { last_dynamic_err = rc; return 0; - } + } - return rc+1; + return rc + 1; } //---------------------------------------------------------------------------- int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) { - if (!lib) - { - last_dynamic_err = B_BAD_VALUE; - return 0; - } - else - { + if (!lib) { + last_dynamic_err = B_BAD_VALUE; + return 0; + } else { // The function dlclose() returns 0 on success, and non-zero on error. - status_t rc = unload_add_on(lib-1); - if (rc != B_OK) - { + status_t rc = unload_add_on(lib - 1); + if (rc != B_OK) { last_dynamic_err = rc; return 0; - } } + } return 1; } @@ -343,7 +318,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::LibraryHandle lib, const std::string& sym) { // Hack to cast pointer-to-data to pointer-to-function. - union + union { void* pvoid; DynamicLoader::SymbolPointer psym; @@ -351,29 +326,26 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( result.psym = NULL; - if (!lib) - { - last_dynamic_err = B_BAD_VALUE; - } - else - { + if (!lib) { + last_dynamic_err = B_BAD_VALUE; + } else { // !!! FIXME: BeOS can do function-only lookups...does this ever // !!! FIXME: actually _want_ a data symbol lookup, or was this union // !!! FIXME: a leftover of dlsym()? (s/ANY/TEXT for functions only). - status_t rc = get_image_symbol(lib-1,sym.c_str(),B_SYMBOL_TYPE_ANY,&result.pvoid); - if (rc != B_OK) - { + status_t rc = + get_image_symbol(lib - 1, sym.c_str(), B_SYMBOL_TYPE_ANY, &result.pvoid); + if (rc != B_OK) { last_dynamic_err = rc; result.psym = NULL; - } } + } return result.psym; } //---------------------------------------------------------------------------- const char* DynamicLoader::LastError() { - const char *retval = strerror(last_dynamic_err); + const char* retval = strerror(last_dynamic_err); last_dynamic_err = B_OK; return retval; } @@ -385,15 +357,16 @@ const char* DynamicLoader::LastError() // 5. Implementation for systems without dynamic libs // __gnu_blrts__ is IBM BlueGene/L // __LIBCATAMOUNT__ is defined on Catamount on Cray compute nodes -#if defined(__gnu_blrts__) || defined(__LIBCATAMOUNT__) || defined(__CRAYXT_COMPUTE_LINUX_TARGET) +#if defined(__gnu_blrts__) || defined(__LIBCATAMOUNT__) || \ + defined(__CRAYXT_COMPUTE_LINUX_TARGET) #include <string.h> // for strerror() #define DYNAMICLOADER_DEFINED 1 -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname ) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { return 0; } @@ -401,26 +374,25 @@ DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libna //---------------------------------------------------------------------------- int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) { - if (!lib) - { + if (!lib) { return 0; - } + } return 1; } //---------------------------------------------------------------------------- DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( - DynamicLoader::LibraryHandle lib, const std::string& sym) + DynamicLoader::LibraryHandle lib, const std::string& sym) { return 0; } //---------------------------------------------------------------------------- const char* DynamicLoader::LastError() - { +{ return "General error"; - } +} } // namespace KWSYS_NAMESPACE #endif @@ -428,28 +400,28 @@ const char* DynamicLoader::LastError() #ifdef __MINT__ #define DYNAMICLOADER_DEFINED 1 #define _GNU_SOURCE /* for program_invocation_name */ -#include <string.h> -#include <malloc.h> -#include <errno.h> #include <dld.h> +#include <errno.h> +#include <malloc.h> +#include <string.h> -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname ) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { - char *name = (char *)calloc(1, libname.size() + 1); + char* name = (char*)calloc(1, libname.size() + 1); dld_init(program_invocation_name); strncpy(name, libname.c_str(), libname.size()); dld_link(libname.c_str()); - return (void *)name; + return (void*)name; } //---------------------------------------------------------------------------- int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) { - dld_unlink_by_file((char *)lib, 0); + dld_unlink_by_file((char*)lib, 0); free(lib); return 0; } @@ -485,11 +457,11 @@ const char* DynamicLoader::LastError() // Setup for most unix machines #include <dlfcn.h> -namespace KWSYS_NAMESPACE -{ +namespace KWSYS_NAMESPACE { //---------------------------------------------------------------------------- -DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libname ) +DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( + const std::string& libname) { return dlopen(libname.c_str(), RTLD_LAZY); } @@ -497,11 +469,10 @@ DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const std::string& libna //---------------------------------------------------------------------------- int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) { - if (lib) - { + if (lib) { // The function dlclose() returns 0 on success, and non-zero on error. return !dlclose(lib); - } + } // else return 0; } @@ -511,7 +482,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::LibraryHandle lib, const std::string& sym) { // Hack to cast pointer-to-data to pointer-to-function. - union + union { void* pvoid; DynamicLoader::SymbolPointer psym; |