*** 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; } }