summaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2019-08-30 16:53:37 +0000
committermidipix <writeonce@midipix.org>2019-08-30 16:53:37 +0000
commit9b88f8a526eba71fe67c6d35845f51fd9523fd02 (patch)
treef5a7f775570a010adc527097965cea6ccd284844 /patches
parent9368a709b65da26631e1493a255eb31acaf3646c (diff)
downloadchainport-9b88f8a526eba71fe67c6d35845f51fd9523fd02.tar.bz2
chainport-9b88f8a526eba71fe67c6d35845f51fd9523fd02.tar.xz
project: applied new directory layout (./etc and ./patches sub-directories).
Diffstat (limited to 'patches')
-rw-r--r--patches/binutils-2.24.51.midipix.patch1391
-rw-r--r--patches/gdb-7.12.midipix.patch368
-rw-r--r--patches/gmp-5.1.1.midipix.patch23
-rw-r--r--patches/gmp-5.1.3.midipix.patch22
-rw-r--r--patches/libelf-0.8.13.midipix.patch39
-rw-r--r--patches/libffi-3.2.1.midipix.patch108
6 files changed, 1951 insertions, 0 deletions
diff --git a/patches/binutils-2.24.51.midipix.patch b/patches/binutils-2.24.51.midipix.patch
new file mode 100644
index 0000000..928e059
--- /dev/null
+++ b/patches/binutils-2.24.51.midipix.patch
@@ -0,0 +1,1391 @@
+diff -ru --new-file a/ld/pe-mdso.c b/ld/pe-mdso.c
+--- a/ld/pe-mdso.c 2019-08-14 06:12:57.193333307 -0400
++++ a/ld/pe-mdso.c 2019-08-17 00:59:46.886167655 -0400
+@@ -0,0 +1,241 @@
++#include "sysdep.h"
++#include "pe-mdso.h"
++
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <errno.h>
++#include <sys/stat.h>
++
++#include <perk/perk.h>
++#include <mdso/mdso.h>
++
++extern char * program_name;
++extern int xatexit(void (*)(void));
++
++static char pe_mdso_tmp_lib_name[] = "/tmp/mdso_XXXXXXXXXXXX";
++static char pe_perk_tmp_def_name[] = "/tmp/perk_XXXXXXXXXXXX";
++static struct pe_driver_ctx * pe_dctx;
++
++struct pe_mdso_lib {
++ dev_t st_dev;
++ ino_t st_ino;
++ char ar_name[24];
++};
++
++struct pe_mdso_lib * pe_mdso_lib_arr;
++struct pe_mdso_lib * pe_mdso_lib_ptr;
++struct pe_mdso_lib * pe_mdso_lib_cap;
++
++static int pe_mdso_perk_init(void)
++{
++ char * argv[2];
++
++ if (pe_dctx)
++ return 0;
++
++ argv[0] = program_name;
++ argv[1] = 0;
++
++ return pe_get_driver_ctx(argv,0,0,0,&pe_dctx);
++}
++
++static void pe_mdso_cache_unlink(void)
++{
++ struct pe_mdso_lib * pe_mdso;
++
++ for (pe_mdso=pe_mdso_lib_arr; pe_mdso<pe_mdso_lib_ptr; pe_mdso++)
++ unlink(pe_mdso->ar_name);
++}
++
++static int pe_mdso_cache_alloc(void)
++{
++ void * prev;
++ size_t size;
++ size_t nlib;
++
++ if (pe_mdso_lib_cap > pe_mdso_lib_ptr)
++ return 0;
++
++ prev = pe_mdso_lib_arr;
++ nlib = pe_mdso_lib_cap - pe_mdso_lib_arr;
++ size = nlib * sizeof(struct pe_mdso_lib);
++
++ if (!(pe_mdso_lib_arr = calloc(nlib+2,sizeof(struct pe_mdso_lib))))
++ return -1;
++
++ if (!prev)
++ xatexit(pe_mdso_cache_unlink);
++
++ memcpy(pe_mdso_lib_arr,prev,size);
++
++ pe_mdso_lib_ptr = &pe_mdso_lib_arr[nlib];
++ pe_mdso_lib_cap = &pe_mdso_lib_arr[nlib+2];
++
++ return 0;
++}
++
++const char * pe_mdso_input_name(const char * input_name)
++{
++ int fdin;
++ int fdout;
++ char * libname;
++ char * argv[8];
++
++ struct stat st;
++ struct pe_mdso_lib * pe_mdso;
++ struct pe_unit_ctx * pe_uctx;
++ struct pe_fd_ctx pe_fdctx;
++ struct mdso_driver_ctx * mdso_dctx;
++
++ /* perk driver context */
++ if (pe_mdso_perk_init() < 0)
++ return 0;
++
++ /* defer when input_name cannot be opened */
++ if ((fdin = open(input_name,O_RDONLY)) < 0)
++ return input_name;
++
++ /* stat */
++ if (fstat(fdin,&st) < 0) {
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ pe_output_error_vector(pe_dctx);
++ return 0;
++ }
++
++ /* repeated input argument? */
++ for (pe_mdso=pe_mdso_lib_arr; pe_mdso<pe_mdso_lib_ptr; pe_mdso++) {
++ if ((pe_mdso->st_dev == st.st_dev) && (pe_mdso->st_ino == st.st_ino)) {
++ close(fdin);
++ return pe_mdso->ar_name;
++ }
++ }
++
++ /* defer when perk object/image context cannot be created */
++ if (pe_get_unit_ctx(pe_dctx,input_name,&pe_uctx) < 0) {
++ close(fdin);
++ return input_name;
++ }
++
++ /* defer when input file is not an image */
++ switch (pe_uctx->meta->m_subtype) {
++ case PE_SUBTYPE_DLL:
++ case PE_SUBTYPE_EXE:
++ break;
++
++ default:
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ return input_name;
++ }
++
++ /* image bits */
++ switch (pe_uctx->meta->m_abi) {
++ case PE_ABI_PE32:
++ argv[1] = "-m32";
++ break;
++
++ case PE_ABI_PE64:
++ argv[1] = "-m64";
++ break;
++
++ default:
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ return 0;
++ }
++
++ /* perk driver fd context (get) */
++ if ((pe_get_driver_fdctx(pe_dctx,&pe_fdctx)) < 0) {
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ pe_output_error_vector(pe_dctx);
++ return 0;
++ }
++
++ /* template init */
++ memset (&pe_perk_tmp_def_name[10],'X',12);
++ memset (&pe_mdso_tmp_lib_name[10],'X',12);
++
++ /* perk .def file (create) */
++ if ((pe_fdctx.fdout = mkstemp(pe_perk_tmp_def_name)) < 0) {
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ pe_output_error_vector(pe_dctx);
++ return 0;
++ }
++
++ /* perk driver fd context (set) */
++ if ((pe_set_driver_fdctx(pe_dctx,&pe_fdctx)) < 0) {
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ pe_output_error_vector(pe_dctx);
++ return 0;
++ }
++
++ /* perk .def file (populate) */
++ if (pe_output_export_symbols(pe_dctx,pe_uctx->meta) < 0) {
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++ pe_output_error_vector(pe_dctx);
++ return 0;
++ };
++
++ /* done with perk */
++ close(fdin);
++ pe_free_unit_ctx(pe_uctx);
++
++ /* libname */
++ if ((libname = strrchr(input_name,'/')))
++ libname++;
++ else if ((libname = strrchr(input_name,'\\')))
++ libname++;
++ else
++ libname = (char *)input_name;
++
++ /* cache alloc (as needed) */
++ if (pe_mdso_cache_alloc() < 0)
++ return 0;
++
++ /* mdso lib file (create) */
++ if ((fdout = mkstemp(pe_mdso_tmp_lib_name)) < 0)
++ return 0;
++
++ /* mdso driver context (argv[1] already set, see above) */
++ argv[0] = program_name;
++ argv[2] = "--libname";
++ argv[3] = libname;
++ argv[4] = "--implib";
++ argv[5] = pe_mdso_tmp_lib_name;
++ argv[6] = pe_perk_tmp_def_name;
++ argv[7] = 0;
++
++ if (mdso_get_driver_ctx(argv,0,0,0,&mdso_dctx) < 0) {
++ close(fdout);
++ return 0;
++ }
++
++ /* mdso lib file (generate) */
++ if (mdso_create_implib_archive(mdso_dctx) < 0) {
++ close(fdout);
++ mdso_output_error_vector(mdso_dctx);
++ mdso_free_driver_ctx(mdso_dctx);
++ return 0;
++ }
++
++ /* cache */
++ strcpy(pe_mdso_lib_ptr->ar_name,pe_mdso_tmp_lib_name);
++
++ pe_mdso_lib_ptr->st_dev = st.st_dev;
++ pe_mdso_lib_ptr->st_ino = st.st_ino;
++ pe_mdso_lib_ptr++;
++
++ /* all done */
++ unlink(pe_perk_tmp_def_name);
++ mdso_free_driver_ctx(mdso_dctx);
++ close(fdout);
++
++ return pe_mdso_tmp_lib_name;
++}
+diff -ru --new-file a/bfd/pe-mdso.h b/bfd/pe-mdso.h
+--- a/bfd/pe-mdso.h 1969-12-31 19:00:00.000000000 -0500
++++ b/bfd/pe-mdso.h 2019-08-15 07:00:00.000000000 -0400
+@@ -0,0 +1,10 @@
++#ifndef PEMDSO_H
++#define PEMDSO_H
++
++#define PE_DSO_SUFFIX ".so"
++#define PE_DSOLIB_SUFFIX ".dso.a"
++#define PE_IMPLIB_SUFFIX ".lib.a"
++
++const char * pe_mdso_input_name(const char * input_name);
++
++#endif
+diff --ru --new-file a/ld/ldfile.c b/ld/ldfile.c
+--- a/ld/ldfile.c 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/ldfile.c 2019-08-17 11:38:31.062209027 -0400
+@@ -122,6 +122,16 @@ bfd_boolean
+ ldfile_try_open_bfd (const char *attempt,
+ lang_input_statement_type *entry)
+ {
++
++#ifdef PE_TARGET_MDSO
++ if (!entry->flags.dynamic) {
++ (void)0;
++ } else if (!(attempt = pe_mdso_input_name(attempt))) {
++ fprintf(stderr,"%s: pe_mdso_input_name() returned an error.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++#endif
++
+ entry->the_bfd = bfd_openr (attempt, entry->target);
+
+ if (verbose)
+diff -ru --new-file a/ld/configure b/ld/configure
+--- a/ld/configure 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/configure 2015-03-11 20:01:08.888756786 -0400
+@@ -19773,3 +19773,31 @@
+ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ fi
+
++sed -i -e 's/@pe_executable_name@/'"$PE_EXECUTABLE_NAME"'/g' Makefile
++sed -i -e 's/@pe_framework_libs@/'"$PE_FRAMEWORK_LIBS"'/g' Makefile
++sed -i -e 's/@pe_crt_section@/'"$PE_CRT_SECTION"'/g' Makefile
++sed -i -e 's/@pe_cygwin_fork_support@/'"$PE_CYGWIN_FORK_SUPPORT"'/g' Makefile
++
++#PE custom import library support
++if [ -f peimplib.h ]; then
++ echo 'build directory is not clean (peimplib.h already exists)'
++ exit 2
++fi
++
++touch peimplib.h || exit 2
++
++case $target_os in
++ *midipix*)
++ cat >> peimplib.h << EOF
++/* PE target-specific bits, generated by ld/configure */
++#ifndef PE_TARGET_MIDIPIX
++#define PE_TARGET_MIDIPIX
++#endif
++
++#ifndef PE_TARGET_MDSO
++#define PE_TARGET_MDSO 1
++#endif
++
++#include "pe-mdso.h"
++EOF
++esac
+diff --ru --new-file a/ld/sysdep.h b/ld/sysdep.h
+--- a/ld/sysdep.h 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/sysdep.h 2019-08-16 03:08:47.771929753 -0400
+@@ -26,6 +26,7 @@
+ #endif
+
+ #include "config.h"
++#include "peimplib.h"
+
+ #include <stdio.h>
+ #include <sys/types.h>
+diff -ru --new-file a/ld/emultempl/pe.em b/ld/emultempl/pe.em
+--- a/ld/emultempl/pe.em 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/emultempl/pe.em 2019-08-17 11:38:31.062209027 -0400
+@@ -69,6 +69,14 @@ fragment <<EOF
+ #include "ldbuildid.h"
+ #include "coff/internal.h"
+
++#ifndef PE_IMPLIB_SUFFIX
++#define PE_IMPLIB_SUFFIX ".dll.a"
++#endif
++
++#ifndef PE_DSO_SUFFIX
++#define PE_DSO_SUFFIX ".dll"
++#endif
++
+ /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
+ header in generic PE code. */
+ #include "coff/i386.h"
+@@ -132,13 +140,15 @@ static int support_old_code = 0;
+ static char * thumb_entry_symbol = NULL;
+ static lang_assignment_statement_type *image_base_statement = 0;
+ static unsigned short pe_dll_characteristics = 0;
+-static bfd_boolean insert_timestamp = TRUE;
++static bfd_boolean insert_timestamp = 0;
+ static const char *emit_build_id;
+
+ #ifdef DLL_SUPPORT
+ static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable. */
+ static char *pe_out_def_filename = NULL;
+ static char *pe_implib_filename = NULL;
++static char * pe_dsolib_filename = NULL;
++static char * pe_dsolib_loader_path = NULL;
+ static int pe_enable_auto_image_base = 0;
+ static unsigned long pe_auto_image_base = 0x61500000;
+ static char *pe_dll_search_prefix = NULL;
+@@ -229,7 +239,9 @@ fragment <<EOF
+ #define OPTION_ENABLE_STDCALL_FIXUP (OPTION_STDCALL_ALIASES + 1)
+ #define OPTION_DISABLE_STDCALL_FIXUP (OPTION_ENABLE_STDCALL_FIXUP + 1)
+ #define OPTION_IMPLIB_FILENAME (OPTION_DISABLE_STDCALL_FIXUP + 1)
+-#define OPTION_THUMB_ENTRY (OPTION_IMPLIB_FILENAME + 1)
++#define OPTION_DSOLIB_FILENAME (OPTION_IMPLIB_FILENAME + 1)
++#define OPTION_DSOLIB_LOADER_PATH (OPTION_DSOLIB_FILENAME + 1)
++#define OPTION_THUMB_ENTRY (OPTION_DSOLIB_LOADER_PATH + 1)
+ #define OPTION_WARN_DUPLICATE_EXPORTS (OPTION_THUMB_ENTRY + 1)
+ #define OPTION_IMP_COMPAT (OPTION_WARN_DUPLICATE_EXPORTS + 1)
+ #define OPTION_ENABLE_AUTO_IMAGE_BASE (OPTION_IMP_COMPAT + 1)
+@@ -324,6 +336,8 @@ gld${EMULATION_NAME}_add_options
+ {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
+ {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
+ {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
++ {"out-dsolib", required_argument, NULL, OPTION_DSOLIB_FILENAME},
++ {"dsolib-loader-path", required_argument, NULL, OPTION_DSOLIB_LOADER_PATH},
+ {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
+ /* getopt() allows abbreviations, so we do this to stop it from
+ treating -c as an abbreviation for these --compat-implib. */
+@@ -471,8 +485,8 @@ gld_${EMULATION_NAME}_list_options (FILE *file)
+ specifically set with --image-base\n"));
+ fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n"));
+ fprintf (file, _(" --dll-search-prefix=<string> When linking dynamically to a dll without\n\
+- an importlib, use <string><basename>.dll\n\
+- in preference to lib<basename>.dll \n"));
++ an importlib, use <string><basename>"PE_DSO_SUFFIX"\n\
++ in preference to lib<basename>"PE_DSO_SUFFIX" \n"));
+ fprintf (file, _(" --enable-auto-import Do sophisticated linking of _sym to\n\
+ __imp_sym for DATA references\n"));
+ fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n"));
+@@ -808,6 +822,12 @@ gld${EMULATION_NAME}_handle_option (int optc)
+ case OPTION_IMPLIB_FILENAME:
+ pe_implib_filename = xstrdup (optarg);
+ break;
++ case OPTION_DSOLIB_FILENAME:
++ pe_dsolib_filename = xstrdup (optarg);
++ break;
++ case OPTION_DSOLIB_LOADER_PATH:
++ pe_dsolib_loader_path = xstrdup (optarg);
++ break;
+ case OPTION_WARN_DUPLICATE_EXPORTS:
+ pe_dll_warn_dup_exports = 1;
+ break;
+@@ -1698,7 +1718,7 @@ gld_${EMULATION_NAME}_after_open (void)
+ extension, and use that for the remainder of the
+ comparisons. */
+ pnt = strrchr (is3->the_bfd->filename, '.');
+- if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
++ if (pnt != NULL && filename_cmp (pnt, PE_DSO_SUFFIX) == 0)
+ break;
+ }
+
+@@ -1733,7 +1753,7 @@ gld_${EMULATION_NAME}_after_open (void)
+ then leave the filename alone. */
+ pnt = strrchr (is->the_bfd->filename, '.');
+
+- if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
++ if (is_ms_arch && (filename_cmp (pnt, PE_DSO_SUFFIX) == 0))
+ {
+ int idata2 = 0, reloc_count=0;
+ asection *sec;
+@@ -2063,8 +2083,14 @@ gld_${EMULATION_NAME}_finish (void)
+ )
+ {
+ pe_dll_fill_sections (link_info.output_bfd, &link_info);
++
++ /* generate legacy implib? */
+ if (pe_implib_filename)
+ pe_dll_generate_implib (pe_def_file, pe_implib_filename, &link_info);
++
++ /* generate mdso implib? */
++ if (pe_dsolib_filename)
++ pe_dll_generate_dsolib (pe_def_file, 0, pe_dsolib_filename, pe_dsolib_loader_path, 32);
+ }
+ #if defined(TARGET_IS_shpe)
+ /* ARM doesn't need relocs. */
+@@ -2298,16 +2324,25 @@ gld_${EMULATION_NAME}_open_dynamic_archive
+ }
+ libname_fmt [] =
+ {
++ /* optionally support ldso-specific import libraries */
++ #ifdef PE_TARGET_MDSO
++ { "lib%s"PE_DSOLIB_SUFFIX, FALSE },
++ #endif
+ /* Preferred explicit import library for dll's. */
+- { "lib%s.dll.a", FALSE },
++ { "lib%s"PE_IMPLIB_SUFFIX, FALSE },
+ /* Alternate explicit import library for dll's. */
+- { "%s.dll.a", FALSE },
++ { "%s"PE_IMPLIB_SUFFIX, FALSE },
++#ifdef PE_TARGET_MDSO
++ /* libfoo.so precedes libfoo.a, generate mdso implib as needed */
++ { "lib%s"PE_DSO_SUFFIX, FALSE },
++#endif
+ /* "libfoo.a" could be either an import lib or a static lib.
+ For backwards compatibility, libfoo.a needs to precede
+ libfoo.dll and foo.dll in the search. */
+ { "lib%s.a", FALSE },
+ /* The 'native' spelling of an import lib name is "foo.lib". */
+ { "%s.lib", FALSE },
++#ifndef PE_TARGET_MDSO
+ #ifdef DLL_SUPPORT
+ /* Try "<prefix>foo.dll" (preferred dll name, if specified). */
+ { "%s%s.dll", TRUE },
+@@ -2316,6 +2351,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
+ { "lib%s.dll", FALSE },
+ /* Finally try 'native' dll name "foo.dll". */
+ { "%s.dll", FALSE },
++#endif
+ /* Note: If adding more formats to this table, make sure to check to
+ see if their length is longer than libname_fmt[0].format, and if
+ so, update the call to xmalloc() below. */
+diff -ru --new-file a/ld/emultempl/pep.em b/ld/emultempl/pep.em
+--- a/ld/emultempl/pep.em 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/emultempl/pep.em 2019-08-17 11:38:31.062209027 -0400
+@@ -67,6 +67,14 @@ fragment <<EOF
+ #include "ldbuildid.h"
+ #include "coff/internal.h"
+
++#ifndef PE_IMPLIB_SUFFIX
++#define PE_IMPLIB_SUFFIX ".dll.a"
++#endif
++
++#ifndef PE_DSO_SUFFIX
++#define PE_DSO_SUFFIX ".dll"
++#endif
++
+ /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
+ header in generic PE code. */
+ #include "coff/x86_64.h"
+@@ -147,13 +155,15 @@ static flagword real_flags = IMAGE_FILE_LARGE_ADDRESS_AWARE;
+ static int support_old_code = 0;
+ static lang_assignment_statement_type *image_base_statement = 0;
+ static unsigned short pe_dll_characteristics = 0;
+-static bfd_boolean insert_timestamp = TRUE;
++static bfd_boolean insert_timestamp = 0;
+ static const char *emit_build_id;
+
+ #ifdef DLL_SUPPORT
+ static int pep_enable_stdcall_fixup = 1; /* 0=disable 1=enable (default). */
+ static char * pep_out_def_filename = NULL;
+ static char * pep_implib_filename = NULL;
++static char * pep_dsolib_filename = NULL;
++static char * pep_dsolib_loader_path = NULL;
+ static int pep_enable_auto_image_base = 0;
+ static char * pep_dll_search_prefix = NULL;
+ #endif
+@@ -218,6 +228,8 @@ enum options
+ OPTION_ENABLE_STDCALL_FIXUP,
+ OPTION_DISABLE_STDCALL_FIXUP,
+ OPTION_IMPLIB_FILENAME,
++ OPTION_DSOLIB_FILENAME,
++ OPTION_DSOLIB_LOADER_PATH,
+ OPTION_WARN_DUPLICATE_EXPORTS,
+ OPTION_IMP_COMPAT,
+ OPTION_ENABLE_AUTO_IMAGE_BASE,
+@@ -296,6 +308,8 @@ gld${EMULATION_NAME}_add_options
+ {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
+ {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
+ {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
++ {"out-dsolib", required_argument, NULL, OPTION_DSOLIB_FILENAME},
++ {"dsolib-loader-path", required_argument, NULL, OPTION_DSOLIB_LOADER_PATH},
+ {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
+ /* getopt() allows abbreviations, so we do this to stop it from
+ treating -c as an abbreviation for these --compat-implib. */
+@@ -434,8 +448,8 @@ gld_${EMULATION_NAME}_list_options (FILE *file)
+ unless user specifies one\n"));
+ fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n"));
+ fprintf (file, _(" --dll-search-prefix=<string> When linking dynamically to a dll without\n\
+- an importlib, use <string><basename>.dll\n\
+- in preference to lib<basename>.dll \n"));
++ an importlib, use <string><basename>"PE_DSO_SUFFIX"\n\
++ in preference to lib<basename>"PE_DSO_SUFFIX" \n"));
+ fprintf (file, _(" --enable-auto-import Do sophisticated linking of _sym to\n\
+ __imp_sym for DATA references\n"));
+ fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n"));
+@@ -760,6 +774,12 @@ gld${EMULATION_NAME}_handle_option (int optc)
+ case OPTION_IMPLIB_FILENAME:
+ pep_implib_filename = xstrdup (optarg);
+ break;
++ case OPTION_DSOLIB_FILENAME:
++ pep_dsolib_filename = xstrdup (optarg);
++ break;
++ case OPTION_DSOLIB_LOADER_PATH:
++ pep_dsolib_loader_path = xstrdup (optarg);
++ break;
+ case OPTION_WARN_DUPLICATE_EXPORTS:
+ pep_dll_warn_dup_exports = 1;
+ break;
+@@ -1635,7 +1655,7 @@ gld_${EMULATION_NAME}_after_open (void)
+ extension, and use that for the remainder of the
+ comparisons. */
+ pnt = strrchr (is3->the_bfd->filename, '.');
+- if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
++ if (pnt != NULL && filename_cmp (pnt, PE_DSO_SUFFIX) == 0)
+ break;
+ }
+
+@@ -1670,7 +1690,7 @@ gld_${EMULATION_NAME}_after_open (void)
+ then leave the filename alone. */
+ pnt = strrchr (is->the_bfd->filename, '.');
+
+- if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
++ if (is_ms_arch && (filename_cmp (pnt, PE_DSO_SUFFIX) == 0))
+ {
+ int idata2 = 0, reloc_count=0;
+ asection *sec;
+@@ -1834,8 +1854,14 @@ gld_${EMULATION_NAME}_finish (void)
+ || (!link_info.relocatable && pep_def_file->num_exports != 0))
+ {
+ pep_dll_fill_sections (link_info.output_bfd, &link_info);
++
++ /* generate legacy implib? */
+ if (pep_implib_filename)
+ pep_dll_generate_implib (pep_def_file, pep_implib_filename, &link_info);
++
++ /* generate mdso implib? */
++ if (pep_dsolib_filename)
++ pep_dll_generate_dsolib (pep_def_file, 0, pep_dsolib_filename, pep_dsolib_loader_path, 64);
+ }
+
+ if (pep_out_def_filename)
+@@ -2062,16 +2088,25 @@ gld_${EMULATION_NAME}_open_dynamic_archive
+ }
+ libname_fmt [] =
+ {
++ /* optionally support ldso-specific import libraries */
++#ifdef PE_TARGET_MDSO
++ { "lib%s"PE_DSOLIB_SUFFIX, FALSE },
++#endif
+ /* Preferred explicit import library for dll's. */
+- { "lib%s.dll.a", FALSE },
++ { "lib%s"PE_IMPLIB_SUFFIX, FALSE },
+ /* Alternate explicit import library for dll's. */
+- { "%s.dll.a", FALSE },
++ { "%s"PE_IMPLIB_SUFFIX, FALSE },
++#ifdef PE_TARGET_MDSO
++ /* libfoo.so precedes libfoo.a, generate mdso implib as needed */
++ { "lib%s"PE_DSO_SUFFIX, FALSE },
++#endif
+ /* "libfoo.a" could be either an import lib or a static lib.
+ For backwards compatibility, libfoo.a needs to precede
+ libfoo.dll and foo.dll in the search. */
+ { "lib%s.a", FALSE },
+ /* The 'native' spelling of an import lib name is "foo.lib". */
+ { "%s.lib", FALSE },
++#ifndef PE_TARGET_MDSO
+ #ifdef DLL_SUPPORT
+ /* Try "<prefix>foo.dll" (preferred dll name, if specified). */
+ { "%s%s.dll", TRUE },
+@@ -2080,6 +2115,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
+ { "lib%s.dll", FALSE },
+ /* Finally try 'native' dll name "foo.dll". */
+ { "%s.dll", FALSE },
++#endif
+ /* Note: If adding more formats to this table, make sure to check to
+ see if their length is longer than libname_fmt[0].format, and if
+ so, update the call to xmalloc() below. */
+diff -ru --new-file a/ld/configure.tgt b/ld/configure.tgt
+--- a/ld/configure.tgt 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/configure.tgt 2019-08-15 06:52:04.192983142 -0400
+@@ -319,6 +319,12 @@
+ test "$targ" != "$host" && LIB_PATH='${tooldir}/lib/w32api' ;;
+ i[3-7]86-*-mingw32*) targ_emul=i386pe ;
+ targ_extra_ofiles="deffilep.o pe-dll.o" ;;
++i[3-7]86-*-midipix*) targ_emul=i386pe ;
++ targ_extra_ofiles="deffilep.o pe-dll.o pe-mdso.o" ;
++ PE_FRAMEWORK_LIBS="-lperk -lmdso" ;
++ PE_EXECUTABLE_NAME=a.out ;
++ PE_CRT_SECTION=no ;
++ PE_CYGWIN_FORK_SUPPORT=no ;;
+ x86_64-*-pe | x86_64-*-pep) targ_emul=i386pep ;
+ targ_extra_emuls=i386pe ;
+ targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o" ;;
+@@ -329,7 +335,14 @@
+ x86_64-*-mingw*) targ_emul=i386pep ;
+ targ_extra_emuls=i386pe
+ targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o" ;;
+-i[3-7]86-*-interix*) targ_emul=i386pe_posix;
++x86_64-*-midipix*) targ_emul=i386pep ;
++ targ_extra_emuls=i386pe ;
++ targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o pe-mdso.o" ;
++ PE_FRAMEWORK_LIBS="-lperk -lmdso" ;
++ PE_EXECUTABLE_NAME=a.out ;
++ PE_CRT_SECTION=no ;
++ PE_CYGWIN_FORK_SUPPORT=no ;;
++i[3-7]86-*-interix*) targ_emul=i386pe_posix ;
+ targ_extra_ofiles="deffilep.o pe-dll.o" ;;
+ i[3-7]86-*-beospe*) targ_emul=i386beos ;;
+ i[3-7]86-*-beos*) targ_emul=elf_i386_be ;;
+@@ -825,6 +838,10 @@
+ *-*-linux*)
+ ;;
+
++*-*-midipix*)
++ NATIVE_LIB_DIRS=
++ ;;
++
+ *-*-netbsd*)
+ ;;
+
+diff -ru --new-file a/ld/Makefile.in b/ld/Makefile.in
+--- a/ld/Makefile.in 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/Makefile.in 2019-08-15 05:53:23.807970635 -0400
+@@ -54,6 +54,10 @@
+ host_triplet = @host@
+ target_triplet = @target@
+ bin_PROGRAMS = ld-new$(EXEEXT)
++PE_EXECUTABLE_NAME = @pe_executable_name@
++PE_FRAMEWORK_LIBS = @pe_framework_libs@
++PE_CRT_SECTION = @pe_crt_section@
++PE_CYGWIN_FORK_SUPPORT = @pe_cygwin_fork_support@
+
+ # Automake 1.9 will only build info files in the objdir if they are
+ # mentioned in DISTCLEANFILES. It doesn't have to be unconditional,
+@@ -831,7 +835,7 @@
+ POTFILES = $(CFILES) $(HFILES) $(EMULATION_FILES)
+
+ # These all start with e so 'make clean' can find them.
+-GENSCRIPTS = LIB_PATH='${LIB_PATH}' $(SHELL) $(srcdir)/genscripts.sh "${srcdir}" "${libdir}" "${prefix}" "${exec_prefix}" @host@ @target@ @target_alias@ "@EMULATION_LIBPATH@" "@NATIVE_LIB_DIRS@" @use_sysroot@ @enable_initfini_array@
++GENSCRIPTS = EXECUTABLE_NAME='${PE_EXECUTABLE_NAME}' PE_FRAMEWORK_LIBS='${PE_FRAMEWORK_LIBS}' PE_CRT_SECTION='${PE_CRT_SECTION}' PE_CYGWIN_FORK_SUPPORT='${PE_CYGWIN_FORK_SUPPORT}' LIB_PATH='${LIB_PATH}' $(SHELL) $(srcdir)/genscripts.sh "${srcdir}" "${libdir}" "${prefix}" "${exec_prefix}" @host@ @target@ @target_alias@ "@EMULATION_LIBPATH@" "@NATIVE_LIB_DIRS@" @use_sysroot@ @enable_initfini_array@
+ GEN_DEPENDS = $(srcdir)/genscripts.sh stringify.sed
+ ELF_DEPS = $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/elf-generic.em $(srcdir)/scripttempl/DWARF.sc
+ ELF_GEN_DEPS = $(srcdir)/emultempl/generic.em $(srcdir)/emultempl/elf-generic.em $(srcdir)/emultempl/genelf.em $(srcdir)/scripttempl/DWARF.sc
+@@ -1032,7 +1036,7 @@
+ else :; fi
+ ld-new$(EXEEXT): $(ld_new_OBJECTS) $(ld_new_DEPENDENCIES)
+ @rm -f ld-new$(EXEEXT)
+- $(LINK) $(ld_new_OBJECTS) $(ld_new_LDADD) $(LIBS)
++ $(LINK) $(ld_new_OBJECTS) $(ld_new_LDADD) $(LIBS) $(PE_FRAMEWORK_LIBS)
+
+ mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+@@ -3411,16 +3415,16 @@
+ ld-partial.@OBJEXT@: ld-new$(EXEEXT)
+ ./ld-new$(EXEEXT) $(HOSTING_EMU) -o ld-partial.@OBJEXT@ -r $(OFILES)
+ ld1$(EXEEXT): ld-partial.@OBJEXT@
+- ./ld-new$(EXEEXT) $(HOSTING_EMU) -o ld1$(EXEEXT) $(HOSTING_CRT0) ld-partial.@OBJEXT@ $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS)
++ ./ld-new$(EXEEXT) $(HOSTING_EMU) -o ld1$(EXEEXT) $(HOSTING_CRT0) ld-partial.@OBJEXT@ $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS) $(PE_FRAMEWORK_LIBS)
+
+ ld1-full$(EXEEXT): ld-new
+- ./ld-new$(EXEEXT) $(HOSTING_EMU) -o ld1-full$(EXEEXT) $(HOSTING_CRT0) $(OFILES) $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS)
++ ./ld-new$(EXEEXT) $(HOSTING_EMU) -o ld1-full$(EXEEXT) $(HOSTING_CRT0) $(OFILES) $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS) $(PE_FRAMEWORK_LIBS)
+
+ ld2$(EXEEXT): ld1$(EXEEXT)
+- ./ld1$(EXEEXT) $(HOSTING_EMU) -o ld2$(EXEEXT) $(HOSTING_CRT0) $(OFILES) $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS)
++ ./ld1$(EXEEXT) $(HOSTING_EMU) -o ld2$(EXEEXT) $(HOSTING_CRT0) $(OFILES) $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS) $(PE_FRAMEWORK_LIBS)
+
+ ld3$(EXEEXT): ld2$(EXEEXT)
+- ./ld2$(EXEEXT) $(HOSTING_EMU) -o ld3$(EXEEXT) $(HOSTING_CRT0) $(OFILES) $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS)
++ ./ld2$(EXEEXT) $(HOSTING_EMU) -o ld3$(EXEEXT) $(HOSTING_CRT0) $(OFILES) $(TESTBFDLIB) $(LIBIBERTY) $(HOSTING_LIBS) $(LIBS) $(PE_FRAMEWORK_LIBS)
+
+ bootstrap: ld3$(EXEEXT)
+ cmp ld2$(EXEEXT) ld3$(EXEEXT)
+diff -ru --new-file a/ld/scripttempl/pep.sc b/ld/scripttempl/pep.sc
+--- a/ld/scripttempl/pep.sc 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/scripttempl/pep.sc 2015-03-11 20:10:05.324773952 -0400
+@@ -92,12 +92,17 @@
+ ${RELOCATING+ *(.gcc_except_table)}
+ }
+
++EOF
++if [ x"$PE_CYGWIN_FORK_SUPPORT" != xno ]; then cat << EOF
+ /* The Cygwin32 library uses a section to avoid copying certain data
+ on fork. This used to be named ".data$nocopy". The linker used
+ to include this between __data_start__ and __data_end__, but that
+ breaks building the cygwin32 dll. Instead, we name the section
+ ".data_cygwin_nocopy" and explicitly include it after __data_end__. */
+
++EOF
++fi
++cat << EOF
+ .data ${RELOCATING+BLOCK(__section_alignment__)} :
+ {
+ ${RELOCATING+__data_start__ = . ;}
+@@ -106,7 +111,12 @@
+ ${R_DATA}
+ *(.jcr)
+ ${RELOCATING+__data_end__ = . ;}
++EOF
++if [ x"$PE_CYGWIN_FORK_SUPPORT" != xno ]; then cat << EOF
+ ${RELOCATING+*(.data_cygwin_nocopy)}
++EOF
++fi
++cat << EOF
+ }
+
+ .rdata ${RELOCATING+BLOCK(__section_alignment__)} :
+@@ -170,6 +180,8 @@
+ ${RELOCATING+__IAT_end__ = .;}
+ ${R_IDATA67}
+ }
++EOF
++if [ x"$PE_CRT_SECTION" != xno ]; then cat << EOF
+ .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
+ {
+ ${RELOCATING+___crt_xc_start__ = . ;}
+@@ -188,6 +200,9 @@
+ ${R_CRT_XT}
+ ${RELOCATING+___crt_xt_end__ = . ;}
+ }
++EOF
++fi
++cat << EOF
+
+ /* Windows TLS expects .tls\$AAA to be at the start and .tls\$ZZZ to be
+ at the end of the .tls section. This is important because _tls_start MUST
+diff -ru --new-file a/ld/scripttempl/pe.sc b/ld/scripttempl/pe.sc
+--- a/ld/scripttempl/pe.sc 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/scripttempl/pe.sc 2015-03-11 20:10:10.036774102 -0400
+@@ -92,12 +92,17 @@
+ ${RELOCATING+ *(.gcc_except_table)}
+ }
+
++EOF
++if [ x"$PE_CYGWIN_FORK_SUPPORT" != xno ]; then cat << EOF
+ /* The Cygwin32 library uses a section to avoid copying certain data
+ on fork. This used to be named ".data$nocopy". The linker used
+ to include this between __data_start__ and __data_end__, but that
+ breaks building the cygwin32 dll. Instead, we name the section
+ ".data_cygwin_nocopy" and explicitly include it after __data_end__. */
+
++EOF
++fi
++cat << EOF
+ .data ${RELOCATING+BLOCK(__section_alignment__)} :
+ {
+ ${RELOCATING+__data_start__ = . ;}
+@@ -106,7 +111,12 @@
+ ${R_DATA}
+ *(.jcr)
+ ${RELOCATING+__data_end__ = . ;}
++EOF
++if [ x"$PE_CYGWIN_FORK_SUPPORT" != xno ]; then cat << EOF
+ ${RELOCATING+*(.data_cygwin_nocopy)}
++EOF
++fi
++cat << EOF
+ }
+
+ .rdata ${RELOCATING+BLOCK(__section_alignment__)} :
+@@ -165,6 +175,8 @@
+ ${RELOCATING+__IAT_end__ = .;}
+ ${R_IDATA67}
+ }
++EOF
++if [ x"$PE_CRT_SECTION" != xno ]; then cat << EOF
+ .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
+ {
+ ${RELOCATING+___crt_xc_start__ = . ;}
+@@ -183,6 +195,9 @@
+ ${R_CRT_XT}
+ ${RELOCATING+___crt_xt_end__ = . ;}
+ }
++EOF
++fi
++cat << EOF
+
+ /* Windows TLS expects .tls\$AAA to be at the start and .tls\$ZZZ to be
+ at the end of section. This is important because _tls_start MUST
+diff -ru --new-file a/binutils/winduni.c b/binutils/winduni.c
+--- a/binutils/winduni.c 2014-07-03 01:37:23.000000000 -0400
++++ b/binutils/winduni.c 2015-02-14 11:18:32.987163288 -0500
+@@ -57,7 +57,7 @@
+ /* Codepages mapped. */
+ static local_iconv_map codepages[] =
+ {
+- { 0, "MS-ANSI" },
++ { 0, "cp1252" },
+ { 1, "WINDOWS-1252" },
+ { 437, "MS-ANSI" },
+ { 737, "MS-GREEK" },
+diff -ru a/ld/pe-dll.c b/ld/pe-dll.c
+--- a/ld/pe-dll.c 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/pe-dll.c 2019-06-30 22:22:22.643202346 -0400
+@@ -27,6 +27,7 @@
+ #include "safe-ctype.h"
+
+ #include <time.h>
++#include <sys/wait.h>
+
+ #include "ld.h"
+ #include "ldexp.h"
+@@ -40,6 +41,7 @@
+ #include "coff/internal.h"
+ #include "../bfd/libcoff.h"
+ #include "deffile.h"
++#include "peimplib.h"
+
+ #ifdef pe_use_x86_64
+
+@@ -234,7 +236,11 @@
+ { STRING_COMMA_LEN ("impure_ptr") },
+ { STRING_COMMA_LEN ("_impure_ptr") },
+ { STRING_COMMA_LEN ("_fmode") },
++ #ifdef PE_TARGET_MIDIPIX
++ /* (default) excluded symbols are defined by the caller (specs, etc.) */
++ #else
+ { STRING_COMMA_LEN ("environ") },
++ #endif
+ { NULL, 0 }
+ };
+
+@@ -644,10 +650,13 @@
+ {
+ int i, j;
+ struct bfd_link_hash_entry *blhe;
++ struct bfd_link_hash_entry *blhew;
+ bfd *b;
+ struct bfd_section *s;
+ def_file_export *e = 0;
+ bfd_boolean resort_needed;
++ char *weaksym;
++ char *objsym;
+
+ if (!pe_def_file)
+ pe_def_file = def_file_empty ();
+@@ -737,6 +746,16 @@
+ if (is_import (sn))
+ continue;
+
++ if (!strncmp (sn, ".weak.", 6) && strchr (sn + 6, '.'))
++ {
++ objsym = strdup (sn);
++ weaksym = strdup (sn + 6);
++ *(strchr (weaksym, '.')) = '\0';
++ sn = weaksym;
++ }
++ else
++ weaksym = 0;
++
+ name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
+ sprintf (name, "%s%s", "__imp_", sn);
+
+@@ -745,7 +764,9 @@
+ free (name);
+
+ if (blhe && blhe->type == bfd_link_hash_defined)
+- continue;
++ if (strncmp (blhe->u.def.section->name, ".got$", 5))
++ if (strncmp (blhe->u.def.section->name, ".dsosyms$", 9))
++ continue;
+ }
+
+ if (pe_details->underscored && *sn == '_')
+@@ -756,12 +777,30 @@
+ int is_dup = 0;
+ def_file_export *p;
+
+- p = def_file_add_export (pe_def_file, sn, 0, -1,
+- NULL, &is_dup);
+- /* Fill data flag properly, from dlltool.c. */
+- if (!is_dup)
+- p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
+- }
++ if (weaksym) {
++ blhew = bfd_link_hash_lookup (info->hash, weaksym,
++ FALSE, FALSE, FALSE);
++ }
++
++ if (!weaksym || blhew) {
++ p = def_file_add_export (pe_def_file, sn, 0, -1,
++ NULL, &is_dup);
++
++ /* Fill data flag properly, from dlltool.c. */
++ if (!is_dup)
++ p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
++
++ if (weaksym) {
++ if (blhew->type != bfd_link_hash_defined) {
++ free (p->internal_name);
++ p->internal_name = objsym;
++ }
++ }
++
++ if (weaksym)
++ free (weaksym);
++ }
++ }
+ }
+ }
+ }
+@@ -910,6 +949,7 @@
+
+ if (blhe
+ && (blhe->type == bfd_link_hash_defined
++ || (blhe->type == bfd_link_hash_defweak)
+ || (blhe->type == bfd_link_hash_common)))
+ {
+ count_exported++;
+@@ -919,7 +959,7 @@
+ /* Only fill in the sections. The actual offsets are computed
+ in fill_exported_offsets() after common symbols are laid
+ out. */
+- if (blhe->type == bfd_link_hash_defined)
++ if ((blhe->type == bfd_link_hash_defined) || (blhe->type == bfd_link_hash_defweak))
+ exported_symbol_sections[i] = blhe->u.def.section;
+ else
+ exported_symbol_sections[i] = blhe->u.c.p->section;
+@@ -2688,6 +2728,160 @@
+ }
+
+
++
++
++void
++pe_dll_generate_dsolib(
++ def_file * def,
++ const char ** expsyms,
++ const char * dsolib_file_name,
++ const char * loader_path,
++ unsigned char bits)
++{
++ char * mdso_exe_path;
++ char * slash;
++ char * mark;
++ FILE * fout;
++ char * argv[10];
++ int fd[2];
++ int pid;
++ int rpid;
++ int ecode;
++ int i;
++
++ /* sigh; even though pe_dll_generate_implib() might fail, */
++ /* ld's _finish() code path assumes no errors could occur */
++ /* and accordingly does not perform any checks upon return. */
++ /* handle errors here and invoke xexit() as needed. */
++
++ /* bits */
++ if ((bits != 32) && (bits != 64)) {
++ fprintf(stderr,"%s: internal error (bits == %d.\n",program_name,bits);
++ xexit(EXIT_FAILURE);
++ }
++
++ /* mdso_exe_path buffer alloc */
++ if (!(mdso_exe_path = calloc(1,strlen(program_name) + strlen("mdso") + 1))) {
++ fprintf(stderr,"%s: cannot allocate mdso_exe_path buffer.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ /* mdso_exe_path init */
++ strcpy(mdso_exe_path,program_name);
++
++ if ((slash = strrchr(mdso_exe_path,'/')))
++ slash++;
++ else
++ slash = mdso_exe_path;
++
++ if ((mark = strrchr(slash,'-')))
++ mark++;
++ else
++ mark = slash;
++
++ sprintf(mark,"%s","mdso");
++
++ /* pipe */
++ if (pipe(fd)) {
++ fprintf(stderr,"%s: cannot create a pipe.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ /* fout init */
++ if (!(fout = fdopen(fd[1],"a"))) {
++ fprintf(stderr,"%s: pipe fdopen failed.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ /* fork */
++ if ((pid = fork()) < 0) {
++ fprintf(stderr,"%s: fork failed.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ /* child: execvp */
++ if (pid == 0) {
++ argv[0] = mdso_exe_path;
++ argv[1] = (bits == 64) ? "-m64" : "-m32";
++ argv[2] = "--implib";
++ argv[3] = (char *)dsolib_file_name;
++ argv[4] = "--libname";
++ argv[5] = (def->name) ? def->name : (char *)dll_name;
++
++ if (loader_path) {
++ argv[6] = "--libpath";
++ argv[7] = (char *)loader_path;
++ argv[8] = "-";
++ argv[9] = 0;
++ } else {
++ argv[6] = "-";
++ argv[7] = 0;
++ }
++
++ fclose(fout);
++ close(fd[1]);
++ close(0);
++
++ if (dup(fd[0]) == 0)
++ execvp(mdso_exe_path,argv);
++
++ exit(EXIT_FAILURE);
++ }
++
++ /* be good */
++ free(mdso_exe_path);
++
++ /* parent: expsyms --> pipe */
++ if (expsyms) {
++ for (; *expsyms; ) {
++ if (fprintf(fout,"%s\n",*expsyms++) < 0) {
++ fprintf(stderr,"%s: pipe write operation failed.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++ }
++ } else {
++ for (i=0; i < def->num_exports; i++) {
++ if (!(pe_def_file->exports[i].flag_private)) {
++ if (fprintf(fout,"%s\n",def->exports[i].name) < 0) {
++ fprintf(stderr,"%s: pipe write operation failed.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++ }
++ }
++ }
++
++ if (fflush(fout) < 0) {
++ fprintf(stderr,"%s: pipe fflush operation failed.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ fclose(fout);
++ close(fd[0]);
++
++ /* obtain child exit status */
++ if ((rpid = waitpid(pid,&ecode,0)) < 0) {
++ fprintf(stderr,"%s: waitpid operation failed.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ if (rpid != pid) {
++ fprintf(stderr,"%s: waitpid returned an unexpected pid.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ if (!(WIFEXITED(ecode))) {
++ fprintf(stderr,"%s: waitpid reported abnormal child process termination.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++
++ if (WEXITSTATUS(ecode)) {
++ fprintf(stderr,"%s: the child process returned an error.\n",program_name);
++ xexit(EXIT_FAILURE);
++ }
++}
++
++
++
+ void
+ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
+ {
+diff -ru a/ld/pe-dll.h b/ld/pe-dll.h
+--- a/ld/pe-dll.h 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/pe-dll.h 2017-10-14 20:01:45.817295022 -0400
+@@ -49,6 +49,8 @@
+ (const char *);
+ extern void pe_dll_generate_implib
+ (def_file *, const char *, struct bfd_link_info *);
++extern void pe_dll_generate_dsolib
++ (def_file *, const char **, const char *, const char *, unsigned char);
+ extern void pe_process_import_defs
+ (bfd *, struct bfd_link_info *);
+ extern bfd_boolean pe_implied_import_dll
+diff -ru a/ld/pep-dll.c b/ld/pep-dll.c
+--- a/ld/pep-dll.c 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/pep-dll.c 2017-10-14 10:14:35.490521636 -0400
+@@ -54,6 +54,7 @@
+ #define pe_dll_fill_sections pep_dll_fill_sections
+ #define pe_exe_fill_sections pep_exe_fill_sections
+ #define pe_dll_generate_implib pep_dll_generate_implib
++#define pe_dll_generate_dsolib pep_dll_generate_dsolib
+ #define pe_dll_add_excludes pep_dll_add_excludes
+ #define pe_walk_relocs_of_symbol pep_walk_relocs_of_symbol
+ #define pe_bfd_is_dll pep_bfd_is_dll
+diff -ru a/ld/pep-dll.h b/ld/pep-dll.h
+--- a/ld/pep-dll.h 2014-07-03 01:37:48.000000000 -0400
++++ b/ld/pep-dll.h 2017-10-14 19:17:26.885792850 -0400
+@@ -46,6 +46,7 @@
+ extern void pep_dll_add_excludes (const char *, const exclude_type);
+ extern void pep_dll_generate_def_file (const char *);
+ extern void pep_dll_generate_implib (def_file *, const char *, struct bfd_link_info *);
++extern void pep_dll_generate_dsolib (def_file *, const char **, const char *, const char *, unsigned char);
+ extern void pep_process_import_defs (bfd *, struct bfd_link_info *);
+ extern bfd_boolean pep_implied_import_dll (const char *);
+ extern void pep_dll_build_sections (bfd *, struct bfd_link_info *);
+diff -ru --new-file a/bfd/config.bfd b/bfd/config.bfd
+--- a/bfd/config.bfd 2014-07-03 01:37:20.000000000 -0400
++++ b/bfd/config.bfd 2015-02-14 11:27:08.199179775 -0500
+@@ -679,7 +679,7 @@
+ targ_archs="$targ_archs bfd_arm_arch"
+ want64=true
+ ;;
+- x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin)
++ x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin | x86_64-*-midipix*)
+ targ_defvec=x86_64_pe_vec
+ targ_selvecs="x86_64_pe_vec x86_64_pei_vec x86_64_pe_be_vec x86_64_elf64_vec l1om_elf64_vec k1om_elf64_vec i386_pe_vec i386_pei_vec i386_elf32_vec"
+ want64=true
+@@ -731,7 +731,7 @@
+ targ_defvec=i386_elf32_vec
+ targ_selvecs=i386_coff_vec
+ ;;
+- i[3-7]86-*-mingw32* | i[3-7]86-*-cygwin* | i[3-7]86-*-winnt | i[3-7]86-*-pe)
++ i[3-7]86-*-mingw32* | i[3-7]86-*-cygwin* | i[3-7]86-*-winnt | i[3-7]86-*-pe | i[3-7]86-*-midipix*)
+ targ_defvec=i386_pe_vec
+ targ_selvecs="i386_pe_vec i386_pei_vec i386_elf32_vec"
+ targ_underscore=yes
+diff -ru --new-file a/binutils/configure b/binutils/configure
+--- a/binutils/configure 2014-07-03 01:37:22.000000000 -0400
++++ b/binutils/configure 2015-09-13 21:35:09.738957435 -0400
+@@ -14015,7 +14015,7 @@
+ BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
+ BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
+ ;;
+- x86_64-*-mingw* | x86_64-*-cygwin*)
++ x86_64-*-mingw* | x86_64-*-midipix* | x86_64-*-cygwin*)
+ BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
+ if test -z "$DLLTOOL_DEFAULT"; then
+ DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_MX86_64"
+@@ -14025,7 +14025,7 @@
+ BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
+ BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
+ ;;
+- i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw32** | i[3-7]86-*-netbsdpe*)
++ i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-midipix* | i[3-7]86-*-mingw32** | i[3-7]86-*-netbsdpe*)
+ BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
+ if test -z "$DLLTOOL_DEFAULT"; then
+ DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_I386"
+diff -ru --new-file a/configure b/configure
+--- a/configure 2014-07-03 01:37:23.000000000 -0400
++++ b/configure 2015-03-11 17:07:15.820422926 -0400
+@@ -3428,6 +3428,9 @@
+ x86_64-*-mingw*)
+ noconfigdirs="$noconfigdirs ${libgcj}"
+ ;;
++ *-midipix*)
++ noconfigdirs="$noconfigdirs ${libgcj}"
++ ;;
+ mmix-*-*)
+ noconfigdirs="$noconfigdirs target-libffi target-boehm-gc"
+ ;;
+@@ -3549,6 +3552,9 @@
+ *-*-mingw*)
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+ ;;
++ *-*-midipix*)
++ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
++ ;;
+ *-*-netbsd*)
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+ ;;
+@@ -6257,7 +6263,7 @@
+
+ target_elf=no
+ case $target in
+- *-darwin* | *-aix* | *-cygwin* | *-mingw* | *-aout* | *-*coff* | \
++ *-darwin* | *-aix* | *-cygwin* | *-mingw* | *-midipix* | *-aout* | *-*coff* | \
+ *-msdosdjgpp* | *-vms* | *-wince* | *-*-pe* | \
+ alpha*-dec-osf* | *-interix* | hppa[12]*-*-hpux*)
+ target_elf=no
+diff -ru --new-file a/gas/configure.tgt b/gas/configure.tgt
+--- a/gas/configure.tgt 2014-07-03 01:37:25.000000000 -0400
++++ b/gas/configure.tgt 2015-02-14 11:27:08.223179776 -0500
+@@ -262,7 +262,7 @@
+ i*) fmt=coff em=pe ;;
+ esac ;;
+ i386-*-interix*) fmt=coff em=interix ;;
+- i386-*-mingw*)
++ i386-*-mingw* | i386-*-midipix*)
+ case ${cpu} in
+ x86_64*) fmt=coff em=pep ;;
+ i*) fmt=coff em=pe ;;
+diff -ru a/bfd/cofflink.c b/bfd/cofflink.c
+--- a/bfd/cofflink.c 2014-07-03 01:37:20.000000000 -0400
++++ b/bfd/cofflink.c 2015-06-13 20:22:46.000389638 -0400
+@@ -202,6 +202,7 @@
+ bfd_size_type symesz;
+ bfd_byte *esym;
+ bfd_byte *esym_end;
++ char *weaksym;
+
+ *pneeded = FALSE;
+
+@@ -236,6 +237,16 @@
+ && CONST_STRNEQ (name, "__imp_"))
+ h = bfd_link_hash_lookup (info->hash, name + 6, FALSE, FALSE, TRUE);
+
++ if (!h && !strncmp (name, ".weak.", 6) && strchr (name + 6, '.'))
++ {
++ weaksym = strdup (name + 6);
++ *(strchr (weaksym, '.')) = '\0';
++ h = bfd_link_hash_lookup (info->hash, weaksym, FALSE, FALSE, TRUE);
++ name = weaksym;
++ }
++ else
++ weaksym = 0;
++
+ /* We are only interested in symbols that are currently
+ undefined. If a symbol is currently known to be common,
+ COFF linkers do not bring in an object file which defines
+@@ -249,6 +260,9 @@
+ *pneeded = TRUE;
+ return TRUE;
+ }
++
++ if (weaksym)
++ free (weaksym);
+ }
+
+ esym += (sym.n_numaux + 1) * symesz;
+@@ -320,6 +334,7 @@
+ bfd_byte *esym;
+ bfd_byte *esym_end;
+ bfd_size_type amt;
++ char *weaksym;
+
+ symcount = obj_raw_syment_count (abfd);
+
+@@ -476,6 +491,20 @@
+ addit = FALSE;
+ }
+
++ if (!strncmp (name, ".weak.", 6) && strchr (name + 6, '.'))
++ {
++ if (! (bfd_coff_link_add_one_symbol
++ (info, abfd, name, flags, section, value,
++ (const char *) NULL, copy, FALSE,
++ (struct bfd_link_hash_entry **) sym_hash)))
++ goto error_return;
++
++ weaksym = strdup (name + 6);
++ *(strchr(weaksym, '.')) = 0;
++ name = weaksym;
++ flags |= BSF_WEAK;
++ }
++
+ if (addit)
+ {
+ if (! (bfd_coff_link_add_one_symbol
+diff -ru a/bfd/linker.c b/bfd/linker.c
+--- a/bfd/linker.c 2014-07-03 01:37:21.000000000 -0400
++++ b/bfd/linker.c 2015-06-06 17:51:24.148275212 -0400
+@@ -1050,6 +1050,7 @@
+ struct archive_hash_table arsym_hash;
+ unsigned int indx;
+ struct bfd_link_hash_entry **pundef;
++ char *weaksym;
+
+ if (! bfd_has_map (abfd))
+ {
+@@ -1073,6 +1074,13 @@
+ struct archive_hash_entry *arh;
+ struct archive_list *l, **pp;
+
++ if (!strncmp (arsym->name, ".weak.", 6) && strchr (arsym->name + 6, '.'))
++ {
++ weaksym = strdup (arsym->name + 6);
++ *(strchr (weaksym, '.')) = '\0';
++ arsym->name = weaksym;
++ }
++
+ arh = archive_hash_lookup (&arsym_hash, arsym->name, TRUE, FALSE);
+ if (arh == NULL)
+ goto error_return;
+diff -ru a/gas/config/tc-i386.c b/gas/config/tc-i386.c
+--- a/gas/config/tc-i386.c 2014-07-03 01:37:25.000000000 -0400
++++ b/gas/config/tc-i386.c 2015-06-12 22:40:37.100250091 -0400
+@@ -9148,25 +9148,6 @@
+ value += md_pcrel_from (fixP);
+ #endif
+ }
+-#if defined (OBJ_COFF) && defined (TE_PE)
+- if (fixP->fx_addsy != NULL
+- && S_IS_WEAK (fixP->fx_addsy)
+- /* PR 16858: Do not modify weak function references. */
+- && ! fixP->fx_pcrel)
+- {
+-#if !defined (TE_PEP)
+- /* For x86 PE weak function symbols are neither PC-relative
+- nor do they set S_IS_FUNCTION. So the only reliable way
+- to detect them is to check the flags of their containing
+- section. */
+- if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
+- && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
+- ;
+- else
+-#endif
+- value -= S_GET_VALUE (fixP->fx_addsy);
+- }
+-#endif
+
+ /* Fix a few things - the dynamic linker expects certain values here,
+ and we must not disappoint it. */
+@@ -9237,8 +9218,11 @@
+ fixP->fx_done = 0;
+ /* Remember value for tc_gen_reloc. */
+ fixP->fx_addnumber = value;
+- /* Clear out the frag for now. */
+- value = 0;
++ /* for data symbols, cancel the effect of the relocation */
++ if (!((S_GET_SEGMENT (fixP->fx_addsy)->flags) & SEC_CODE))
++ value = -S_GET_VALUE (fixP->fx_addsy);
++ else
++ value = 0;
+ }
+ #endif
+ else if (use_rela_relocations)
+
+--- a/binutils/rename.c 2014-07-03 01:37:22.000000000 -0400
++++ b/binutils/rename.c 2015-11-25 23:13:38.086948592 -0500
+@@ -167,7 +167,10 @@
+ && s.st_nlink == 1)
+ )
+ {
+- ret = rename (from, to);
++ if ((ret = rename (from, to)))
++ if (!(ret = simple_copy (from, to)))
++ unlink (from);
++
+ if (ret == 0)
+ {
+ if (exists)
diff --git a/patches/gdb-7.12.midipix.patch b/patches/gdb-7.12.midipix.patch
new file mode 100644
index 0000000..feca3b1
--- /dev/null
+++ b/patches/gdb-7.12.midipix.patch
@@ -0,0 +1,368 @@
+==========
+gdb.config:
+==========
+#!/bin/sh
+
+ CFLAGS="-g3 -O0" \
+ CXXFLAGS="-g3 -O0" \
+ CFLAGS_FOR_TARGET="-g3 -O0 --sysroot=$HOME/midipix/nt64/debug/native" \
+ CXX_FOR_TARGET="-g3 -O0 --sysroot=$HOME/midipix/nt64/debug/native" \
+ LDFLAGS_FOR_TARGET="--sysroot=$HOME/midipix/nt64/debug/native" \
+../gdb-7.12/configure \
+ --with-system-zlib \
+ --with-system-libiberty \
+ --with-system-readline \
+ --host=x86_64-nt64-midipix \
+ --target=x86_64-nt64-midipix \
+ --build=$(cc -dumpmachine)
+
+========
+gdb.make:
+========
+#!/bin/sh
+
+make LIBTOOL=rdlibtool MAKE="make LIBTOOL=rdlibtool" -j8 \
+ SYSROOT_FLAGS=--sysroot=$HOME/midipix/nt64/debug/native
+
+
+===========
+gdb.install:
+===========
+#!/bin/sh
+
+make LIBTOOL=rdlibtool MAKE="make LIBTOOL=rdlibtool" -j8 \
+ SYSROOT_FLAGS=--sysroot=$HOME/midipix/nt64/debug/native \
+ DESTDIR=destdir install
+
+diff -ru --new-file a/bfd/config.bfd b/bfd/config.bfd
+--- a/bfd/config.bfd 2016-08-01 15:50:20.000000000 +0000
++++ b/bfd/config.bfd 2019-06-03 23:32:57.633401252 +0000
+@@ -729,7 +729,7 @@
+ targ_archs="$targ_archs bfd_arm_arch"
+ want64=true
+ ;;
+- x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin)
++ x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin | x86_64-*-midipix)
+ targ_defvec=x86_64_pe_vec
+ targ_selvecs="x86_64_pe_vec x86_64_pei_vec x86_64_pe_be_vec x86_64_elf64_vec l1om_elf64_vec k1om_elf64_vec i386_pe_vec i386_pei_vec i386_elf32_vec iamcu_elf32_vec"
+ want64=true
+@@ -782,7 +782,7 @@
+ targ_defvec=i386_elf32_vec
+ targ_selvecs="iamcu_elf32_vec i386_coff_vec"
+ ;;
+- i[3-7]86-*-mingw32* | i[3-7]86-*-cygwin* | i[3-7]86-*-winnt | i[3-7]86-*-pe)
++ i[3-7]86-*-mingw32* | i[3-7]86-*-cygwin* | i[3-7]86-*-winnt | i[3-7]86-*-pe | i[3-7]86-*-midipix)
+ targ_defvec=i386_pe_vec
+ targ_selvecs="i386_pe_vec i386_pei_vec i386_elf32_vec iamcu_elf32_vec"
+ targ_underscore=yes
+diff -ru --new-file a/bfd/Makefile.in b/bfd/Makefile.in
+--- a/bfd/Makefile.in 2016-10-07 17:09:21.000000000 +0000
++++ b/bfd/Makefile.in 2019-06-03 23:32:57.637401253 +0000
+@@ -385,8 +385,8 @@
+ # This is where we get zlib from. zlibdir is -L../zlib and zlibinc is
+ # -I../zlib, unless we were configured with --with-system-zlib, in which
+ # case both are empty.
+-ZLIB = @zlibdir@ -lz
+-ZLIBINC = @zlibinc@
++ZLIB = @zlibdir@ -lz $(SYSROOT_FLAGS)
++ZLIBINC = @zlibinc@ $(SYSROOT_FLAGS)
+ AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC)
+ AM_CPPFLAGS = -DBINDIR='"$(bindir)"'
+ @PLUGINS_TRUE@LIBDL = @lt_cv_dlopen_libs@
+diff -ru --new-file a/config.guess b/config.guess
+--- a/config.guess 2016-08-01 15:50:20.000000000 +0000
++++ b/config.guess 2019-06-03 23:32:57.637401253 +0000
+@@ -4,6 +4,9 @@
+
+ timestamp='2016-05-27'
+
++echo x86_64-nt64-midipix
++exit
++
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 3 of the License, or
+diff -ru --new-file a/config.sub b/config.sub
+--- a/config.sub 2016-08-01 15:50:20.000000000 +0000
++++ b/config.sub 2019-06-03 23:32:57.637401253 +0000
+@@ -1389,7 +1389,7 @@
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+- | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+diff -ru --new-file a/gdb/config/i386/midipix64.mh b/gdb/config/i386/midipix64.mh
+--- a/gdb/config/i386/midipix64.mh 1970-01-01 00:00:00.000000000 +0000
++++ b/gdb/config/i386/midipix64.mh 2019-06-03 23:33:23.657405443 +0000
+@@ -0,0 +1 @@
++
+diff -ru --new-file a/gdb/config/i386/midipix.mh b/gdb/config/i386/midipix.mh
+--- a/gdb/config/i386/midipix.mh 1970-01-01 00:00:00.000000000 +0000
++++ b/gdb/config/i386/midipix.mh 2019-06-03 23:33:15.317404098 +0000
+@@ -0,0 +1 @@
++
+diff -ru --new-file a/gdb/configure.host b/gdb/configure.host
+--- a/gdb/configure.host 2016-08-01 15:50:20.000000000 +0000
++++ b/gdb/configure.host 2019-06-03 23:32:57.637401253 +0000
+@@ -109,6 +109,7 @@
+ ;;
+ i[34567]86-*-msdosdjgpp*) gdb_host=go32 ;;
+ i[34567]86-*-linux*) gdb_host=linux ;;
++i[34567]86-*-midipix*) gdb_host=midipix ;;
+ i[34567]86-*-gnu*) gdb_host=i386gnu ;;
+ i[3456]86-*-nto*) gdb_host=nto ;;
+ i[34567]86-*-openbsd*) gdb_host=obsd ;;
+@@ -174,6 +175,7 @@
+ vax-*-openbsd*) gdb_host=obsd ;;
+
+ x86_64-*-linux*) gdb_host=linux64 ;;
++x86_64-*-midipix*) gdb_host=midipix64 ;;
+ x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
+ gdb_host=fbsd64 ;;
+ x86_64-*-netbsd* | x86_64-*-knetbsd*-gnu)
+diff -ru --new-file a/gdb/configure.tgt b/gdb/configure.tgt
+--- a/gdb/configure.tgt 2016-10-07 17:09:21.000000000 +0000
++++ b/gdb/configure.tgt 2019-06-04 14:11:22.091870500 +0000
+@@ -229,6 +229,12 @@
+ fi
+ build_gdbserver=yes
+ ;;
++i[34567]86-*-midipix*)
++ # Target: Intel 386 running win32
++ gdb_target_obs="i386-tdep.o i387-tdep.o \
++ i386-winnt-tdep.o windows-tdep.o"
++ build_gdbserver=no
++ ;;
+ i[34567]86-*-gnu*)
+ # Target: Intel 386 running the GNU Hurd
+ gdb_target_obs="i386-tdep.o i387-tdep.o i386gnu-tdep.o solib-svr4.o"
+@@ -678,6 +684,13 @@
+ windows-tdep.o"
+ build_gdbserver=yes
+ ;;
++x86_64-*-midipix)
++ # Target: Midipix
++ gdb_target_obs="amd64-tdep.o amd64-winnt-tdep.o \
++ i386-tdep.o i387-tdep.o \
++ windows-tdep.o i386-winnt-tdep.o"
++ build_gdbserver=no
++ ;;
+ x86_64-*-netbsd* | x86_64-*-knetbsd*-gnu)
+ # Target: NetBSD/amd64
+ gdb_target_obs="amd64-tdep.o amd64nbsd-tdep.o i386-tdep.o i387-tdep.o \
+@@ -718,6 +731,7 @@
+ *-*-mingw32ce*) gdb_osabi=GDB_OSABI_WINCE ;;
+ *-*-mingw* | *-*-cygwin*)
+ gdb_osabi=GDB_OSABI_CYGWIN ;;
++*-*-midipix*) gdb_osabi=GDB_OSABI_WINNT ;;
+ *-*-dicos*) gdb_osabi=GDB_OSABI_DICOS ;;
+ *-*-symbianelf*)
+ gdb_osabi=GDB_OSABI_SYMBIAN ;;
+diff -ru --new-file a/gdb/defs.h b/gdb/defs.h
+--- a/gdb/defs.h 2016-10-07 17:09:21.000000000 +0000
++++ b/gdb/defs.h 2019-06-03 23:32:57.637401253 +0000
+@@ -602,6 +602,7 @@
+ GDB_OSABI_NETBSD_ELF,
+ GDB_OSABI_OPENBSD_ELF,
+ GDB_OSABI_WINCE,
++ GDB_OSABI_WINNT,
+ GDB_OSABI_GO32,
+ GDB_OSABI_IRIX,
+ GDB_OSABI_HPUX_ELF,
+diff -ru --new-file a/gdb/doc/Makefile.in b/gdb/doc/Makefile.in
+--- a/gdb/doc/Makefile.in 2016-08-01 15:50:20.000000000 +0000
++++ b/gdb/doc/Makefile.in 2019-06-03 23:32:57.637401253 +0000
+@@ -74,8 +74,8 @@
+
+ # Where is the source dir for the READLINE library doc?
+ # Traditionally readline is in .. or .
+-READLINE_DIR = ${gdbdir}/../readline/doc
+-READLINE_TEXI_INCFLAG = @READLINE_TEXI_INCFLAG@
++READLINE_DIR = # ${gdbdir}/../readline/doc
++READLINE_TEXI_INCFLAG = # @READLINE_TEXI_INCFLAG@
+
+ # The GDB/MI docs come from a sibling directory ../mi
+ GDBMI_DIR = ${gdbdir}/mi
+@@ -673,6 +673,10 @@
+ maintainer-clean realclean: distclean
+ rm -f GDBvn.texi *.info* *.dvi *.ps *.html *.pdf $(MANS)
+
++ifeq (0,0)
++install:
++else
+ install: install-info install-man
++endif
+
+ uninstall: uninstall-info uninstall-man
+diff -ru --new-file a/gdb/Makefile.in b/gdb/Makefile.in
+--- a/gdb/Makefile.in 2016-10-07 17:09:21.000000000 +0000
++++ b/gdb/Makefile.in 2019-06-03 23:32:57.637401253 +0000
+@@ -150,7 +150,7 @@
+ # This is where we get zlib from. zlibdir is -L../zlib and zlibinc is
+ # -I../zlib, unless we were configured with --with-system-zlib, in which
+ # case both are empty.
+-ZLIB = @zlibdir@ -lz
++ZLIB = @zlibdir@ -lz $(SYSROOT_FLAGS)
+ ZLIBINC = @zlibinc@
+
+ # Where is the decnumber library? Typically in ../libdecnumber.
+@@ -162,9 +162,9 @@
+ # Where is the READLINE library? Typically in ../readline.
+ READLINE_DIR = ../readline
+ READLINE_SRC = $(srcdir)/$(READLINE_DIR)
+-READLINE = @READLINE@
+-READLINE_DEPS = @READLINE_DEPS@
+-READLINE_CFLAGS = @READLINE_CFLAGS@
++READLINE = -lreadline
++READLINE_DEPS =
++READLINE_CFLAGS = $(SYSROOT_FLAGS)
+
+ # Where is expat? This will be empty if expat was not available.
+ LIBEXPAT = @LIBEXPAT@
+@@ -468,12 +468,12 @@
+ # disassemblers?
+ OPCODES_DIR = ../opcodes
+ OPCODES_SRC = $(srcdir)/$(OPCODES_DIR)
+-OPCODES = $(OPCODES_DIR)/libopcodes.a
++OPCODES = -lopcodes
+ # Where are the other opcode tables which only have header file
+ # versions?
+ OP_INCLUDE = $(INCLUDE_DIR)/opcode
+ # Some source files like to use #include "opcodes/file.h"
+-OPCODES_CFLAGS = -I$(OP_INCLUDE) -I$(OPCODES_SRC)/..
++OPCODES_CFLAGS = -I$(OP_INCLUDE) -I$(OPCODES_SRC)/.. $(SYSROOT_FLAGS)
+
+ # The simulator is usually nonexistent; targets that include one
+ # should set this to list all the .o or .a files to be linked in.
+@@ -599,7 +599,7 @@
+ $(LIBEXPAT) $(LIBLZMA) $(LIBBABELTRACE) $(LIBIPT) \
+ $(LIBIBERTY) $(WIN32LIBS) $(LIBGNU) $(LIBICONV)
+ CDEPS = $(XM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE_DEPS) \
+- $(OPCODES) $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS) $(LIBGNU)
++ $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS) $(LIBGNU)
+
+ ADD_FILES = $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
+ ADD_DEPS = $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
+diff -ru --new-file a/gdb/amd64-winnt-tdep.c b/gdb/amd64-winnt-tdep.c
+--- a/gdb/amd64-winnt-tdep.c 1970-01-01 00:00:00.000000000 +0000
++++ b/gdb/amd64-winnt-tdep.c 2019-06-04 16:22:12.929814200 +0000
+@@ -0,0 +1,47 @@
++#include "defs.h"
++#include "osabi.h"
++#include "frame-unwind.h"
++#include "windows-tdep.h"
++#include "amd64-windows-tdep.c"
++
++#define amd64_winnt_push_dummy_call amd64_windows_push_dummy_call
++#define amd64_winnt_return_value amd64_windows_return_value
++#define amd64_winnt_skip_trampoline_code amd64_windows_skip_trampoline_code
++
++#define amd64_winnt_skip_prologue amd64_windows_skip_prologue
++#define amd64_winnt_skip_main_prologue amd64_skip_main_prologue
++
++static void
++amd64_winnt_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
++{
++ /* abi */
++ amd64_init_abi (info, gdbarch);
++ windows_init_abi (info, gdbarch);
++
++ /* out-of-band function calls */
++ set_gdbarch_push_dummy_call (gdbarch, amd64_winnt_push_dummy_call);
++ set_gdbarch_return_value (gdbarch, amd64_winnt_return_value);
++ set_gdbarch_skip_trampoline_code (gdbarch, amd64_winnt_skip_trampoline_code);
++
++ /* skip prologue methods */
++ set_gdbarch_skip_prologue (gdbarch, amd64_windows_skip_prologue);
++ set_gdbarch_skip_main_prologue (gdbarch, amd64_skip_main_prologue);
++
++ /* todo: SEH unwinder */
++ frame_unwind_append_unwinder (gdbarch, 0);
++
++ /* todo: inferior-specific, dynamically detected size of long */
++ set_gdbarch_long_bit (gdbarch, 64);
++}
++
++extern initialize_file_ftype _initialize_amd64_winnt_tdep;
++
++void
++_initialize_amd64_winnt_tdep (void)
++{
++ gdbarch_register_osabi(
++ bfd_arch_i386,
++ bfd_mach_x86_64,
++ GDB_OSABI_WINNT,
++ amd64_winnt_init_abi);
++}
+diff -ru --new-file a/gdb/i386-winnt-tdep.c b/gdb/i386-winnt-tdep.c
+--- a/gdb/i386-winnt-tdep.c 1970-01-01 00:00:00.000000000 +0000
++++ b/gdb/i386-winnt-tdep.c 2019-06-04 14:43:15.890632100 +0000
+@@ -0,0 +1,37 @@
++#include "defs.h"
++#include "osabi.h"
++#include "frame-unwind.h"
++#include "windows-tdep.h"
++
++static void
++i386_winnt_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
++{
++ /* abi */
++ windows_init_abi (info, gdbarch);
++
++ /* out-of-band function calls */
++ set_gdbarch_push_dummy_call (gdbarch, 0);
++ set_gdbarch_return_value (gdbarch, 0);
++
++ /* progloue/trampoline methods */
++ set_gdbarch_skip_main_prologue (gdbarch, 0);
++ set_gdbarch_skip_trampoline_code (gdbarch, 0);
++
++ /* auto wide charset hack */
++ set_gdbarch_auto_wide_charset (gdbarch, 0);
++
++ /* unwainder */
++ frame_unwind_append_unwinder (gdbarch, 0);
++}
++
++extern initialize_file_ftype _initialize_i386_winnt_tdep;
++
++void
++_initialize_i386_winnt_tdep (void)
++{
++ gdbarch_register_osabi(
++ bfd_arch_i386,
++ 0,
++ GDB_OSABI_WINNT,
++ i386_winnt_init_abi);
++}
+diff -ru --new-file a/gdb/osabi.c b/gdb/osabi.c
+--- a/gdb/osabi.c 2016-08-01 15:50:20.000000000 +0000
++++ b/gdb/osabi.c 2019-06-04 00:54:53.410635600 +0000
+@@ -70,6 +70,7 @@
+ { "NetBSD/ELF", NULL },
+ { "OpenBSD/ELF", NULL },
+ { "WindowsCE", NULL },
++ { "WINNT", "(midipix)" },
+ { "DJGPP", NULL },
+ { "Irix", NULL },
+ { "HP-UX/ELF", NULL },
+diff -ru --new-file a/gdb/stub-termcap.c b/gdb/stub-termcap.c
+--- a/gdb/stub-termcap.c 2016-10-07 17:09:21.000000000 +0000
++++ b/gdb/stub-termcap.c 2019-06-03 23:32:57.637401253 +0000
+@@ -50,11 +50,13 @@
+ weak (later versions, e.g., 4.8, do support it). Given this stub
+ file originally was Windows only, and we only needed this when we
+ made it work on other hosts, it should be OK. */
++#if 0
+ #ifndef __MINGW32__
+ char PC __attribute__((weak));
+ char *BC __attribute__((weak));
+ char *UP __attribute__((weak));
+ #endif
++#endif
+
+ /* Each of the files below is a minimal implementation of the standard
+ termcap function with the same name, suitable for use in a Windows
diff --git a/patches/gmp-5.1.1.midipix.patch b/patches/gmp-5.1.1.midipix.patch
new file mode 100644
index 0000000..9fdaa7c
--- /dev/null
+++ b/patches/gmp-5.1.1.midipix.patch
@@ -0,0 +1,23 @@
+diff --git a/configfsf.sub b/configfsf.sub
+index 8df5511..e81d0e3 100644
+--- a/configfsf.sub
++++ b/configfsf.sub
+@@ -794,6 +794,9 @@ case $basic_machine in
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
++ midipix)
++ os=-midipix
++ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+@@ -1370,7 +1373,7 @@ case $os in
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+- | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
diff --git a/patches/gmp-5.1.3.midipix.patch b/patches/gmp-5.1.3.midipix.patch
new file mode 100644
index 0000000..ecee6b9
--- /dev/null
+++ b/patches/gmp-5.1.3.midipix.patch
@@ -0,0 +1,22 @@
+diff -ru a/configfsf.sub b/configfsf.sub
+--- a/configfsf.sub 2013-09-30 06:18:28.000000000 -0400
++++ b/configfsf.sub 2015-05-28 00:18:19.772345286 -0400
+@@ -794,6 +794,9 @@
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
++ midipix)
++ os=-midipix
++ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+@@ -1370,7 +1373,7 @@
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+- | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
diff --git a/patches/libelf-0.8.13.midipix.patch b/patches/libelf-0.8.13.midipix.patch
new file mode 100644
index 0000000..c2ac31f
--- /dev/null
+++ b/patches/libelf-0.8.13.midipix.patch
@@ -0,0 +1,39 @@
+diff -ru a/configure b/configure
+--- a/configure 2008-05-23 04:18:03.000000000 -0400
++++ b/configure 2015-03-10 20:32:16.332333640 -0400
+@@ -3445,6 +3445,16 @@
+ LINK_SHLIB='$(LD) -G -z text -h $(SONAME)'
+ INSTALL_SHLIB='$(INSTALL_PROGRAM)'
+ ;;
++ *midipix*)
++ PICFLAGS='-fPIC -DPIC'
++ SHLIB_SFX='.so.$(VERSION)'
++ SHLINK_SFX='.so'
++ SONAME_SFX='.so.$(MAJOR)'
++ LINK_SHLIB='$(CC) -shared -Wl,-soname,$(SONAME) -mout-dsolib -moutput-def'
++ IMPLIB_NAME=libelf.`echo "so.$VERSION" | sed -E 's/[^\.]+$/lib.a/'`
++ INSTALL_SHLIB='cp $(IMPLIB_NAME) $(libdir)/libelf.lib.a; $(INSTALL_PROGRAM)'
++ DEPSHLIBS=''
++ ;;
+ *)
+ echo "configure: warning: shared libraries not supported for $host" 1>&2
+ mr_enable_shared=no
+@@ -3687,6 +3697,7 @@
+ s%@INSTALL_SHLIB@%$INSTALL_SHLIB%g
+ s%@DEPSHLIBS@%$DEPSHLIBS%g
+ s%@DO_SHLIB@%$DO_SHLIB%g
++s%@IMPLIB_NAME@%$IMPLIB_NAME%g
+
+ CEOF
+ EOF
+diff -ru a/lib/Makefile.in b/lib/Makefile.in
+--- a/lib/Makefile.in 2009-11-01 08:04:19.000000000 -0500
++++ b/lib/Makefile.in 2015-03-09 00:13:06.842232837 -0400
+@@ -49,6 +49,7 @@
+ SHLINK_SFX = @SHLINK_SFX@
+ SONAME_SFX = @SONAME_SFX@
+ LINK_SHLIB = @LINK_SHLIB@
++IMPLIB_NAME = @IMPLIB_NAME@
+ INSTALL_SHLIB = @INSTALL_SHLIB@
+
+ SHLIB = libelf$(SHLIB_SFX)
diff --git a/patches/libffi-3.2.1.midipix.patch b/patches/libffi-3.2.1.midipix.patch
new file mode 100644
index 0000000..341f830
--- /dev/null
+++ b/patches/libffi-3.2.1.midipix.patch
@@ -0,0 +1,108 @@
+diff -ru --new-file a/configure b/configure
+--- a/configure 2014-11-12 06:59:57.000000000 -0500
++++ b/configure 2016-01-25 18:26:47.000000000 -0500
+@@ -17133,7 +17133,7 @@
+ i?86-*-freebsd* | i?86-*-openbsd*)
+ TARGET=X86_FREEBSD; TARGETDIR=x86
+ ;;
+- i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*)
++ i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix* | i?86-*-midipix*)
+ TARGET=X86_WIN32; TARGETDIR=x86
+ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+ # We must also check with_cross_host to decide if this is a native
+@@ -17161,7 +17161,7 @@
+ TARGET=X86_DARWIN; TARGETDIR=x86
+ ;;
+
+- x86_64-*-cygwin* | x86_64-*-mingw*)
++ x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-midipix*)
+ TARGET=X86_WIN64; TARGETDIR=x86
+ # All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+ # We must also check with_cross_host to decide if this is a native
+diff -ru --new-file a/src/closures.c b/src/closures.c
+--- a/src/closures.c 2014-11-08 07:47:24.000000000 -0500
++++ b/src/closures.c 2016-01-25 17:57:43.000000000 -0500
+@@ -26,6 +26,25 @@
+ DEALINGS IN THE SOFTWARE.
+ ----------------------------------------------------------------------- */
+
++#ifdef __midipix__
++
++#include <stdlib.h>
++
++void * ffi_closure_alloc (size_t size, void ** code)
++{
++ if (code)
++ return (*code = malloc(size));
++ else
++ return 0;
++}
++
++void ffi_closure_free (void * addr)
++{
++ free(addr);
++}
++
++#else
++
+ #if defined __linux__ && !defined _GNU_SOURCE
+ #define _GNU_SOURCE 1
+ #endif
+@@ -686,3 +705,4 @@
+
+ # endif /* ! FFI_MMAP_EXEC_WRIT */
+ #endif /* FFI_CLOSURES */
++#endif
+diff -ru --new-file a/src/x86/ffi.c b/src/x86/ffi.c
+--- a/src/x86/ffi.c 2014-11-08 07:47:24.000000000 -0500
++++ b/src/x86/ffi.c 2016-01-25 17:52:14.000000000 -0500
+@@ -31,8 +31,12 @@
+ #if !defined(__x86_64__) || defined(_WIN64) || defined(__CYGWIN__)
+
+ #ifdef _WIN64
++#ifdef __midipix__
++/* not needed */
++#else
+ #include <windows.h>
+ #endif
++#endif
+
+ #include <ffi.h>
+ #include <ffi_common.h>
+diff -ru --new-file a/src/x86/win32.S b/src/x86/win32.S
+--- a/src/x86/win32.S 2014-11-11 09:41:37.000000000 -0500
++++ b/src/x86/win32.S 2016-01-25 18:36:49.000000000 -0500
+@@ -1344,6 +1344,14 @@
+ .align 4
+ .LEFDE5:
+
++#ifdef __midipix__
++ .section .got$ffi_call_win32,"r"
++ .global __imp_ffi_call_win32
++__imp_ffi_call_win32:
++ .long ffi_call_win32
++ .linkonce discard
++#endif
++
+ #endif /* !_MSC_VER */
+
+ #if defined __ELF__ && defined __linux__
+diff -ru --new-file a/src/x86/win64.S b/src/x86/win64.S
+--- a/src/x86/win64.S 2014-11-08 07:47:24.000000000 -0500
++++ b/src/x86/win64.S 2016-01-25 17:47:17.000000000 -0500
+@@ -516,5 +516,15 @@
+ pop %rbp
+ retq
+ .seh_endproc
++
++
++#ifdef __midipix__
++ .section .got$ffi_call_win64,"r"
++ .global __imp_ffi_call_win64
++__imp_ffi_call_win64:
++ .quad ffi_call_win64
++ .linkonce discard
++#endif
++
+ #endif /* !_MSC_VER */
+