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.
This commit is contained in:
parent
d4cb7acdd8
commit
3917d5d5ca
6 changed files with 65 additions and 2 deletions
13
ld/ChangeLog
13
ld/ChangeLog
|
@ -1,3 +1,16 @@
|
|||
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.
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
16
ld/configure
vendored
16
ld/configure
vendored
|
@ -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='#'
|
||||
|
|
|
@ -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)
|
||||
|
|
28
ld/plugin.c
28
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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue