From 98b3d37f907da2ff57df441d0df58a7f0068d5cd Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Wed, 5 Oct 2011 22:08:13 +0000 Subject: [PATCH] Evil: add RTLD_DEFAULT support in dlsym() on Windows CE SVN revision: 63847 --- legacy/evil/ChangeLog | 5 +++++ legacy/evil/configure.ac | 10 +++++++--- legacy/evil/src/lib/dlfcn/Makefile.am | 2 +- legacy/evil/src/lib/dlfcn/dlfcn.c | 27 ++++++++++++++++++++++++++- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/legacy/evil/ChangeLog b/legacy/evil/ChangeLog index 632eb44f86..a0943d290c 100644 --- a/legacy/evil/ChangeLog +++ b/legacy/evil/ChangeLog @@ -6,6 +6,11 @@ add inet_ntop() function. Implementation from c-ares library. See AUTHORS. + * configure.ac: + * src/lib/dlfcn/dlfcn.c: + * src/lib/dlfcn/Makefile.am: + add RTLD_DEFAULT support in dlsym() on Windows CE + 2011-09-14 Vincent Torri * src/lib/dlfcn/dlfcn.c: diff --git a/legacy/evil/configure.ac b/legacy/evil/configure.ac index a29d8d4825..8c2a021c00 100644 --- a/legacy/evil/configure.ac +++ b/legacy/evil/configure.ac @@ -99,21 +99,25 @@ AC_C___ATTRIBUTE__ win32_cppflags="-DEFL_EVIL_BUILD" win32_cflags="-Wall -Wextra -Wshadow -Wdeclaration-after-statement -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls" win32_cxxflags="" +win32_libs="" have_wince="no" case "$host_os" in mingw32ce*) have_wince="yes" win32_cppflags="${win32_cppflags} -D_WIN32_WCE=0x0420" + win32_libs="-ltoolhelp" ;; *) have_wince="no" win32_cxxflags="-fno-rtti -fno-exceptions" win32_cppflags="${win32_cppflags} -D_WIN32_WINNT=0x0501 -DSECURITY_WIN32" + win32_libs="-lpsapi" ;; esac -AC_SUBST(win32_cppflags) -AC_SUBST(win32_cflags) -AC_SUBST(win32_cxxflags) +AC_SUBST([win32_cppflags]) +AC_SUBST([win32_cflags]) +AC_SUBST([win32_cxxflags]) +AC_SUBST([win32_libs]) AM_CONDITIONAL(EVIL_HAVE_WINCE, test "x${have_wince}" = "xyes") diff --git a/legacy/evil/src/lib/dlfcn/Makefile.am b/legacy/evil/src/lib/dlfcn/Makefile.am index cfb35a6663..65409973fd 100644 --- a/legacy/evil/src/lib/dlfcn/Makefile.am +++ b/legacy/evil/src/lib/dlfcn/Makefile.am @@ -11,5 +11,5 @@ libdl_la_SOURCES = dlfcn.c 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) -lpsapi +libdl_la_LIBADD = $(top_builddir)/src/lib/libevil.la $(EFL_MPATROL_LIBS) @win32_libs@ 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 f08c905af5..9daa94675b 100644 --- a/legacy/evil/src/lib/dlfcn/dlfcn.c +++ b/legacy/evil/src/lib/dlfcn/dlfcn.c @@ -9,7 +9,11 @@ #endif /* __MINGW32CE__ || _MSC_VER */ #include -#include /* EnumProcessModules(Ex) */ +#ifdef _WIN32_WCE +# include /* CreateToolhelp32Snapshot */ +#else +# include /* EnumProcessModules(Ex) */ +#endif #include "../Evil.h" @@ -131,6 +135,26 @@ dlsym(void *handle, const char *symbol) if (handle == RTLD_DEFAULT) { +#ifdef _WIN32_WCE + HANDLE snapshot; + MODULEENTRY32 module; + + snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | + TH32CS_SNAPMODULE | + TH32CS_GETALLMODS, + 0); + if (!snapshot) + return NULL; + + module.dwSize = sizeof(module); + if (Module32First(snapshot, &module)) + do { + fp = GetProcAddress(module.hModule, new_symbol); + if (fp) break; + } while (Module32Next(snapshot, &module)); + + CloseToolhelp32Snapshot(snapshot); +#else HMODULE modules[1024]; DWORD needed; DWORD i; @@ -145,6 +169,7 @@ dlsym(void *handle, const char *symbol) fp = GetProcAddress(modules[i], new_symbol); if (fp) break; } +#endif } else fp = GetProcAddress(handle, new_symbol);