diff src/unexw32.c @ 13830:8d30151f4acb

(get_bss_info_from_map_file): New function. (get_section_info): When .bss section parameters are not in the executable, search the symbol map file for them.
author Geoff Voelker <voelker@cs.washington.edu>
date Sun, 24 Dec 1995 00:38:36 +0000
parents eefa4f720371
children 621a575db6f7
line wrap: on
line diff
--- a/src/unexw32.c	Sun Dec 24 00:38:18 1995 +0000
+++ b/src/unexw32.c	Sun Dec 24 00:38:36 1995 +0000
@@ -291,6 +291,44 @@
 
 /* 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,7 +349,7 @@
 {
   PIMAGE_DOS_HEADER dos_header;
   PIMAGE_NT_HEADERS nt_header;
-  PIMAGE_SECTION_HEADER section;
+  PIMAGE_SECTION_HEADER section, data_section;
   unsigned char *ptr;
   int i;
   
@@ -355,6 +393,7 @@
 	  extern char my_edata[];
 
 	  /* The .data section.  */
+	  data_section = section;
 	  ptr  = (char *) nt_header->OptionalHeader.ImageBase +
 	    section->VirtualAddress;
 	  data_start_va = ptr;
@@ -368,6 +407,21 @@
 	}
       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;
+    }
 }