# HG changeset patch # User Geoff Voelker # Date 819765516 0 # Node ID 8d30151f4acbfa165d6309c28634ffecff3df00d # Parent 959a2af92455ed5a5f4126dcd6d5a00eda3c50d2 (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. diff -r 959a2af92455 -r 8d30151f4acb src/unexw32.c --- 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; + } }