diff options
Diffstat (limited to 'binutils-djgpp.patch')
-rw-r--r-- | binutils-djgpp.patch | 1329 |
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 |