summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorDave Korn <dave.korn@artimi.com>2010-10-15 16:21:40 +0000
committerDave Korn <dave.korn@artimi.com>2010-10-15 16:21:40 +0000
commitaebd3a7c76a81e3c88d497f94bf0616545abdf5f (patch)
tree487d999456d8f309a0f553e358185df212bf27b4 /ld
parentdc814f0f09ac2da6273b77183fbc66ceb3c9218f (diff)
downloadbinutils-redhat-aebd3a7c76a81e3c88d497f94bf0616545abdf5f.tar.gz
Provide win32-based dlapi replacements on windows platforms without dlfcn.h.
ld/ChangeLog: * configure.in: If <dlfcn.h> can't be found, try for <Windows.h> * 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 <dlfcn.h> from ENABLE_PLUGINS anymore, use its own guard.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog13
-rw-r--r--ld/config.in3
-rwxr-xr-xld/configure16
-rw-r--r--ld/configure.in4
-rw-r--r--ld/plugin.c28
-rw-r--r--ld/sysdep.h3
6 files changed, 65 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 85c784af45..e0a3e6106a 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,18 @@
2010-10-15 Dave Korn <dave.korn.cygwin@gmail.com>
+ * configure.in: If <dlfcn.h> can't be found, try for <Windows.h>
+ * 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 <dlfcn.h> from ENABLE_PLUGINS
+ anymore, use its own guard.
+
+2010-10-15 Dave Korn <dave.korn.cygwin@gmail.com>
+
* 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 9e6e97bb81..f49327c11a 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 <Windows.h> header file. */
+#undef HAVE_WINDOWS_H
+
/* Define to 1 if you have the <zlib.h> header file. */
#undef HAVE_ZLIB_H
diff --git a/ld/configure b/ld/configure
index 9ff8529c98..3367a88a32 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 29d01ccaa3..122f65e13b 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 0c88ef8bea..c1961c54f4 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 <Windows.h>
+#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 9dfae105d5..b7d5b88a85 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 <dlfcn.h>
#endif