[patch bfd]: Fix PR ld/12742 for windows targets
xunxun
xunxun1982@gmail.com
Fri Mar 9 23:18:00 GMT 2012
On Sat, Mar 10, 2012 at 3:54 AM, Kai Tietz <ktietz70@googlemail.com> wrote:
> Hi,
>
> this patch adds compatible implementation of dlfcn API on Windows
> targets, if this header/API isn't present.
>
> ChangeLog
>
> 2012-03-09 Kai Tietz <ktietz@redhat.com>
>
> PR ld/12742
> * configure.in (AC_CHECK_HEADERS): Test for windows.h and dlfcn.h.
> * plugin.c: Guard include of dlfcn.h if HAVE_DLFCN_H is defined.
> Add windows.h header include if HAVE_WINDOWS_H is defined.
> (dlerror): New static function if windows variant is used instead
> of dlfcn.h.
> (dlclose): Likewise.
> (dlopen): Likewise.
> (dlsym): Likewise.
> * configure: Regenerated.
> * config.in: Regenerated.
>
> Tested for i686-w64-mingw32 and x86_64-w64-mingw32. Ok for apply?
>
> Regards,
> Kai
>
> Index: config.in
> ===================================================================
> RCS file: /cvs/src/src/bfd/config.in,v
> retrieving revision 1.49
> diff -u -p -r1.49 config.in
> --- config.in 12 May 2011 07:41:40 -0000 1.49
> +++ config.in 9 Mar 2012 19:38:18 -0000
> @@ -245,6 +245,9 @@
> /* Define if <sys/procfs.h> has win32_pstatus_t. */
> #undef HAVE_WIN32_PSTATUS_T
>
> +/* 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
>
> Index: configure
> ===================================================================
> RCS file: /cvs/src/src/bfd/configure,v
> retrieving revision 1.359
> diff -u -p -r1.359 configure
> --- configure 25 Feb 2012 19:51:31 -0000 1.359
> +++ configure 9 Mar 2012 19:38:21 -0000
> @@ -13508,6 +13508,22 @@ fi
>
> fi
>
> +
> +for ac_header in windows.h dlfcn.h
> +do :
> + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
> +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header"
> "$ac_includes_default"
> +eval as_val=\$$as_ac_Header
> + if test "x$as_val" = x""yes; then :
> + cat >>confdefs.h <<_ACEOF
> +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
> +_ACEOF
> +
> +fi
> +
> +done
> +
> +
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether string.h
> and strings.h may both be included" >&5
> $as_echo_n "checking whether string.h and strings.h may both be
> included... " >&6; }
> if test "${gcc_cv_header_string+set}" = set; then :
> Index: configure.in
> ===================================================================
> RCS file: /cvs/src/src/bfd/configure.in,v
> retrieving revision 1.307
> diff -u -p -r1.307 configure.in
> --- configure.in 25 Feb 2012 19:51:32 -0000 1.307
> +++ configure.in 9 Mar 2012 19:38:21 -0000
> @@ -190,6 +190,9 @@ AC_CHECK_HEADERS(fcntl.h sys/file.h sys/
> GCC_HEADER_STDINT(bfd_stdint.h)
> AC_HEADER_TIME
> AC_HEADER_DIRENT
> +
> +AC_CHECK_HEADERS(windows.h dlfcn.h)
> +
> ACX_HEADER_STRING
> AC_CHECK_FUNCS(fcntl getpagesize setitimer sysconf fdopen getuid getgid fileno)
> AC_CHECK_FUNCS(strtoull)
> Index: plugin.c
> ===================================================================
> RCS file: /cvs/src/src/bfd/plugin.c,v
> retrieving revision 1.14
> diff -u -p -r1.14 plugin.c
> --- plugin.c 11 Jul 2011 15:03:07 -0000 1.14
> +++ plugin.c 9 Mar 2012 19:38:22 -0000
> @@ -25,7 +25,13 @@
> #if BFD_SUPPORTS_PLUGINS
>
> #include <assert.h>
> +#ifdef HAVE_DLFCN_H
> #include <dlfcn.h>
> +#elif defined (HAVE_WINDOWS_H)
> +#include <windows.h>
> +#else
> +#error Unknown how to handle dynamic-load-libraries.
> +#endif
> #include <stdarg.h>
> #include "plugin-api.h"
> #include "sysdep.h"
> @@ -34,6 +40,37 @@
> #include "libiberty.h"
> #include <dirent.h>
>
> +#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 ATTRIBUTE_UNUSED
> +dlclose (void *handle)
> +{
> + FreeLibrary (handle);
> + return 0;
> +}
> +
> +static const char *
> +dlerror (void)
> +{
> + return "Unable to load DLL.";
> +}
> +
> +#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
> +
> #define bfd_plugin_close_and_cleanup
> _bfd_generic_close_and_cleanup
> #define bfd_plugin_bfd_free_cached_info
> _bfd_generic_bfd_free_cached_info
> #define bfd_plugin_new_section_hook
> _bfd_generic_new_section_hook
why to add static?
And I think dlclose is
int ATTRIBUTE_UNUSED
dlclose (void *handle)
{
bool ret;
ret = FreeLibrary (handle);
ret = !ret;
return (int) ret;
}
The similar is better.
--
Best Regards,
xunxun
More information about the Binutils
mailing list