From 585938123d122a24107d358195b8e31f7e472d95 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Wed, 14 Sep 2011 07:44:09 +0000 Subject: [PATCH] Evil: add RTLD_DEFAULT support for dlsym() SVN revision: 63373 --- legacy/evil/ChangeLog | 5 +++ legacy/evil/src/lib/dlfcn/Makefile.am | 4 +-- legacy/evil/src/lib/dlfcn/dlfcn.c | 45 +++++++++++++++++++++------ legacy/evil/src/lib/dlfcn/dlfcn.h | 6 ++++ legacy/evil/src/lib/evil_util.c | 4 ++- 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/legacy/evil/ChangeLog b/legacy/evil/ChangeLog index f6ebdd5593..4dce120be6 100644 --- a/legacy/evil/ChangeLog +++ b/legacy/evil/ChangeLog @@ -1,3 +1,8 @@ +2011-09-14 Vincent Torri + + * src/lib/dlfcn/dlfcn.c: + add RTLD_DEFAULT support in dlsym() + 2011-05-19 Vincent Torri * src/lib/dlfcn/dlfcn.c: diff --git a/legacy/evil/src/lib/dlfcn/Makefile.am b/legacy/evil/src/lib/dlfcn/Makefile.am index bb9580ca83..cfb35a6663 100644 --- a/legacy/evil/src/lib/dlfcn/Makefile.am +++ b/legacy/evil/src/lib/dlfcn/Makefile.am @@ -9,7 +9,7 @@ dist_stdheaders_DATA = dlfcn.h libdl_la_SOURCES = dlfcn.c -libdl_la_CPPFLAGS = -DEFL_EVIL_DLFCN_BUILD +libdl_la_CPPFLAGS = @win32_cppflags@ -DEFL_EVIL_DLFCN_BUILD -DPSAPI_VERSION=1 libdl_la_CFLAGS = @win32_cflags@ -libdl_la_LIBADD = $(top_builddir)/src/lib/libevil.la $(EFL_MPATROL_LIBS) +libdl_la_LIBADD = $(top_builddir)/src/lib/libevil.la $(EFL_MPATROL_LIBS) -lpsapi libdl_la_LDFLAGS = -no-undefined -Wl,--enable-auto-import -version-info @version_info@ diff --git a/legacy/evil/src/lib/dlfcn/dlfcn.c b/legacy/evil/src/lib/dlfcn/dlfcn.c index 782d61c6a2..4edefaf9d2 100644 --- a/legacy/evil/src/lib/dlfcn/dlfcn.c +++ b/legacy/evil/src/lib/dlfcn/dlfcn.c @@ -8,6 +8,9 @@ # include #endif /* __MINGW32CE__ || _MSC_VER */ +#include +#include /* EnumProcessModules(Ex) */ + #include "../Evil.h" #include "dlfcn.h" @@ -115,19 +118,41 @@ dlclose(void* handle) void * dlsym(void *handle, const char *symbol) { - FARPROC fp; + FARPROC fp = NULL; + LPCTSTR new_symbol; + + if (!symbol || !*symbol) return NULL; #ifdef UNICODE - { - wchar_t *wsymbol; - - wsymbol = evil_char_to_wchar(symbol); - fp = GetProcAddress(handle, wsymbol); - free(wsymbol); - } + new_symbol = evil_char_to_wchar(symbol); #else - fp = GetProcAddress(handle, symbol); -#endif /* ! UNICODE */ + new_symbol = symbol; +#endif /* UNICODE */ + + if (handle == RTLD_DEFAULT) + { + HMODULE modules[1024]; + DWORD needed; + DWORD i; + + /* TODO: use EnumProcessModulesEx() on Windows >= Vista */ + if (!EnumProcessModules(GetCurrentProcess(), + modules, sizeof(modules), &needed)) + return NULL; + + for (i = 0; i < (needed / sizeof(HMODULE)); i++) + { + fp = GetProcAddress(modules[i], new_symbol); + if (fp) break; + } + } + else + fp = GetProcAddress(handle, new_symbol); + +#ifdef UNICODE + free(new_symbol); +#endif /* UNICODE */ + if (!fp) get_last_error("GetProcAddress returned: "); diff --git a/legacy/evil/src/lib/dlfcn/dlfcn.h b/legacy/evil/src/lib/dlfcn/dlfcn.h index b388b4fcde..655dade6ad 100644 --- a/legacy/evil/src/lib/dlfcn/dlfcn.h +++ b/legacy/evil/src/lib/dlfcn/dlfcn.h @@ -59,12 +59,18 @@ extern "C" { * Symbols in this dlopen'ed obj are visible to other dlopen'ed objs */ +/** + * @def RTLD_DEFAULT + * Symbols are searched in all the DLL opened by the current process + */ + # define RTLD_LAZY 0x00001 /* lazy function call binding */ # define RTLD_NOW 0x00002 /* immediate function call binding */ # define RTLD_GLOBAL 0x00100 /* symbols in this dlopen'ed obj are visible to other dlopen'ed objs */ #define RTLD_NODELETE 0x01000 /* do not delete object when closed. */ +#define RTLD_DEFAULT ((void*)1) /* search the symbol on all the DLL of the current process */ /** * @typedef Dl_info diff --git a/legacy/evil/src/lib/evil_util.c b/legacy/evil/src/lib/evil_util.c index af410010c2..30f52ac997 100644 --- a/legacy/evil/src/lib/evil_util.c +++ b/legacy/evil/src/lib/evil_util.c @@ -81,7 +81,7 @@ evil_format_message(long err) #ifdef UNICODE str = evil_wchar_to_char(msg); #else - str = strdup(msg); + str = msg; #endif /* UNICODE */ LocalFree(msg); @@ -93,7 +93,9 @@ evil_format_message(long err) snprintf(disp, strlen(str) + strlen("(00000) ") + 1, "(%5ld) %s", err, str); +#ifdef UNICODE free(str); +#endif /* UNICODE */ return disp; }