void* UDynamic::operator[](const char* _sym) { U_TRACE(0, "UDynamic::operator[](%S)", _sym) U_CHECK_MEMORY U_INTERNAL_ASSERT_POINTER(handle) #if defined(_MSWINDOWS_) addr = (void*) ::GetProcAddress(handle, _sym); #else addr = U_SYSCALL(dlsym, "%p,%S", handle, _sym); #endif if (addr == 0) { # if defined(_MSWINDOWS_) err = "symbol missing"; # else err = ::dlerror(); # endif U_WARNING("UDynamic::operator[](%S) failed: %.*S", _sym, 256, err); } U_RETURN(addr); }
__noreturn U_NO_EXPORT void UOrmSession::loadDriverFail(const char* ptr, uint32_t len) { U_TRACE(0, "UOrmSession::loadDriverFail(%.*S,%u)", len, ptr, len) U_WARNING("Load of ORM driver failed: %.*S", len, ptr); U_EXIT(EXIT_FAILURE); }
bool UDynamic::load(const char* pathname) { U_TRACE(0, "UDynamic::load(%S)", pathname) U_CHECK_MEMORY U_INTERNAL_ASSERT_EQUALS(handle, 0) #ifdef _MSWINDOWS_ handle = ::LoadLibrary(pathname); #else /** * -------------------------------------------------------------------- * Perform lazy binding * -------------------------------------------------------------------- * Only resolve symbols as the code that references them is executed. * If the symbol is never referenced, then it is never resolved. * Lazy binding is only performed for function references; references * to variables are always immediately bound when the library is loaded * -------------------------------------------------------------------- */ handle = U_SYSCALL(dlopen, "%S,%d", pathname, RTLD_LAZY); // RTLD_NOW #endif if (handle == 0) { # if defined(_MSWINDOWS_) err = "load failed"; # else err = ::dlerror(); # endif U_WARNING("UDynamic::load(%S) failed: %.*S", pathname, 256, err); U_RETURN(false); } #ifndef _MSWINDOWS_ (void) ::dlerror(); /* Clear any existing error */ #endif U_RETURN(true); }