2011-08-01 Juan Manuel Guerrero  <juan.guerrero@gmx.de>

	* config.sub:  Use uname result to set basic_machine value
	instead of hardcoded one.

	* bfd/coffcode.h [__MSDOS__]:  Define COFF_PAD_SECTION_HEADERS.
	Taken from bnu219s2.zip.

	* ld/scripttempl/i386go32.sc:  DJGPP specific adjustments to the
	linker script.
	Taken from djcross-binutils-2.19.1-10ap.src.rpm.

	* libiberty/make-relative-prefix.c:  DJGPP specific adjustments.
	Taken from bnu219s2.zip.

	* libiberty/make-temp-file.c:  DJGPP specific adjustments.
	Taken from bnu219s2.zip.






diff -aprNU5 binutils-2.21.1.orig/bfd/coffcode.h binutils-2.21.1/bfd/coffcode.h
--- binutils-2.21.1.orig/bfd/coffcode.h	2011-06-27 07:39:00 +0000
+++ binutils-2.21.1/bfd/coffcode.h	2011-08-05 21:11:08 +0000
@@ -3524,10 +3524,14 @@ coff_apply_checksum (bfd *abfd)
   return TRUE;
 }
 
 #endif /* COFF_IMAGE_WITH_PE */
 
+#if defined (__MSDOS__)
+# define COFF_PAD_SECTION_HEADERS
+#endif
+
 static bfd_boolean
 coff_write_object_contents (bfd * abfd)
 {
   asection *current;
   bfd_boolean hasrelocs = FALSE;
@@ -3921,10 +3925,22 @@ coff_write_object_contents (bfd * abfd)
 	}
     }
 #endif
 #endif
 
+#ifdef COFF_PAD_SECTION_HEADERS
+  if ((abfd->flags & EXEC_P) != 0)
+  {
+    file_ptr cur_ptr = scn_base + abfd->section_count * bfd_coff_scnhsz(abfd);
+    long fill_size = (abfd->sections->filepos - cur_ptr);
+    bfd_byte *b = bfd_zmalloc(fill_size);
+    if (b)
+      bfd_bwrite ((PTR)b, fill_size, abfd);
+    free (b);
+  }
+#endif
+
   /* OK, now set up the filehdr...  */
 
   /* Don't include the internal abs section in the section count */
 
   /* We will NOT put a fucking timestamp in the header here. Every time you
diff -aprNU5 binutils-2.21.1.orig/config.sub binutils-2.21.1/config.sub
--- binutils-2.21.1.orig/config.sub	2010-06-01 17:53:40 +0000
+++ binutils-2.21.1/config.sub	2011-08-05 21:11:08 +0000
@@ -579,11 +579,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.21.1.orig/djgpp/config.sh binutils-2.21.1/djgpp/config.sh
--- binutils-2.21.1.orig/djgpp/config.sh	1970-01-01 00:00:00 +0000
+++ binutils-2.21.1/djgpp/config.sh	2011-08-05 21:32:14 +0000
@@ -0,0 +1,69 @@
+#  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 ac_cv_prog_LN_S="cp -p"
+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_pipe=no
+export ac_cv_func_vfork=no
+
+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
+  }
+}
+
+# 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/
+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
+
+
+ ../configure  --disable-dependency-tracking --disable-nls --disable-64-bit-bfd \
+               --enable-build-warnings=-Wimplicit,-Wcomment,-Wformat,-Wparentheses,-Wpointer-arith
+
+# 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
+
+ make
diff -aprNU5 binutils-2.21.1.orig/ld/scripttempl/i386go32.sc binutils-2.21.1/ld/scripttempl/i386go32.sc
--- binutils-2.21.1.orig/ld/scripttempl/i386go32.sc	2009-09-09 11:59:14 +0000
+++ binutils-2.21.1/ld/scripttempl/i386go32.sc	2011-08-05 21:11:08 +0000
@@ -33,18 +33,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. */
+    *(${RELOCATING+ .bss.*})
+
     ${RELOCATING+*(.gcc_exc*)}
     ${RELOCATING+___EH_FRAME_BEGIN__ = . ;}
     ${RELOCATING+*(.eh_fram*)}
     ${RELOCATING+___EH_FRAME_END__ = . ;}
     ${RELOCATING+LONG(0);}
@@ -55,11 +64,11 @@ 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});}
   }
   /* Stabs debugging sections.  */
diff -aprNU5 binutils-2.21.1.orig/libiberty/make-relative-prefix.c binutils-2.21.1/libiberty/make-relative-prefix.c
--- binutils-2.21.1.orig/libiberty/make-relative-prefix.c	2008-03-24 18:06:36 +0000
+++ binutils-2.21.1/libiberty/make-relative-prefix.c	2011-08-05 21:11:08 +0000
@@ -76,10 +76,11 @@ relative prefix can be found, return @co
 #if defined (_WIN32) || defined (__MSDOS__) \
     || defined (__DJGPP__) || defined (__OS2__)
 #  define HAVE_DOS_BASED_FILE_SYSTEM
 #  define HAVE_HOST_EXECUTABLE_SUFFIX
 #  define HOST_EXECUTABLE_SUFFIX ".exe"
+#  define FILENAME_COMPARE strcasecmp
 #  ifndef DIR_SEPARATOR_2 
 #    define DIR_SEPARATOR_2 '\\'
 #  endif
 #  define PATH_SEPARATOR ';'
 #else
@@ -91,10 +92,14 @@ relative prefix can be found, return @co
 #else
 #  define IS_DIR_SEPARATOR(ch) \
 	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
 #endif
 
+#ifndef FILENAME_COMPARE
+#  define FILENAME_COMPARE strcmp
+#endif
+
 #define DIR_UP ".."
 
 static char *save_string (const char *, int);
 static char **split_directories	(const char *, int *);
 static void free_split_directories (char **);
@@ -317,11 +322,11 @@ make_relative_prefix_1 (const char *prog
      we can do.  */
   if (prog_num == bin_num)
     {
       for (i = 0; i < bin_num; i++)
 	{
-	  if (strcmp (prog_dirs[i], bin_dirs[i]) != 0)
+	  if (FILENAME_COMPARE (prog_dirs[i], bin_dirs[i]) != 0)
 	    break;
 	}
 
       if (prog_num <= 0 || i == bin_num)
 	goto bailout;
@@ -333,11 +338,11 @@ make_relative_prefix_1 (const char *prog
 
   /* Find how many directories are in common between bin_prefix & prefix.  */
   n = (prefix_num < bin_num) ? prefix_num : bin_num;
   for (common = 0; common < n; common++)
     {
-      if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0)
+      if (FILENAME_COMPARE (bin_dirs[common], prefix_dirs[common]) != 0)
 	break;
     }
 
   /* If there are no common directories, there can be no relative prefix.  */
   if (common == 0)
diff -aprNU5 binutils-2.21.1.orig/libiberty/make-temp-file.c binutils-2.21.1/libiberty/make-temp-file.c
--- binutils-2.21.1.orig/libiberty/make-temp-file.c	2010-07-21 16:08:00 +0000
+++ binutils-2.21.1/libiberty/make-temp-file.c	2011-08-05 21:11:08 +0000
@@ -52,16 +52,31 @@ extern int mkstemps (char *, int);
 /* '/' works just fine on MS-DOS based systems.  */
 #ifndef DIR_SEPARATOR
 #define DIR_SEPARATOR '/'
 #endif
 
+#if defined (_WIN32) || defined (__MSDOS__) \
+    || defined (__DJGPP__) || defined (__OS2__)
+#  define HAVE_DOS_BASED_FILE_SYSTEM
+#  ifndef DIR_SEPARATOR_2 
+#    define DIR_SEPARATOR_2 '\\'
+#  endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+#  define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else
+#  define IS_DIR_SEPARATOR(ch) \
+     (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif
+
 /* Name of temporary file.
    mktemp requires 6 trailing X's.  */
 #define TEMP_FILE "ccXXXXXX"
 #define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
 
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#if !defined(_WIN32) || defined(__CYGWIN__) || defined(__DJGPP__)
 
 /* Subroutine of choose_tmpdir.
    If BASE is non-NULL, return it.
    Otherwise it checks if DIR is a usable directory.
    If success, DIR is returned.
@@ -104,11 +119,11 @@ files in.
 char *
 choose_tmpdir (void)
 {
   if (!memoized_tmpdir)
     {
-#if !defined(_WIN32) || defined(__CYGWIN__)
+#if !defined(_WIN32) || defined(__CYGWIN__) || defined(__DJGPP__)
       const char *base = 0;
       char *tmpdir;
       unsigned int len;
       
 #ifdef VMS
@@ -140,11 +155,12 @@ choose_tmpdir (void)
       /* Append DIR_SEPARATOR to the directory we've chosen
 	 and return it.  */
       len = strlen (base);
       tmpdir = XNEWVEC (char, len + 2);
       strcpy (tmpdir, base);
-      tmpdir[len] = DIR_SEPARATOR;
+      if (len>0 && !IS_DIR_SEPARATOR(tmpdir[len-1]))   
+        tmpdir[len] = DIR_SEPARATOR;
       tmpdir[len+1] = '\0';
       memoized_tmpdir = tmpdir;
 #else /* defined(_WIN32) && !defined(__CYGWIN__) */
       DWORD len;
 
