Evil: add RTLD_DEFAULT support for dlsym()
authorVincent Torri <vincent.torri@gmail.com>
Wed, 14 Sep 2011 07:44:09 +0000 (07:44 +0000)
committerVincent Torri <vincent.torri@gmail.com>
Wed, 14 Sep 2011 07:44:09 +0000 (07:44 +0000)
SVN revision: 63373

legacy/evil/ChangeLog
legacy/evil/src/lib/dlfcn/Makefile.am
legacy/evil/src/lib/dlfcn/dlfcn.c
legacy/evil/src/lib/dlfcn/dlfcn.h
legacy/evil/src/lib/evil_util.c

index f6ebdd5..4dce120 100644 (file)
@@ -1,3 +1,8 @@
+2011-09-14  Vincent Torri  <doursse at users dot sf dot net>
+
+       * src/lib/dlfcn/dlfcn.c:
+       add RTLD_DEFAULT support in dlsym()
+
 2011-05-19  Vincent Torri  <doursse at users dot sf dot net>
 
        * src/lib/dlfcn/dlfcn.c:
index bb9580c..cfb35a6 100644 (file)
@@ -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@
index 782d61c..4edefaf 100644 (file)
@@ -8,6 +8,9 @@
 # include <limits.h>
 #endif /* __MINGW32CE__ || _MSC_VER */
 
+#include <windows.h>
+#include <psapi.h> /*  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;
 
-#ifdef UNICODE
-   {
-      wchar_t *wsymbol;
+   if (!symbol || !*symbol) return NULL;
 
-      wsymbol = evil_char_to_wchar(symbol);
-      fp = GetProcAddress(handle, wsymbol);
-      free(wsymbol);
-   }
+#ifdef UNICODE
+   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: ");
 
index b388b4f..655dade 100644 (file)
@@ -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
index af41001..30f52ac 100644 (file)
@@ -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;
 }