windows: Provide wrappers for dlopen() function family
This commit is contained in:
@@ -21,7 +21,9 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifdef HAVE_DLADDR
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#endif
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|||||||
@@ -150,4 +150,85 @@ static inline struct tm *localtime_r(const time_t *timep, struct tm *result)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dlerror(3) from <dlfcn.h>, printing error to an alloca() buffer
|
||||||
|
*/
|
||||||
|
#define dlerror() \
|
||||||
|
({ \
|
||||||
|
char buf[128], *out;\
|
||||||
|
ssize_t len; \
|
||||||
|
DWORD err; \
|
||||||
|
err = GetLastError(); \
|
||||||
|
len = FormatMessage(0, NULL, err, 0, buf, sizeof(buf), NULL); \
|
||||||
|
if (len <= 0) \
|
||||||
|
{ \
|
||||||
|
len = snprintf(buf, sizeof(buf), "(%u)", err); \
|
||||||
|
} \
|
||||||
|
len++; \
|
||||||
|
out = alloca(len); \
|
||||||
|
memcpy(out, buf, len); \
|
||||||
|
out; \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazy binding, ignored on Windows
|
||||||
|
*/
|
||||||
|
#define RTLD_LAZY 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dlopen(3) from <dlfcn.h>
|
||||||
|
*/
|
||||||
|
static inline void *dlopen(const char *filename, int flag)
|
||||||
|
{
|
||||||
|
return LoadLibrary(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default handle targeting .exe
|
||||||
|
*/
|
||||||
|
#define RTLD_DEFAULT (NULL)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find symbol in next library
|
||||||
|
*/
|
||||||
|
#define RTLD_NEXT ((void*)~(uintptr_t)0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dlsym() from <dlfcn.h>
|
||||||
|
*/
|
||||||
|
static inline void *dlsym(void *handle, const char *symbol)
|
||||||
|
{
|
||||||
|
if (handle == RTLD_DEFAULT)
|
||||||
|
{
|
||||||
|
handle = GetModuleHandle(NULL);
|
||||||
|
}
|
||||||
|
else if (handle == RTLD_NEXT)
|
||||||
|
{
|
||||||
|
if (strcmp(symbol, "malloc") == 0 ||
|
||||||
|
strcmp(symbol, "realloc") == 0 ||
|
||||||
|
strcmp(symbol, "free") == 0)
|
||||||
|
{
|
||||||
|
/* for leak-detective */
|
||||||
|
handle = GetModuleHandle("msvcrt");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (handle)
|
||||||
|
{
|
||||||
|
return GetProcAddress((HMODULE)handle, symbol);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dlclose() from <dlfcn.h>
|
||||||
|
*/
|
||||||
|
static inline int dlclose(void *handle)
|
||||||
|
{
|
||||||
|
return FreeLibrary((HMODULE)handle);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /** WINDOWS_H_ @}*/
|
#endif /** WINDOWS_H_ @}*/
|
||||||
|
|||||||
Reference in New Issue
Block a user