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:
Dave Korn
2010-10-15 16:21:41 +00:00
parent d4cb7acdd8
commit 3917d5d5ca
6 changed files with 65 additions and 2 deletions

View File

@@ -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)