bool dynamic_link( dynamic_link_handle module, const dynamic_link_descriptor descriptors[], size_t n, size_t required ) { LIBRARY_ASSERT( module != NULL, "Module handle is NULL" ); if ( module == NULL ) { return false; } // if pointer_to_handler *h = (pointer_to_handler*)alloca(n * sizeof(pointer_to_handler)); if ( required == ~(size_t)0 ) required = n; LIBRARY_ASSERT( required<=n, "Number of required entry points exceeds their total number" ); size_t k = 0; for ( ; k < n; ++k ) { dynamic_link_descriptor const & desc = descriptors[k]; #if _WIN32||_WIN64 FARPROC addr = GetProcAddress( module, desc.name ); if ( addr == NULL ) { int err = GetLastError(); DYNAMIC_LINK_WARNING( dl_sym_not_found, desc.name, err ); } // if h[k] = pointer_to_handler( addr ); #else /* !WIN */ void * addr = dlsym( module, desc.name ); if ( addr == NULL ) { char const * err = dlerror(); DYNAMIC_LINK_WARNING( dl_sym_not_found, desc.name, err ); } // if // Lvalue casting is used; this way icc -strict-ansi does not warn about nonstandard pointer conversion (void *&)h[k] = addr; #endif /* !WIN */ if ( !h[k] && k < required ) return false; } LIBRARY_ASSERT( k == n, "if required entries are initialized, all entries are expected to be walked"); // Commit the entry points. // Cannot use memset here, because the writes must be atomic. for( k = 0; k < n; ++k ) *descriptors[k].handler = h[k]; return true; }
bool dynamic_link( void* module, const dynamic_link_descriptor descriptors[], size_t n, size_t required ) { pointer_to_handler *h = (pointer_to_handler*)alloca(n * sizeof(pointer_to_handler)); if ( required == ~(size_t)0 ) required = n; LIBRARY_ASSERT( required<=n, "Number of required entry points exceeds their total number" ); size_t k = 0; for ( ; k < n; ++k ) { #if _WIN32||_WIN64 h[k] = pointer_to_handler(GetProcAddress( (HMODULE)module, descriptors[k].name )); #else // Lvalue casting is used; this way icc -strict-ansi does not warn about nonstandard pointer conversion (void *&)h[k] = dlsym( module, descriptors[k].name ); #endif /* _WIN32||_WIN64 */ if ( !h[k] && k < required ) return false; } LIBRARY_ASSERT( k == n, "if required entries are initialized, all entries are expected to be walked"); // Commit the entry points. // Cannot use memset here, because the writes must be atomic. for( k = 0; k < n; ++k ) *descriptors[k].handler = h[k]; return true; }