From 3917d5d5ca1bed255ee9bd0a0b38360505ce5b4c Mon Sep 17 00:00:00 2001 From: Dave Korn Date: Fri, 15 Oct 2010 16:21:41 +0000 Subject: [PATCH] Provide win32-based dlapi replacements on windows platforms without dlfcn.h. ld/ChangeLog: * configure.in: If can't be found, try for * configure: Regenerate. * config.in: Likewise. * plugin.c [!HAVE_DLFCN_H && HAVE_WINDOWS_H] (dlopen): Provide trival LoadLibrary-based replacement for Windows systems. [!HAVE_DLFCN_H && HAVE_WINDOWS_H] (dlsym): Likewise trivial replacement based on GetProcAddress. [!HAVE_DLFCN_H && HAVE_WINDOWS_H] (dlsym): Likewise FreeLibrary. * sysdep.h: Don't infer presence of from ENABLE_PLUGINS anymore, use its own guard. --- ld/ChangeLog | 13 +++++++++++++ ld/config.in | 3 +++ ld/configure | 16 ++++++++++++++++ ld/configure.in | 4 ++++ ld/plugin.c | 28 ++++++++++++++++++++++++++++ ld/sysdep.h | 3 +-- 6 files changed, 65 insertions(+), 2 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 85c784a..e0a3e61 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,18 @@ 2010-10-15 Dave Korn + * configure.in: If can't be found, try for + * configure: Regenerate. + * config.in: Likewise. + * plugin.c [!HAVE_DLFCN_H && HAVE_WINDOWS_H] (dlopen): Provide + trival LoadLibrary-based replacement for Windows systems. + [!HAVE_DLFCN_H && HAVE_WINDOWS_H] (dlsym): Likewise trivial + replacement based on GetProcAddress. + [!HAVE_DLFCN_H && HAVE_WINDOWS_H] (dlsym): Likewise FreeLibrary. + * sysdep.h: Don't infer presence of from ENABLE_PLUGINS + anymore, use its own guard. + +2010-10-15 Dave Korn + * plugin.c (add_input_file): Take copy of input string. (add_input_library): Likewise. (set_extra_library_path): Likewise. diff --git a/ld/config.in b/ld/config.in index 9e6e97b..f49327c 100644 --- a/ld/config.in +++ b/ld/config.in @@ -129,6 +129,9 @@ /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID +/* Define to 1 if you have the header file. */ +#undef HAVE_WINDOWS_H + /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H diff --git a/ld/configure b/ld/configure index 9ff8529..3367a88 100755 --- a/ld/configure +++ b/ld/configure @@ -12919,6 +12919,22 @@ else fi done +# We also support plugins on Windows (MinGW). +if test x$enable_plugins = xno ; then + for ac_header in Windows.h +do : + ac_fn_c_check_header_compile "$LINENO" "Windows.h" "ac_cv_header_Windows_h" "$ac_includes_default +" +if test "x$ac_cv_header_Windows_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_WINDOWS_H 1 +_ACEOF + enable_plugins=yes +fi + +done + +fi if test x$enable_plugins = xyes; then ENABLE_PLUGINS_TRUE= ENABLE_PLUGINS_FALSE='#' diff --git a/ld/configure.in b/ld/configure.in index 29d01cc..122f65e 100644 --- a/ld/configure.in +++ b/ld/configure.in @@ -169,6 +169,10 @@ enable_plugins=yes AC_CHECK_HEADER([dlfcn.h],[],[enable_plugins=no],[AC_INCLUDES_DEFAULT]) AC_SEARCH_LIBS([dlopen],[dl],[],[enable_plugins=no],[]) AC_CHECK_FUNCS([dlopen dlsym dlclose],[],[enable_plugins=no]) +# We also support plugins on Windows (MinGW). +if test x$enable_plugins = xno ; then + AC_CHECK_HEADERS([Windows.h],[enable_plugins=yes],[],[AC_INCLUDES_DEFAULT]) +fi AM_CONDITIONAL([ENABLE_PLUGINS], [test x$enable_plugins = xyes]) AC_MSG_CHECKING(for a known getopt prototype in unistd.h) diff --git a/ld/plugin.c b/ld/plugin.c index 0c88ef8..c1961c5 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -32,6 +32,9 @@ #include "plugin.h" #include "plugin-api.h" #include "elf-bfd.h" +#if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) +#include +#endif /* The suffix to append to the name of the real (claimed) object file when generating a dummy BFD to hold the IR symbols sent from the @@ -128,6 +131,31 @@ static const enum ld_plugin_tag tv_header_tags[] = /* How many entries in the constant leading part of the tv array. */ static const size_t tv_header_size = ARRAY_SIZE (tv_header_tags); +#if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) + +#define RTLD_NOW 0 /* Dummy value. */ + +static void * +dlopen (const char *file, int mode ATTRIBUTE_UNUSED) +{ + return LoadLibrary (file); +} + +static void * +dlsym (void *handle, const char *name) +{ + return GetProcAddress (handle, name); +} + +static int +dlclose (void *handle) +{ + FreeLibrary (handle); + return 0; +} + +#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */ + /* Helper function for exiting with error status. */ static int set_plugin_error (const char *plugin) diff --git a/ld/sysdep.h b/ld/sysdep.h index 9dfae10..b7d5b88 100644 --- a/ld/sysdep.h +++ b/ld/sysdep.h @@ -90,8 +90,7 @@ extern char *strrchr (); #endif #endif -/* This is both more precise than and includes HAVE_DLFCN_H. */ -#ifdef ENABLE_PLUGINS +#ifdef HAVE_DLFCN_H #include #endif -- 2.7.4