Beispiel #1
0
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);
}
Beispiel #2
0
Datei: orm.cpp Projekt: psfu/ULib
__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);   
}
Beispiel #3
0
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);
}