*** src-o/makefile.nt	Sat Dec 23 16:09:42 1995
--- src/makefile.nt	Sat Dec 23 16:20:19 1995
***************
*** 54,60 ****
  !endif
  TLASTLIB	= $(BLD)\lastfile.lib
  
! LINK_FLAGS      = $(ARCH_LDFLAGS) -stack:0x1000000 -base:0xD00000 -debug:full -debugtype:cv -machine:$(ARCH) -subsystem:$(SUBSYSTEM) -entry:_start -map:$(BLD)\temacs.map
  
  #
  # Split up the objects into two sets so that we don't run out of
--- 54,60 ----
  !endif
  TLASTLIB	= $(BLD)\lastfile.lib
  
! LINK_FLAGS      = $(ARCH_LDFLAGS) -stack:0x1000000 -base:0xD00000 -debug:full -debugtype:cv -machine:$(ARCH) -subsystem:$(SUBSYSTEM) -entry:_start -map:$(BLD)\temacs.map -map
  
  #
  # Split up the objects into two sets so that we don't run out of
*** src-o/unexnt.c	Sat Dec 23 16:09:38 1995
--- src/unexnt.c	Sat Dec 23 16:24:33 1995
***************
*** 291,296 ****
--- 291,334 ----
  
  /* Routines to manipulate NT executable file sections.  */
  
+ static void
+ get_bss_info_from_map_file (file_data *p_infile, PUCHAR *p_bss_start, 
+ 			    DWORD *p_bss_size)
+ {
+   int n, start, len;
+   char map_filename[MAX_PATH];
+   char buffer[256];
+   FILE *map;
+ 
+   /* Overwrite the .exe extension on the executable file name with
+      the .map extension.  */
+   strcpy (map_filename, p_infile->name);
+   n = strlen (map_filename) - 3;
+   strcpy (&map_filename[n], "map");
+ 
+   map = fopen (map_filename, "r");
+   if (!map)
+     {
+       printf ("Failed to open map file %s, error %d...bailing out.\n",
+ 	      map_filename, GetLastError ());
+       exit (-1);
+     }
+ 
+   while (fgets (buffer, sizeof (buffer), map))
+     {
+       if (!(strstr (buffer, ".bss") && strstr (buffer, "DATA")))
+ 	continue;
+       n = sscanf (buffer, " %*d:%x %x", &start, &len);
+       if (n != 2)
+ 	{
+ 	  printf ("Failed to scan the .bss section line:\n%s", buffer);
+ 	  exit (-1);
+ 	}
+       break;
+     }
+   *p_bss_start = (PUCHAR) start;
+   *p_bss_size = (DWORD) len;
+ }
  
  static unsigned long
  get_section_size (PIMAGE_SECTION_HEADER p_section)
***************
*** 311,317 ****
  {
    PIMAGE_DOS_HEADER dos_header;
    PIMAGE_NT_HEADERS nt_header;
!   PIMAGE_SECTION_HEADER section;
    unsigned char *ptr;
    int i;
    
--- 349,355 ----
  {
    PIMAGE_DOS_HEADER dos_header;
    PIMAGE_NT_HEADERS nt_header;
!   PIMAGE_SECTION_HEADER section, data_section;
    unsigned char *ptr;
    int i;
    
***************
*** 355,360 ****
--- 393,399 ----
  	  extern char my_edata[];
  
  	  /* The .data section.  */
+ 	  data_section = section;
  	  ptr  = (char *) nt_header->OptionalHeader.ImageBase +
  	    section->VirtualAddress;
  	  data_start_va = ptr;
***************
*** 367,372 ****
--- 406,426 ----
  	  data_size = my_edata - data_start_va;
  	}
        section++;
+     }
+ 
+   if (!bss_start && !bss_size)
+     {
+       /* Starting with MSVC 4.0, the .bss section has been eliminated
+ 	 and appended virtually to the end of the .data section.  Our
+ 	 only hint about where the .bss section starts in the address
+ 	 comes from the SizeOfRawData field in the .data section
+ 	 header.  Unfortunately, this field is only approximate, as it
+ 	 is a rounded number and is typically rounded just beyond the
+ 	 start of the .bss section.  To find the start and size of the
+ 	 .bss section exactly, we have to peek into the map file.  */
+       get_bss_info_from_map_file (p_infile, &ptr, &bss_size);
+       bss_start = ptr + nt_header->OptionalHeader.ImageBase
+ 	+ data_section->VirtualAddress;
      }
  }
  
