summarylogtreecommitdiffstats
path: root/binutils-djgpp.patch
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-djgpp.patch')
-rw-r--r--binutils-djgpp.patch1329
1 files changed, 1329 insertions, 0 deletions
diff --git a/binutils-djgpp.patch b/binutils-djgpp.patch
new file mode 100644
index 000000000000..8c2ec1c39dea
--- /dev/null
+++ b/binutils-djgpp.patch
@@ -0,0 +1,1329 @@
+# DJGPP specific changes to binutils for the DJGPP port of binutils
+# excluding the changes specific to libbfd and libiberty.
+
+
+2017-09-30 Juan Manuel Guerrero <juan.guerrero@gmx.de>
+
+ * binutils/addr2line.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/ar.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/coffdump.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/config.in [__DJGPP__]: Added DJGPP specific macros definitions.
+ They are all NO-OPS for other OSes.
+
+ * binutils/cxxfilt.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/nlmconv.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/nm.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/objcopy.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/objdump.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/readelf.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+ (print_symbol) [__DJGPP__]: Use mbtowc instead of mbrtowc.
+
+ * binutils/size.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/srconv.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/strings.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * binutils/sysdump.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * config.sub: Use uname result to set basic_machine value instead of
+ hardcoded one.
+
+ * djgpp/build.sh: DJGPP specific shell script to adjust, configure and
+ compile progs and libs. To support the build of a binutils version used
+ by a cross-compiler, the sed scripts that modified bfd/Makefile.in and
+ config.in files have been removed. This change is now part of the patch.
+
+ * gas/as.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+
+ * gas/config/obj-coff-seh.c (get_pxdata_name): Pacify compiler.
+
+ * gas/config.in [__DJGPP__]: Added DJGPP specific macros definitions.
+ They are all NO-OPS for other OSes.
+
+ * gas/dw2gencfi.c (get_debugseg_name): Pacify compiler.
+
+ * gold/config.in [__DJGPP__]: Added DJGPP specific macros definitions.
+ They are all NO-OPS for other OSes.
+
+ * gprof/gconfig.in [__DJGPP__]: Added DJGPP specific macros definitions.
+ They are all NO-OPS for other OSes.
+
+ * gprof/gprof.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+ (main) [COFF_GO32_EXE, COFF_GO32]: Call bfd_init to check to enable/disable
+ the coff 64k relocation support.
+
+ * ld/config.in [__DJGPP__]: Added DJGPP specific macros definitions.
+ They are all NO-OPS for other OSes.
+ [__DJGPP__]: For DJGPP versions greather than 2.03 enable support to
+ resolve multiple symbol definitions due to the use of DXE3 modules by
+ defining the HAVE_DXE3_SUPPORT macro.
+
+ * ld/configure: Set HAVE_DXE3_SUPPORT to 1 if using DJGPP as taget OS.
+
+ * ld/ldfile.c [__DJGPP__]: New function map_LFN_to_SFN.
+ Maps a library long filename to a short filename according to a table
+ defined in /dev/env/DJDIR/lib/libnames.tab.
+ (ldfile_try_open_bfd) [__DJGPP__]: If library is not found by its
+ original name try the mapped SFN one.
+
+ * ld/ldmain.c (main): Use STRIP_FULL_PATH_AND_EXTENSION to adjust file name.
+ (multiple_definition) [HAVE_DXE3_SUPPORT]: If the linker is compiled
+ for DX3 module support, it will be able to resolve multiple symbol definitions.
+ This is usually the case when different DXE3 import libraries provide the same
+ wrapper function to call certain function from the DXE3 module. If the symbol
+ is defined in a static library and in an import library, the import library
+ definition takes always precedence over the static library. This is to
+ guarantee that all aplications linked with the same DXE3 module use the same
+ functionality and not the one from the static library. The DXE3 module
+ provides functions ported to DJGPP, the functions from the static library
+ may not be ported to DJGPP and may behave differently.
+ (multiple_definition) [HAVE_DXE3_SUPPORT]: Allow also the older file name
+ $$dxe$$.o as identifier of import libraries generated by dxe3gen.exe.
+
+ * ld/libnames.tab: New file providing the mapping table between the
+ library's LFN to SFN. LFN to SFN mapping for PCRE2 libraries added.
+
+ * ld/scripttempl/i386go32.sc: DJGPP specific adjustments to the linker
+ script. Taken from djcross-binutils-2.19.1-10ap.src.rpm.
+ Added discard .gnu.lto_* sections command to linker script.
+ Fixed w/out relocation (-r) and w/out relocation and do ctor (-Ur) linker
+ scripts.
+
+ * opcodes/config.in [__DJGPP__]: Added DJGPP specific macros definitions.
+ They are all NO-OPS for other OSes.
+
+
+
+
+
+
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/ar.c binutils-2.29.1/binutils/ar.c
+--- binutils-2.29.1.orig/binutils/ar.c 2017-07-17 09:52:56 +0000
++++ binutils-2.29.1/binutils/ar.c 2017-09-30 22:49:40 +0000
+@@ -687,11 +687,11 @@ main (int argc, char **argv)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = argv[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+ #if BFD_SUPPORTS_PLUGINS
+ bfd_plugin_set_program_name (program_name);
+ #endif
+diff -aprNU5 binutils-2.29.1.orig/binutils/coffdump.c binutils-2.29.1/binutils/coffdump.c
+--- binutils-2.29.1.orig/binutils/coffdump.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/coffdump.c 2017-09-30 22:49:40 +0000
+@@ -497,11 +497,11 @@ main (int ac, char **av)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = av[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(av[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&ac, &av);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/config.in binutils-2.29.1/binutils/config.in
+--- binutils-2.29.1.orig/binutils/config.in 2017-09-15 11:37:46 +0000
++++ binutils-2.29.1/binutils/config.in 2017-09-30 22:49:40 +0000
+@@ -283,5 +283,39 @@
+ this defined. */
+ #undef _POSIX_1_SOURCE
+
+ /* Define to 1 if you need to in order for `stat' and other things to work. */
+ #undef _POSIX_SOURCE
++#ifdef __DJGPP__
++# if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
++# define __gnuc_extension__ __extension__
++# else
++# define __gnuc_extension__
++# endif
++
++# undef IS_SLASH
++# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
++# undef IS_DIRECTORY_SEPARATOR
++# define IS_DIRECTORY_SEPARATOR(c) (IS_SLASH(c) || (c) == ':')
++
++# include <libc/unconst.h>
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) \
++ (__gnuc_extension__ \
++ ({ \
++ char *_dst, *_src; \
++ _dst = _src = unconst((file_name), char *); \
++ while (*_src++) \
++ ; \
++ while ((_src - _dst) && (*--_src != '.')) \
++ ; \
++ for (*_src = '\0'; (_src - _dst); _src--) \
++ if (IS_DIRECTORY_SEPARATOR(*_src)) \
++ break; \
++ if (_src - _dst) \
++ while ((*_dst++ = *++_src)) \
++ ; \
++ (file_name); \
++ }) \
++ )
++#else
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) (file_name)
++#endif
+diff -aprNU5 binutils-2.29.1.orig/binutils/cxxfilt.c binutils-2.29.1/binutils/cxxfilt.c
+--- binutils-2.29.1.orig/binutils/cxxfilt.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/cxxfilt.c 2017-09-30 22:49:40 +0000
+@@ -172,11 +172,11 @@ main (int argc, char **argv)
+ {
+ int c;
+ const char *valid_symbols;
+ enum demangling_styles style = auto_demangling;
+
+- program_name = argv[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&argc, &argv);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/nlmconv.c binutils-2.29.1/binutils/nlmconv.c
+--- binutils-2.29.1.orig/binutils/nlmconv.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/nlmconv.c 2017-09-30 22:49:40 +0000
+@@ -207,11 +207,11 @@ main (int argc, char **argv)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = argv[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&argc, &argv);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/nm.c binutils-2.29.1/binutils/nm.c
+--- binutils-2.29.1.orig/binutils/nm.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/nm.c 2017-09-30 22:49:40 +0000
+@@ -1636,11 +1636,11 @@ main (int argc, char **argv)
+ setlocale (LC_COLLATE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = *argv;
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+ #if BFD_SUPPORTS_PLUGINS
+ bfd_plugin_set_program_name (program_name);
+ #endif
+diff -aprNU5 binutils-2.29.1.orig/binutils/objcopy.c binutils-2.29.1/binutils/objcopy.c
+--- binutils-2.29.1.orig/binutils/objcopy.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/objcopy.c 2017-09-30 22:49:40 +0000
+@@ -5353,11 +5353,11 @@ main (int argc, char *argv[])
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = argv[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+
+ START_PROGRESS (program_name, 0);
+
+ expandargv (&argc, &argv);
+diff -aprNU5 binutils-2.29.1.orig/binutils/objdump.c binutils-2.29.1/binutils/objdump.c
+--- binutils-2.29.1.orig/binutils/objdump.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/objdump.c 2017-09-30 22:49:40 +0000
+@@ -3741,11 +3741,11 @@ main (int argc, char **argv)
+ #endif
+
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = *argv;
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ START_PROGRESS (program_name, 0);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/readelf.c binutils-2.29.1/binutils/readelf.c
+--- binutils-2.29.1.orig/binutils/readelf.c 2017-09-05 14:03:14 +0000
++++ binutils-2.29.1/binutils/readelf.c 2017-09-30 22:49:40 +0000
+@@ -537,11 +537,16 @@ print_symbol (signed int width, const ch
+
+ #ifdef HAVE_MBSTATE_T
+ /* Try to find out how many bytes made up the character that was
+ just printed. Advance the symbol pointer past the bytes that
+ were displayed. */
++#ifdef __DJGPP__
++ /* DJGPP does not provide mbrtowc. */
++ n = mbtowc (& w, symbol - 1, MB_CUR_MAX);
++#else
+ n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
++#endif
+ #else
+ n = 1;
+ #endif
+ if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
+ symbol += (n - 1);
+diff -aprNU5 binutils-2.29.1.orig/binutils/size.c binutils-2.29.1/binutils/size.c
+--- binutils-2.29.1.orig/binutils/size.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/size.c 2017-09-30 22:49:42 +0000
+@@ -129,11 +129,11 @@ main (int argc, char **argv)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = *argv;
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&argc, &argv);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/srconv.c binutils-2.29.1/binutils/srconv.c
+--- binutils-2.29.1.orig/binutils/srconv.c 2017-07-12 08:57:48 +0000
++++ binutils-2.29.1/binutils/srconv.c 2017-09-30 22:49:42 +0000
+@@ -1731,11 +1731,11 @@ main (int ac, char **av)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = av[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(av[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&ac, &av);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/strings.c binutils-2.29.1/binutils/strings.c
+--- binutils-2.29.1.orig/binutils/strings.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/strings.c 2017-09-30 22:49:42 +0000
+@@ -153,11 +153,11 @@ main (int argc, char **argv)
+ setlocale (LC_ALL, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = argv[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&argc, &argv);
+
+diff -aprNU5 binutils-2.29.1.orig/binutils/sysdump.c binutils-2.29.1/binutils/sysdump.c
+--- binutils-2.29.1.orig/binutils/sysdump.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/binutils/sysdump.c 2017-09-30 22:49:42 +0000
+@@ -668,11 +668,11 @@ main (int ac, char **av)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = av[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(av[0]);
+ xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
+
+ expandargv (&ac, &av);
+
+diff -aprNU5 binutils-2.29.1.orig/config.sub binutils-2.29.1/config.sub
+--- binutils-2.29.1.orig/config.sub 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/config.sub 2017-09-30 22:49:42 +0000
+@@ -634,11 +634,19 @@ case $basic_machine in
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+- basic_machine=i586-pc
++ UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
++ case $UNAME_MACHINE in
++ *386*) basic_machine=i386-pc;;
++ *486*) basic_machine=i486-pc;;
++ *586*) basic_machine=i586-pc;;
++ *686*) basic_machine=i686-pc;;
++ *786*) basic_machine=i786-pc;;
++ *) basic_machine=i586-pc;;
++ esac
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+diff -aprNU5 binutils-2.29.1.orig/djgpp/build.sh binutils-2.29.1/djgpp/build.sh
+--- binutils-2.29.1.orig/djgpp/build.sh 1970-01-01 00:00:00 +0000
++++ binutils-2.29.1/djgpp/build.sh 2017-09-30 22:49:42 +0000
+@@ -0,0 +1,318 @@
++# This script only works in the ./djgpp directory.
++
++export HOME=.
++export PATH_SEPARATOR=:
++export PATH_EXPAND=y
++export TEST_FINDS_EXE=y
++export LD=ld
++export NM=nm
++export LN_S="cp -p"
++export GMSGFMT=${GMSGFMT='/dev/env/DJDIR/bin/msgfmt'}
++export MSGFMT=${MSGFMT='/dev/env/DJDIR/bin/msgfmt'}
++export MSGMERGE=${MSGMERGE='/dev/env/DJDIR/bin/msgmerge'}
++export XGETTEXT=${XGETTEXT='/dev/env/DJDIR/bin/xgettext'}
++export ac_cv_path_AWK=${AWK='/dev/env/DJDIR/bin/gawk'}
++export ac_cv_path_EMACS=${EMACS='/dev/env/DJDIR/gnu/emacs/bin/emacs'}
++export ac_cv_path_M4=${M4='/dev/env/DJDIR/bin/m4'}
++export ac_cv_path_GREP=${GREP='/dev/env/DJDIR/bin/grep'}
++export ac_cv_path_EGREP=${EGREP='/dev/env/DJDIR/bin/egrep'}
++export ac_cv_path_FGREP=${FGREP='/dev/env/DJDIR/bin/fgrep'}
++export ac_cv_path_SED=${SED='/dev/env/DJDIR/bin/sed'}
++export ac_cv_path_MAKEINFO=${MAKEINFO='/dev/env/DJDIR/bin/makeinfo'}
++export ac_cv_path_INSTALL_INFO=${INSTALL_INFO='/dev/env/DJDIR/bin/install-info'}
++export ac_cv_path_ROFF=${ROFF='/dev/env/DJDIR/bin/groff'}
++export ac_cv_path_GROFF=${GROFF='/dev/env/DJDIR/bin/groff'}
++export ac_cv_path_NROFF=${NROFF='/dev/env/DJDIR/bin/nroff'}
++export ac_cv_path_PERL=${PERL='/dev/env/DJDIR/bin/perl'}
++export ac_cv_path_mkdir=${MKDIR_P='/dev/env/DJDIR/bin/mkdir -p'}
++export ac_cv_path_RM=${RM='/dev/env/DJDIR/bin/rm'}
++export ac_cv_path_MV=${MV='/dev/env/DJDIR/bin/mv'}
++export ac_cv_path_TAR=${TAR='/dev/env/DJDIR/bin/tar'}
++export ac_cv_path_PR_PROGRAM=${PR='/dev/env/DJDIR/bin/pr'}
++export ac_cv_path_ed_PROGRAM=${ED='/dev/env/DJDIR/bin/ed'}
++export ac_cv_path_TEXI2DVI=${TEXI2DVI='texi2dvi'}
++export ac_cv_path_TEXI2PDF=${TEXI2PDF='texi2pdf'}
++export ac_cv_path_DVIPS=${DVIPS='dvips'}
++export ac_cv_path_PS2PDF=${PS2PDF='ps2pdf'}
++export ac_cv_path_TEST_SHELL=${TEST_SHELL='/dev/env/DJDIR/bin/bash'}
++export ac_cv_path_MKTEMP=${MKTEMP='/dev/env/DJDIR/bin/mktemp'}
++export ac_cv_prog_LN_S="cp -p"
++export ac_cv_prog_AWK=${AWK='/dev/env/DJDIR/bin/gawk'}
++export ac_cv_prog_EMACS=${EMACS='/dev/env/DJDIR/gnu/emacs/bin/emacs'}
++export ac_cv_prog_M4=${M4='/dev/env/DJDIR/bin/m4'}
++export ac_cv_prog_GREP=${GREP='/dev/env/DJDIR/bin/grep'}
++export ac_cv_prog_EGREP=${EGREP='/dev/env/DJDIR/bin/egrep'}
++export ac_cv_prog_FGREP=${FGREP='/dev/env/DJDIR/bin/fgrep'}
++export ac_cv_prog_SED=${SED='/dev/env/DJDIR/bin/sed'}
++export ac_cv_prog_MAKEINFO=${MAKEINFO='/dev/env/DJDIR/bin/makeinfo'}
++export ac_cv_prog_INSTALL_INFO=${INSTALL_INFO='/dev/env/DJDIR/bin/install-info'}
++export ac_cv_prog_ROFF=${ROFF='/dev/env/DJDIR/bin/groff'}
++export ac_cv_prog_GROFF=${GROFF='/dev/env/DJDIR/bin/groff'}
++export ac_cv_prog_NROFF=${NROFF='/dev/env/DJDIR/bin/nroff'}
++export ac_cv_prog_PERL=${PERL='/dev/env/DJDIR/bin/perl'}
++export ac_cv_prog_mkdir=${MKDIR_P='/dev/env/DJDIR/bin/mkdir -p'}
++export ac_cv_prog_RM=${RM='/dev/env/DJDIR/bin/rm'}
++export ac_cv_prog_MV=${MV='/dev/env/DJDIR/bin/mv'}
++export ac_cv_prog_SORT=${SORT='/dev/env/DJDIR/bin/sort'}
++export ac_cv_prog_TAR=${TAR='/dev/env/DJDIR/bin/tar'}
++export ac_cv_prog_PR_PROGRAM=${PR='/dev/env/DJDIR/bin/pr'}
++export ac_cv_prog_ed_PROGRAM=${ED='/dev/env/DJDIR/bin/ed'}
++export ac_cv_prog_TEXI2DVI=${TEXI2DVI='texi2dvi'}
++export ac_cv_prog_TEXI2PDF=${TEXI2PDF='texi2pdf'}
++export ac_cv_prog_DVIPS=${DVIPS='dvips'}
++export ac_cv_prog_PS2PDF=${PS2PDF='ps2pdf'}
++export ac_cv_prog_TEST_SHELL=${TEST_SHELL='/dev/env/DJDIR/bin/bash'}
++export ac_cv_prog_MKTEMP=${MKTEMP='/dev/env/DJDIR/bin/mktemp'}
++export ac_cv_func_fork=no
++export ac_cv_func_mkfifo=no
++export ac_cv_func_mknod=no
++export ac_cv_func_mmap=no
++export ac_cv_func_vfork=no
++
++# Do not allow that the BFD's configure script determine the
++# host dependant file_ptr a.k.a. off_t type as BFD_HOST_64_BIT.
++# This is the case if ftello64 and fseeko64 are found. But DJGPP
++# does not provide the full set of 64 bit file functions required
++# for a working 64 bit BFD.
++export ac_cv_func_fseeko64=${ac_cv_func_fseeko64=no}
++export ac_cv_func_ftello64=${ac_cv_func_ftello64=no}
++export ac_cv_have_decl_fseeko64=${ac_cv_have_decl_fseeko64=no}
++export ac_cv_have_decl_ftello64=${ac_cv_have_decl_ftello64=no}
++
++# Ensure that always old GNU extern inline semantics is used
++# (aka -fgnu89-inline) even if ISO C99 semantics has been specified.
++case $(gcc --version 2>/dev/null | sed "/^.* \([1-9]\+\.[0-9]\+[.0-9]*\).*$/!d;s/^.* \([1-9]\+\.[0-9]\+[.0-9]*\).*$/\1/") in
++[1-3].*|4.[0-1][.0-9]* ) export CFLAGS=${CFLAGS='-g2 -O2 -march=i386 -mtune=i586'};;
++* ) export CFLAGS=${CFLAGS='-g2 -O2 -fgnu89-inline -march=i386 -mtune=i586'};;
++esac
++
++# DJGPP's implementation of printf survives out-of-memory conditions.
++export gl_cv_func_printf_enomem='yes'
++
++# Enable libiberty installation.
++# Passing --enable-install-libiberty to the toplovel configure seems not to be enough.
++export enable_install_libiberty=yes
++
++# Select NLS support.
++# NLS_SUPPORT='--enable-nls'
++ NLS_SUPPORT='--disable-nls'
++
++if [ "x${NLS_SUPPORT}" = "x--enable-nls" ]; then
++ rm -vf ../bfd/po/*gmo
++ rm -vf ../bfd/po/*pot
++ rm -vf ../binutils/po/*gmo
++ rm -vf ../binutils/po/*pot
++ rm -vf ../gas/po/*gmo
++ rm -vf ../gas/po/*pot
++ rm -vf ../gold/po/*gmo
++ rm -vf ../gold/po/*pot
++ rm -vf ../gprof/po/*gmo
++ rm -vf ../gprof/po/*pot
++ rm -vf ../ld/po/*gmo
++ rm -vf ../ld/po/*pot
++ rm -vf ../opcodes/po/*gmo
++ rm -vf ../opcodes/po/*pot
++ rm -vf ../bfd/po/*gmo
++ rm -vf ../bfd/po/*pot
++fi
++
++
++#
++# 1: Adjust the configure scripts.
++#
++
++cat > script.sed << EOF
++# For some reason the function does not work with bash 2.05b.
++/^func_lalib_p/,/^}$/ {
++ /test/ i\\
++ case \$1 in\\
++ *.la | *.lo)
++ /GREP/ {
++ s/$/;;/
++ a\\
++ *) false;;\\
++ esac
++ }
++}
++
++# Use func_lalib_p instead of func_lalib_unsafe_p.
++/func_lalib_unsafe_p[ ][^(]/ s/_unsafe//
++
++# Adjust temp directory.
++/{TMPDIR-\/tmp}/ s|{TMPDIR-/tmp}|{TMPDIR-\${TMP-\${TEMP-.}}}|
++
++# Remove -lc reference from the dependency_libs= line in .la files.
++# This is unnecessary when linking with static labraries and causes
++# multiple symbol definitions that cannot be resolved when using DXE3 modules.
++/^# Libraries that this one depends upon.$/,/^# Directory that this library needs to be installed in:$/ {
++ /^# Directory that this library needs to be installed in:$/ {
++ n
++ a\\
++ sed "/^dependency_libs=/ s|[ ]\\\\{1,\\\\}-lc| |" \$output > fixed.sed && cp -vf fixed.sed \$output
++ }
++}
++
++# The CR test for awk does not work for DJGPP.
++/^ac_cs_awk_cr=/,/^$/ {
++ /^fi$/ a\\
++ac_cs_awk_cr=\$ac_cr
++}
++
++# AWK program above erroneously prepends '/' to C:/dos/paths
++/# AWK program above erroneously prepends/,/esac/ {
++ s/mingw/*djgpp* | mingw/
++}
++
++# Force the test for 'ln -s' to report 'cp -pf'.
++/as_ln_s='ln -s'/ s/ln -s/cp -pf/
++
++# Set the right shell for libtool
++/^LIBTOOL=.*libtool'$/ s/".*"/'\$(SHELL) '/
++
++# Adjust the config.site path for the case
++# of recursive called configure scripts
++/^if test "\$no_recursion" != yes; then/ a\\
++ djgpp_config_site=\$CONFIG_SITE
++/case \$srcdir in/,/esac/ {
++ / # Relative name.$/ a\\
++export CONFIG_SITE=\$ac_top_build_prefix\$djgpp_config_site
++}
++
++# DJGPP specific adjustments of the compile-time system search path for libraries.
++/^[ ]*lt_search_path_spec=.*-print-search-dirs/ s,\`\$, -e \\"s%[A-z]:[\\\\\\\\/]djgpp-[0-9].[0-9][0-9][\\\\\\\\/]%/dev/env/DJDIR/%g\\"&,
++
++# Fix realpath check. DJGPP always prepends a drive letter.
++/checking whether realpath works/,/^_ACEOF$/ {
++ /name && \*name == '\/'/ s/\*name/name[2]/
++}
++
++# Supress makeinfo test. DJGPP does not provide any other port than 4.13.
++/# For an installed makeinfo, we require it to be from texinfo 4.7 or/,/;;/ {
++ /MAKEINFO.*makeinfo/ s/MAKEINFO/IGNORE_&/
++}
++EOF
++
++
++for file in ../ltmain.sh ../configure ../bfd/configure ../binutils/configure ../gas/configure ../gprof/configure ../ld/configure ../opcodes/configure; do
++ if test ! -f ${file}.orig; then
++ cp -vf ${file} ${file}.orig
++ touch ${file}.orig -r ${file}
++ fi
++ sed -f ./script.sed ${file}.orig > ./file.out
++ update ./file.out ${file}
++ touch ${file} -r ${file}.orig
++done
++rm -vf ./file.out ./script.sed
++
++
++
++#
++# 2: Adjust the Makefile.ins and other files.
++#
++
++cat > script.sed << EOF
++# For html docs.
++/^MAKEINFOHTML[ ]*=/ s/$/ --no-split/
++s/--split-size=5000000/--no-split/g
++
++# Fixes for ./libiberty/Makefile.in
++# ps support for libiberty docs.
++/dvi-subdir[ ]\\{1,\\}pdf-subdir/ s/dvi-subdir[ ]\\{1,\\}pdf-subdir/& ps-subdir/
++
++/^LIBIBERTY_PDFFILES[ ]*=/ i\\
++LIBIBERTY_PSFILES = libiberty.ps\\
++\\
++ps: \\\$(LIBIBERTY_PSFILES) ps-subdir\\
++
++
++/^libiberty.pdf[ ]*:/ i\\
++libiberty.ps : ./libiberty.dvi \\\$(srcdir)/libiberty.texi \\\$(TEXISRC)\\
++ dvips -o ./libiberty.ps ./libiberty.dvi\\
++
++# Enable libiberty installation.
++# Passing --enable-install-libiberty to the toplovel configure seems not to be enough.
++s/@target_header_dir@/libiberty/
++
++# Fixes for ./etc/Makefile.in.
++/^HTMLFILES =.*configure.html$/ i\\
++PSFILES = standards.ps configure.ps
++/epstopdf/ s/[ ]\\{1,\\}-outfile/ --outfile/
++
++# Fixes for ./ld/Makefile.in.
++/^install-exec-local[ ]*:.*ld-new.*$/ {
++ s/$/ install-data-local-djgpp/
++i\\
++install-data-local-djgpp:\\
++ \\\$(mkinstalldirs) \\\$(DESTDIR)\\\$(scriptdir)\\
++ for f in libnames.tab; do \\\\\\
++ \\\$(INSTALL_DATA) \\\$(top_srcdir)/\\\$\\\$f \\\$(DESTDIR)\\\$(scriptdir)/\\\$\\\$f ; \\\\\\
++ done\\
++
++}
++EOF
++
++
++for file in ./../bfd/Makefile.in ./../bfd/doc/Makefile.in ./../binutils/doc/Makefile.in ./../etc/Makefile.in ./../gas/doc/Makefile.in ./../gprof/Makefile.in ./../ld/Makefile.in ./../libiberty/Makefile.in; do
++ if test ! -f ${file}.orig; then
++ cp -vf ${file} ${file}.orig
++ touch ${file}.orig -r ${file}
++ fi
++ sed -f ./script.sed ${file}.orig > ./file.out
++ update ./file.out ${file}
++ touch ${file} -r ${file}.orig
++done
++rm -vf ./file.out ./script.sed
++
++dtou ../ld/configure.ac
++touch ../ld/configure.ac -r ../ld/configure.tgt
++
++
++
++#
++# 3: Configure and build the libs and programs.
++#
++
++touch start_build.txt
++
++echo
++echo Configuring the progs and libs.
++echo See build_log.txt file for output.
++
++
++echo Using: > build_log.txt
++gcc --version >> build_log.txt
++as --version >> build_log.txt
++echo >> build_log.txt
++ld --version >> build_log.txt
++echo >> build_log.txt
++echo >> build_log.txt
++echo >> build_log.txt
++
++echo Configuring the progs and libs for DJGPP. >> build_log.txt
++echo >> build_log.txt
++
++../configure --disable-dependency-tracking ${NLS_SUPPORT} \
++ --with-mpc='/dev/env/DJDIR' --with-mpfr='/dev/env/DJDIR' --with-gmp='/dev/env/DJDIR' \
++ --enable-install-bfd --enable-install-libiberty \
++ --enable-build-warnings=-Wimplicit,-Wcomment,-Wformat,-Wparentheses,-Wpointer-arith >> build_log.txt 2>&1
++
++echo >> build_log.txt
++echo ################################################################################ >> build_log.txt
++echo >> build_log.txt
++
++
++# Remove target alias from tooldir and scriptdir paths so
++# that the linker scripts and binaries are installed in
++# their DJGPP specific canonical places.
++sed "/^.*tooldir = /s|/.*$||" ./Makefile > file.out
++mv -vf ./file.out ./Makefile
++
++
++echo
++echo Building the progs and libs.
++echo See build_log.txt file for output.
++echo Building the progs and libs for DJGPP. >> build_log.txt
++echo >> build_log.txt
++make >> build_log.txt 2>&1
++
++touch stop_build.txt
+diff -aprNU5 binutils-2.29.1.orig/gas/as.c binutils-2.29.1/gas/as.c
+--- binutils-2.29.1.orig/gas/as.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/gas/as.c 2017-09-30 22:49:42 +0000
+@@ -1205,11 +1205,11 @@ main (int argc, char ** argv)
+
+ #ifdef HOST_SPECIAL_INIT
+ HOST_SPECIAL_INIT (argc, argv);
+ #endif
+
+- myname = argv[0];
++ myname = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (myname);
+
+ expandargv (&argc, &argv);
+
+ START_PROGRESS (myname, 0);
+diff -aprNU5 binutils-2.29.1.orig/gas/config/obj-coff-seh.c binutils-2.29.1/gas/config/obj-coff-seh.c
+--- binutils-2.29.1.orig/gas/config/obj-coff-seh.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/gas/config/obj-coff-seh.c 2017-09-30 22:49:42 +0000
+@@ -62,11 +62,11 @@ get_pxdata_name (segT seg, const char *b
+ else if (dot < dollar)
+ name = dot;
+ else
+ name = dollar;
+
+- sname = concat (base_name, name, NULL);
++ sname = concat (base_name, name, (char *)NULL);
+
+ return sname;
+ }
+
+ /* Allocate a seh_seg_list structure. */
+diff -aprNU5 binutils-2.29.1.orig/gas/config.in binutils-2.29.1/gas/config.in
+--- binutils-2.29.1.orig/gas/config.in 2017-09-15 11:37:28 +0000
++++ binutils-2.29.1/gas/config.in 2017-09-30 22:49:42 +0000
+@@ -396,5 +396,42 @@
+ /* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+ #ifndef __cplusplus
+ #undef inline
+ #endif
++
++#ifdef __DJGPP__
++# include <sys/version.h>
++
++# if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
++# define __gnuc_extension__ __extension__
++# else
++# define __gnuc_extension__
++# endif
++
++# undef IS_SLASH
++# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
++# undef IS_DIRECTORY_SEPARATOR
++# define IS_DIRECTORY_SEPARATOR(c) (IS_SLASH(c) || (c) == ':')
++
++# include <libc/unconst.h>
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) \
++ (__gnuc_extension__ \
++ ({ \
++ char *_dst, *_src; \
++ _dst = _src = unconst((file_name), char *); \
++ while (*_src++) \
++ ; \
++ while ((_src - _dst) && (*--_src != '.')) \
++ ; \
++ for (*_src = '\0'; (_src - _dst); _src--) \
++ if (IS_DIRECTORY_SEPARATOR(*_src)) \
++ break; \
++ if (_src - _dst) \
++ while ((*_dst++ = *++_src)) \
++ ; \
++ (file_name); \
++ }) \
++ )
++#else
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) (file_name)
++#endif
+diff -aprNU5 binutils-2.29.1.orig/gas/dw2gencfi.c binutils-2.29.1/gas/dw2gencfi.c
+--- binutils-2.29.1.orig/gas/dw2gencfi.c 2017-07-10 09:54:40 +0000
++++ binutils-2.29.1/gas/dw2gencfi.c 2017-09-30 22:49:42 +0000
+@@ -255,11 +255,11 @@ get_debugseg_name (segT seg, const char
+ name = dot;
+ else
+ name = dollar;
+ }
+
+- return concat (base_name, name, NULL);
++ return concat (base_name, name, (char *)NULL);
+ }
+
+ /* Allocate a dwcfi_seg_list structure. */
+
+ static struct dwcfi_seg_list *
+diff -aprNU5 binutils-2.29.1.orig/gold/config.in binutils-2.29.1/gold/config.in
+--- binutils-2.29.1.orig/gold/config.in 2017-09-15 11:38:28 +0000
++++ binutils-2.29.1/gold/config.in 2017-09-30 22:49:42 +0000
+@@ -279,5 +279,39 @@
+ this defined. */
+ #undef _POSIX_1_SOURCE
+
+ /* Define to 1 if you need to in order for `stat' and other things to work. */
+ #undef _POSIX_SOURCE
++#ifdef __DJGPP__
++# if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
++# define __gnuc_extension__ __extension__
++# else
++# define __gnuc_extension__
++# endif
++
++# undef IS_SLASH
++# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
++# undef IS_DIRECTORY_SEPARATOR
++# define IS_DIRECTORY_SEPARATOR(c) (IS_SLASH(c) || (c) == ':')
++
++# include <libc/unconst.h>
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) \
++ (__gnuc_extension__ \
++ ({ \
++ char *_dst, *_src; \
++ _dst = _src = unconst((file_name), char *); \
++ while (*_src++) \
++ ; \
++ while ((_src - _dst) && (*--_src != '.')) \
++ ; \
++ for (*_src = '\0'; (_src - _dst); _src--) \
++ if (IS_DIRECTORY_SEPARATOR(*_src)) \
++ break; \
++ if (_src - _dst) \
++ while ((*_dst++ = *++_src)) \
++ ; \
++ (file_name); \
++ }) \
++ )
++#else
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) (file_name)
++#endif
+diff -aprNU5 binutils-2.29.1.orig/gprof/gconfig.in binutils-2.29.1/gprof/gconfig.in
+--- binutils-2.29.1.orig/gprof/gconfig.in 2017-07-10 09:54:42 +0000
++++ binutils-2.29.1/gprof/gconfig.in 2017-09-30 22:49:42 +0000
+@@ -112,5 +112,42 @@
+ this defined. */
+ #undef _POSIX_1_SOURCE
+
+ /* Define to 1 if you need to in order for `stat' and other things to work. */
+ #undef _POSIX_SOURCE
++
++#ifdef __DJGPP__
++# include <sys/version.h>
++
++# if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
++# define __gnuc_extension__ __extension__
++# else
++# define __gnuc_extension__
++# endif
++
++# undef IS_SLASH
++# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
++# undef IS_DIRECTORY_SEPARATOR
++# define IS_DIRECTORY_SEPARATOR(c) (IS_SLASH(c) || (c) == ':')
++
++# include <libc/unconst.h>
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) \
++ (__gnuc_extension__ \
++ ({ \
++ char *_dst, *_src; \
++ _dst = _src = unconst((file_name), char *); \
++ while (*_src++) \
++ ; \
++ while ((_src - _dst) && (*--_src != '.')) \
++ ; \
++ for (*_src = '\0'; (_src - _dst); _src--) \
++ if (IS_DIRECTORY_SEPARATOR(*_src)) \
++ break; \
++ if (_src - _dst) \
++ while ((*_dst++ = *++_src)) \
++ ; \
++ (file_name); \
++ }) \
++ )
++#else
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) (file_name)
++#endif
+diff -aprNU5 binutils-2.29.1.orig/gprof/gprof.c binutils-2.29.1/gprof/gprof.c
+--- binutils-2.29.1.orig/gprof/gprof.c 2017-07-10 09:54:42 +0000
++++ binutils-2.29.1/gprof/gprof.c 2017-09-30 22:49:42 +0000
+@@ -196,11 +196,17 @@ main (int argc, char **argv)
+ #ifdef ENABLE_NLS
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+ #endif
+
+- whoami = argv[0];
++#if defined (COFF_GO32_EXE) || defined (COFF_GO32)
++ /* This call is necessary to check if coff
++ 64k relocation support shall be enabled or not. */
++ bfd_init ();
++#endif
++
++ whoami = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (whoami);
+
+ expandargv (&argc, &argv);
+
+ while ((ch = getopt_long (argc, argv,
+diff -aprNU5 binutils-2.29.1.orig/ld/config.in binutils-2.29.1/ld/config.in
+--- binutils-2.29.1.orig/ld/config.in 2017-09-15 11:38:10 +0000
++++ binutils-2.29.1/ld/config.in 2017-09-30 22:49:42 +0000
+@@ -237,5 +237,52 @@
+ this defined. */
+ #undef _POSIX_1_SOURCE
+
+ /* Define to 1 if you need to in order for `stat' and other things to work. */
+ #undef _POSIX_SOURCE
++
++
++
++/*
++ * DJGPP specific stuff.
++ */
++
++/* DJGPP, DXE3 support: Enable resolution of multiple symbol definition
++ introduced by the import libraries by the linker. */
++#undef HAVE_DXE3_SUPPORT
++
++#ifdef __DJGPP__
++# include <sys/version.h>
++
++# if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
++# define __gnuc_extension__ __extension__
++# else
++# define __gnuc_extension__
++# endif
++
++# undef IS_SLASH
++# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
++# undef IS_DIRECTORY_SEPARATOR
++# define IS_DIRECTORY_SEPARATOR(c) (IS_SLASH(c) || (c) == ':')
++
++# include <libc/unconst.h>
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) \
++ (__gnuc_extension__ \
++ ({ \
++ char *_dst, *_src; \
++ _dst = _src = unconst((file_name), char *); \
++ while (*_src++) \
++ ; \
++ while ((_src - _dst) && (*--_src != '.')) \
++ ; \
++ for (*_src = '\0'; (_src - _dst); _src--) \
++ if (IS_DIRECTORY_SEPARATOR(*_src)) \
++ break; \
++ if (_src - _dst) \
++ while ((*_dst++ = *++_src)) \
++ ; \
++ (file_name); \
++ }) \
++ )
++#else
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) (file_name)
++#endif
+diff -aprNU5 binutils-2.29.1.orig/ld/configure binutils-2.29.1/ld/configure
+--- binutils-2.29.1.orig/ld/configure 2017-09-15 11:38:08 +0000
++++ binutils-2.29.1/ld/configure 2017-09-30 22:49:42 +0000
+@@ -17282,10 +17282,19 @@ fi
+
+
+
+
+
++case "$target_os" in
++ *djgpp)
++cat >>confdefs.h <<_ACEOF
++#define HAVE_DXE3_SUPPORT 1
++_ACEOF
++ ;;
++esac
++
++
+ ac_config_files="$ac_config_files Makefile po/Makefile.in:po/Make-in"
+
+ cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+ # tests run on this system so they can be shared between configure
+diff -aprNU5 binutils-2.29.1.orig/ld/ldfile.c binutils-2.29.1/ld/ldfile.c
+--- binutils-2.29.1.orig/ld/ldfile.c 2017-07-10 09:54:42 +0000
++++ binutils-2.29.1/ld/ldfile.c 2017-09-30 22:49:42 +0000
+@@ -62,10 +62,128 @@ typedef struct search_arch
+
+ static search_dirs_type **search_tail_ptr = &search_head;
+ static search_arch_type *search_arch_head;
+ static search_arch_type **search_arch_tail_ptr = &search_arch_head;
+
++
++#ifdef __DJGPP__
++/* Map library long filename to an library short filename
++ according to the filename table stored in /dev/env/DJDIR/lib/libnames.tab. */
++
++static bfd_boolean
++map_LFN_to_SFN (const char **filename)
++{
++ static char **table = NULL;
++ static int last_index = 0;
++
++
++ /*
++ * Initialize library name table from libnames.tab content.
++ */
++ if (!table)
++ {
++ FILE *map = fopen ("/dev/env/DJDIR/lib/libnames.tab", "r");
++
++ if (map)
++ {
++ char line[128];
++ int i = 0;
++
++ while (fscanf(map, "%[^\n]\n", line) != EOF)
++ {
++ if (line[0] == '#')
++ continue;
++ else
++ i++;
++ }
++
++ if (i)
++ {
++ last_index = 2 * i;
++ table = xmalloc(last_index * sizeof(char *));
++
++ i = 0;
++ rewind(map);
++ while (fscanf(map, "%[^\n]\n", line) != EOF)
++ {
++ if (line[0] != '#')
++ {
++ char long_name[FILENAME_MAX + 1], short_name[FILENAME_MAX + 1];
++
++ sscanf(line, "%s %s", long_name, short_name);
++ table[i++] = concat(long_name, (const char *) NULL);
++ table[i++] = concat(short_name, (const char *) NULL);
++ }
++ }
++ }
++
++ fclose(map);
++ }
++ else if (verbose)
++ info_msg(_("cannot find \"/dev/env/DJDIR/lib/libnames.tab\"\n"));
++ }
++
++
++ /*
++ * Map library LFN to SFN using the table read from libnames.tab content.
++ */
++ if (table)
++ {
++ char *extension, *libname, *prefix = concat(*filename, (const char *)NULL);
++ char line[128];
++ int i;
++
++ /* Strip library prefix and suffix. */
++ for (libname = prefix, i = 0; libname[i]; i++)
++ ;
++
++#define IS_DOT_A_SUFFIX(filename) ((filename)[--i] == 'a' && (filename)[--i] == '.')
++#define IS_LIB_PREFIX(filename) ((filename)[--i] == 'b' && (filename)[--i] == 'i' && (filename)[--i] == 'l')
++ while (i)
++ if (IS_DOT_A_SUFFIX(libname))
++ {
++ libname[i] = '\0';
++ extension = libname + i;
++ break;
++ }
++ while (i)
++ if (IS_LIB_PREFIX(libname))
++ {
++ if (i == 0)
++ {
++ libname += 3;
++ break;
++ }
++ if (libname[--i] == '/')
++ {
++ libname += i + 4;
++ break;
++ }
++ }
++#undef IS_DOT_A_SUFFIX
++#undef IS_LIB_PREFIX
++
++ for (i = 0; i < last_index; i++)
++ if (strcmp(libname, table[i++]) == 0)
++ {
++ /* Create a short filename for the library. */
++ *libname = '\0';
++ *extension = '.';
++ *filename = concat(prefix, table[i], extension, (const char *)NULL);
++ if (verbose)
++ info_msg(_("mapped \"%s\" to \"%s\"\n"), table[i - 1], table[i]);
++
++ return TRUE;
++ }
++
++ free(prefix);
++ }
++
++ return FALSE;
++}
++#endif /* __DJGPP__ */
++
+ /* Test whether a pathname, after canonicalization, is the same or a
+ sub-directory of the sysroot directory. */
+
+ static bfd_boolean
+ is_sysrooted_pathname (const char *name)
+@@ -122,12 +240,23 @@ ldfile_add_library_path (const char *nam
+
+ bfd_boolean
+ ldfile_try_open_bfd (const char *attempt,
+ lang_input_statement_type *entry)
+ {
++#ifdef __DJGPP__
++ bfd_boolean already_tried_SFN = FALSE;
++
++again:
++#endif /* __DJGPP__ */
++
+ entry->the_bfd = bfd_openr (attempt, entry->target);
+
++#ifdef __DJGPP__
++ if (!entry->the_bfd && !already_tried_SFN && (already_tried_SFN = map_LFN_to_SFN(&attempt)))
++ goto again;
++#endif /* __DJGPP__ */
++
+ if (verbose)
+ {
+ if (entry->the_bfd == NULL)
+ info_msg (_("attempt to open %s failed\n"), attempt);
+ else
+@@ -369,11 +498,11 @@ ldfile_open_file_search (const char *arc
+ if (entry->flags.maybe_archive && !entry->flags.full_name_provided)
+ string = concat (search->name, slash, lib, entry->filename,
+ arch, suffix, (const char *) NULL);
+ else
+ string = concat (search->name, slash, entry->filename,
+- (const char *) 0);
++ (const char *) NULL);
+
+ if (ldfile_try_open_bfd (string, entry))
+ {
+ entry->filename = string;
+ return TRUE;
+diff -aprNU5 binutils-2.29.1.orig/ld/ldmain.c binutils-2.29.1/ld/ldmain.c
+--- binutils-2.29.1.orig/ld/ldmain.c 2017-07-10 09:54:42 +0000
++++ binutils-2.29.1/ld/ldmain.c 2017-09-30 22:49:42 +0000
+@@ -209,11 +209,11 @@ main (int argc, char **argv)
+ setlocale (LC_CTYPE, "");
+ #endif
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+- program_name = argv[0];
++ program_name = STRIP_FULL_PATH_AND_EXTENSION(argv[0]);
+ xmalloc_set_program_name (program_name);
+
+ START_PROGRESS (program_name, 0);
+
+ expandargv (&argc, &argv);
+@@ -976,10 +976,34 @@ multiple_definition (struct bfd_link_inf
+ || (nsec->output_section != NULL
+ && !bfd_is_abs_section (nsec)
+ && bfd_is_abs_section (nsec->output_section)))
+ return;
+
++#if defined(HAVE_DXE3_SUPPORT) && HAVE_DXE3_SUPPORT == 1
++ /* DJGPP specific resolution of multiple symbol definitions.
++ A symbol defined in an object file or in an static library
++ and at the same time in an import library belonging to a
++ DXE3 module will be replaced by the symbol provided by the
++ import library. If more than one import library provides
++ the same symbol the first one will be used and all other
++ ones will be ignored.
++ A symbol from an import library is identified by its "dxe_tmp.o"
++ or "$$dxe$$.o" file name. */
++
++#define IS_IMPORT_LIBRARY_SYMBOL(name) (((name)[0] == 'd' && (name)[1] == 'x' && (name)[2] == 'e' && (name)[3] == '_' && \
++ (name)[4] == 't' && (name)[5] == 'm' && (name)[6] == 'p' && (name)[7] == '.' && \
++ (name)[8] == 'o') || \
++ ((name)[0] == '$' && (name)[1] == '$' && (name)[2] == 'd' && (name)[3] == 'x' && \
++ (name)[4] == 'e' && (name)[5] == '$' && (name)[6] == '$' && (name)[7] == '.' && \
++ (name)[8] == 'o'))
++
++ if (h->type == bfd_link_hash_defined && IS_IMPORT_LIBRARY_SYMBOL(nsec->owner->filename))
++ return;
++
++#undef IS_IMPORT_LIBRARY_SYMBOL
++#endif /* HAVE_DXE3_SUPPORT */
++
+ name = h->root.string;
+ if (nbfd == NULL)
+ {
+ nbfd = obfd;
+ nsec = osec;
+diff -aprNU5 binutils-2.29.1.orig/ld/libnames.tab binutils-2.29.1/ld/libnames.tab
+--- binutils-2.29.1.orig/ld/libnames.tab 1970-01-01 00:00:00 +0000
++++ binutils-2.29.1/ld/libnames.tab 2017-09-30 22:49:42 +0000
+@@ -0,0 +1,31 @@
++#
++# Table to map libraries long file name to short file names.
++# The entry is:
++# LFN SFN
++# The library name is the name stripped from its directory name,
++# stripped from its "lib" prefix and its ".a" suffix.
++#
++#
++# E.g.: for the library
++#
++# /dev/env/DJDIR/lib/foobar-1.2.3/libverylongname-1.2.3.a
++#
++# the mapping entry will look like this:
++#
++# verylongname-1.2.3 vln123
++#
++
++
++# LFN SFN
++
++# Map for GNU gettext libraries.
++gettextlib gtxtlib
++gettextpo gtxtpo
++gettextsrc gtxtsrc
++
++
++# Map for perl compatible regular expressions libraries with API 2 (aka PCRE2).
++pcre2-8 pcr28
++pcre2-16 pcr216
++pcre2-32 pcr232
++pcre2-posix pcr2posix
+diff -aprNU5 binutils-2.29.1.orig/ld/scripttempl/i386go32.sc binutils-2.29.1/ld/scripttempl/i386go32.sc
+--- binutils-2.29.1.orig/ld/scripttempl/i386go32.sc 2017-07-10 09:54:42 +0000
++++ binutils-2.29.1/ld/scripttempl/i386go32.sc 2017-09-30 22:49:42 +0000
+@@ -45,18 +45,27 @@ SECTIONS
+ }
+ .data ${RELOCATING+ ${DATA_ALIGNMENT}} : {
+ ${RELOCATING+djgpp_first_ctor = . ;
+ *(SORT(.ctors.*))
+ *(.ctor)
++ *(.ctors)
+ djgpp_last_ctor = . ;}
+ ${RELOCATING+djgpp_first_dtor = . ;
+ *(SORT(.dtors.*))
+ *(.dtor)
++ *(.dtors)
+ djgpp_last_dtor = . ;}
++ __environ = . ;
++ PROVIDE(_environ = .) ;
++ LONG(0) ;
+ *(.data)
+ ${RELOCATING+*(.data.*)}
+
++ /* Ugly workaround to prevent entire .bss to have attribute CONTENT */
++ /* for C++ executables. */
++ *(.bss.*)
++
+ ${RELOCATING+*(.gcc_exc*)}
+ ${RELOCATING+___EH_FRAME_BEGIN__ = . ;}
+ ${RELOCATING+*(.eh_fram*)}
+ ${RELOCATING+___EH_FRAME_END__ = . ;}
+ ${RELOCATING+LONG(0);}
+@@ -67,15 +76,17 @@ SECTIONS
+ }
+ ${CONSTRUCTING+${RELOCATING-$CTOR}}
+ ${CONSTRUCTING+${RELOCATING-$DTOR}}
+ .bss ${RELOCATING+ SIZEOF(.data) + ADDR(.data)} :
+ {
+- *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
++ *(.bss${RELOCATING+ .gnu.linkonce.b.*})
+ *(COMMON)
+ ${RELOCATING+ end = . ; PROVIDE(_end = .) ;}
+ ${RELOCATING+ . = ALIGN(${SEGMENT_SIZE});}
+ }
++ /* Discard LTO sections. */
++ /DISCARD/ : { *(gnu.lto_*) }
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ EOF
+
+diff -aprNU5 binutils-2.29.1.orig/opcodes/config.in binutils-2.29.1/opcodes/config.in
+--- binutils-2.29.1.orig/opcodes/config.in 2017-09-15 11:37:22 +0000
++++ binutils-2.29.1/opcodes/config.in 2017-09-30 22:49:42 +0000
+@@ -118,5 +118,42 @@
+ this defined. */
+ #undef _POSIX_1_SOURCE
+
+ /* Define to 1 if you need to in order for `stat' and other things to work. */
+ #undef _POSIX_SOURCE
++
++#ifdef __DJGPP__
++# include <sys/version.h>
++
++# if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
++# define __gnuc_extension__ __extension__
++# else
++# define __gnuc_extension__
++# endif
++
++# undef IS_SLASH
++# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
++# undef IS_DIRECTORY_SEPARATOR
++# define IS_DIRECTORY_SEPARATOR(c) (IS_SLASH(c) || (c) == ':')
++
++# include <libc/unconst.h>
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) \
++ (__gnuc_extension__ \
++ ({ \
++ char *_dst, *_src; \
++ _dst = _src = unconst((file_name), char *); \
++ while (*_src++) \
++ ; \
++ while ((_src - _dst) && (*--_src != '.')) \
++ ; \
++ for (*_src = '\0'; (_src - _dst); _src--) \
++ if (IS_DIRECTORY_SEPARATOR(*_src)) \
++ break; \
++ if (_src - _dst) \
++ while ((*_dst++ = *++_src)) \
++ ; \
++ (file_name); \
++ }) \
++ )
++#else
++# define STRIP_FULL_PATH_AND_EXTENSION(file_name) (file_name)
++#endif