diff -u ld/configure.tgt ../binutils-2.13.2.1.newclean/ld/configure.tgt
--- ld/configure.tgt	2002-10-28 15:58:12.000000000 +0000
+++ ../binutils-2.13.2.1.newclean/ld/configure.tgt	2004-02-17 18:54:00.000000000 +0000
@@ -20,6 +20,8 @@
 			targ_extra_ofiles="deffilep.o pe-dll.o" ;;
 arm-*-pe)		targ_emul=armpe ;
 			targ_extra_ofiles="deffilep.o pe-dll.o" ;;
+strongarm-*-pe)		targ_emul=armpe ;
+			targ_extra_ofiles="deffilep.o pe-dll.o" ;;
 arc-*-elf*)		targ_emul=arcelf ;;
 avr-*-*)		targ_emul=avr85xx
 			targ_extra_emuls="avr1200 avr23xx avr44x4 avr4433 avrmega603 avrmega103 avrmega161 avr1 avr2 avr3 avr4 avr5" ;;
diff -u ld/pe-dll.c ../binutils-2.13.2.1.newclean/ld/pe-dll.c
--- ld/pe-dll.c	2002-10-29 15:01:38.000000000 +0000
+++ ../binutils-2.13.2.1.newclean/ld/pe-dll.c	2004-05-04 01:25:04.000000000 +0100
@@ -222,3 +222,4 @@
   { "cygwin_crt0", 11 },
+  { ".text", 5 },
   { NULL, 0 }
 };
@@ -254,9 +255,10 @@
 
 static autofilter_entry_type autofilter_symbolprefixlist[] =
 {
-  /*  { "__imp_", 6 }, */
+  { "__imp", 5 },
   /* Do __imp_ explicitly to save time.  */
   { "__rtti_", 7 },
+  { ".idata$", 7 },
   /* Don't re-export auto-imported symbols.  */
   { "_nm_", 4 },
   { "__builtin_", 10 },
@@ -754,8 +756,8 @@
       else
 	{
 	  /* xgettext:c-format */
-	  einfo (_("%XCannot export %s: symbol not found\n"),
-		 pe_def_file->exports[i].internal_name);
+	  einfo (_("%XCannot export %s (%s): symbol not found\n"),
+		 pe_def_file->exports[i].internal_name,pe_def_file->exports[i].name);
 	}
       free (name);
     }
@@ -1106,9 +1108,14 @@
 	  asymbol **symbols;
 	  int nsyms, symsize;
 
+#if 0
 	  /* If it's not loaded, we don't need to relocate it this way.  */
+	  /* mamaich: sometimes .data section gets no SEC_LOAD flag, but contains relocs */
 	  if (!(s->output_section->flags & SEC_LOAD))
 	    continue;
+#endif
+	  if (strncmp (bfd_get_section_name (abfd, s), ".idata",6) == 0)
+	    continue;
 
 	  /* I don't know why there would be a reloc for these, but I've
 	     seen it happen - DJ  */
@@ -1152,6 +1159,8 @@
 			     + sym->section->output_section->vma);
 		  reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
 
+/*		  printf ("rel: %s, vma=%08X\n", sym->name,reloc_data[total_relocs].vma); */
+
 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
 
 		  switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
@@ -1608,7 +1617,8 @@
   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
-  quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
+/* mamaich:  quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0); */
+  quick_symbol (abfd, U ("__head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
 
   /* OK, pay attention here.  I got confused myself looking back at
@@ -1762,6 +1772,14 @@
   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
 };
 
+static unsigned char arm_jtab[] =
+{
+  0x00, 0xc0, 0x9f, 0xe5,	/* ldr  ip, [pc] */
+  0x00, 0xf0, 0x9c, 0xe5,	/* ldr  pc, [ip] */
+  0,    0,    0,    0
+};
+
+
 static bfd *
 make_one (exp, parent)
      def_file_export *exp;
@@ -1785,6 +1803,10 @@
       jmp_bytes = jmp_sh_bytes;
       jmp_byte_count = sizeof (jmp_sh_bytes);
       break;
+    case PE_ARCH_arm:
+      jmp_bytes = arm_jtab;
+      jmp_byte_count = sizeof (arm_jtab);
+      break;
     case PE_ARCH_mips:
       jmp_bytes = jmp_mips_bytes;
       jmp_byte_count = sizeof (jmp_mips_bytes);
@@ -1839,6 +1869,9 @@
 	case PE_ARCH_sh:
 	  quick_reloc (abfd, 8, BFD_RELOC_32, 2);
 	  break;
+	case PE_ARCH_arm:
+	  quick_reloc (abfd, 8, BFD_RELOC_32, 2);
+	  break;
 	case PE_ARCH_mips:
 	  quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
 	  quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
diff -u ld/emultempl/pe.em ../binutils-2.13.2.1.newclean/ld/emultempl/pe.em
--- ld/emultempl/pe.em	2002-12-20 21:19:13.000000000 +0000
+++ ../binutils-2.13.2.1.newclean/ld/emultempl/pe.em	2004-05-04 01:28:02.000000000 +0100
@@ -299,7 +299,7 @@
   D(MajorImageVersion,"__major_image_version__", 1),
   D(MinorImageVersion,"__minor_image_version__", 0),
 #ifdef TARGET_IS_armpe
-  D(MajorSubsystemVersion,"__major_subsystem_version__", 2),
+  D(MajorSubsystemVersion,"__major_subsystem_version__", 3),
 #else
   D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
 #endif
