diff -ru --new-file a/bfd/midipix.h b/bfd/midipix.h --- a/bfd/midipix.h 1969-12-31 19:00:00.000000000 -0500 +++ b/bfd/midipix.h 2015-03-11 17:23:18.492453732 -0400 @@ -0,0 +1,10 @@ +#ifndef MIDIPIX_H +#define MIDIPIX_H + +#define PE_TARGET_MIDIPIX + +#define PE_DSO_SUFFIX ".so" +#define PE_DSOLIB_SUFFIX ".dso.a" +#define PE_IMPLIB_SUFFIX ".lib.a" + +#endif --- 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,23 @@ $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_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 + +/* midipix supersystem support */ +#include "midipix.h" +EOF +esac 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 2015-03-11 18:17:10.092557143 -0400 @@ -35,6 +35,18 @@ only determine if the subsystem is console or windows in order to select the correct entry point by default. */ + +#include "peimplib.h" + +#ifndef PE_IMPLIB_SUFFIX +#define PE_IMPLIB_SUFFIX ".dll.a" +#endif + +#ifndef PE_DSO_SUFFIX +#define PE_DSO_SUFFIX ".dll" +#endif + + #define TARGET_IS_${EMULATION_NAME} /* Do this before including bfd.h, so we prototype the right functions. */ @@ -471,8 +483,8 @@ 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= When linking dynamically to a dll without\n\ - an importlib, use .dll\n\ - in preference to lib.dll \n")); + an importlib, use "PE_DSO_SUFFIX"\n\ + in preference to lib"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")); @@ -1698,7 +1710,7 @@ 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 +1745,7 @@ 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; @@ -2298,10 +2310,14 @@ } libname_fmt [] = { + /* optionally support ldso-specific import libraries */ + #ifdef PE_DSOLIB_SUFFIX + { "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 }, /* "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. */ @@ -2310,10 +2326,10 @@ { "%s.lib", FALSE }, #ifdef DLL_SUPPORT /* Try "foo.dll" (preferred dll name, if specified). */ - { "%s%s.dll", TRUE }, + { "%s%s"PE_DSO_SUFFIX, TRUE }, #endif /* Try "libfoo.dll" (default preferred dll name). */ - { "lib%s.dll", FALSE }, + { "lib%s"PE_DSO_SUFFIX, FALSE }, /* Finally try 'native' dll name "foo.dll". */ { "%s.dll", FALSE }, /* Note: If adding more formats to this table, make sure to check to 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 2015-03-11 18:17:10.096557143 -0400 @@ -42,6 +42,18 @@ /* For WINDOWS_XP64 and higher */ /* Based on pe.em, but modified for 64 bit support. */ + +#include "peimplib.h" + +#ifndef PE_IMPLIB_SUFFIX +#define PE_IMPLIB_SUFFIX ".dll.a" +#endif + +#ifndef PE_DSO_SUFFIX +#define PE_DSO_SUFFIX ".dll" +#endif + + #define TARGET_IS_${EMULATION_NAME} #define COFF_IMAGE_WITH_PE @@ -434,8 +446,8 @@ unless user specifies one\n")); fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n")); fprintf (file, _(" --dll-search-prefix= When linking dynamically to a dll without\n\ - an importlib, use .dll\n\ - in preference to lib.dll \n")); + an importlib, use "PE_DSO_SUFFIX"\n\ + in preference to lib"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")); @@ -1635,7 +1647,7 @@ 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 +1682,7 @@ 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; @@ -2062,10 +2074,14 @@ } libname_fmt [] = { + /* optionally support ldso-specific import libraries */ + #ifdef PE_DSOLIB_SUFFIX + { "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 }, /* "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. */ @@ -2074,10 +2090,10 @@ { "%s.lib", FALSE }, #ifdef DLL_SUPPORT /* Try "foo.dll" (preferred dll name, if specified). */ - { "%s%s.dll", TRUE }, + { "%s%s"PE_DSO_SUFFIX, TRUE }, #endif /* Try "libfoo.dll" (default preferred dll name). */ - { "lib%s.dll", FALSE }, + { "lib%s"PE_DSO_SUFFIX, FALSE }, /* Finally try 'native' dll name "foo.dll". */ { "%s.dll", FALSE }, /* Note: If adding more formats to this table, make sure to check to 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 2015-03-11 20:09:20.564772519 -0400 @@ -319,6 +319,11 @@ 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_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 +333,13 @@ 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_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 ;; 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 2015-03-11 20:09:38.972773108 -0400 @@ -54,6 +54,9 @@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = ld-new$(EXEEXT) +PE_EXECUTABLE_NAME = @pe_executable_name@ +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 +833,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_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 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 --new-file 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 2015-02-28 09:36:05.942808235 -0500 @@ -40,6 +40,7 @@ #include "coff/internal.h" #include "../bfd/libcoff.h" #include "deffile.h" +#include "peimplib.h" #ifdef pe_use_x86_64 @@ -234,7 +235,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 } }; 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-02-14 20:13:02.552189518 -0500 @@ -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" diff -ru --new-file a/config.sub b/config.sub --- a/config.sub 2014-07-03 01:37:23.000000000 -0400 +++ b/config.sub 2015-02-14 11:27:08.083179771 -0500 @@ -1370,7 +1370,7 @@ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* | -midipix* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ 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 ;;