windows: Provide wrappers for dlopen() function family

This commit is contained in:
Martin Willi
2014-06-03 12:24:34 +02:00
parent 40a924090e
commit 2e6c203bad
2 changed files with 83 additions and 0 deletions
@@ -21,7 +21,9 @@
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#ifdef HAVE_DLADDR
#include <dlfcn.h>
#endif
#include <limits.h>
#include <stdio.h>
+81
View File
@@ -150,4 +150,85 @@ static inline struct tm *localtime_r(const time_t *timep, struct tm *result)
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_ @}*/