annotate src/unexnt.c @ 814:a634e3b7acc8

[xemacs-hg @ 2002-04-14 12:41:59 by ben] latest changes TODO.ben-mule-21-5: Update. make-docfile.c: Add basic support for handling ISO 2022 doc strings -- we parse the basic charset designation sequences so we know whether we're in ASCII and have to pay attention to end quotes and such. Reformat code according to coding standards. abbrev.el: Add `global-abbrev-mode', which turns on or off abbrev-mode in all buffers. Added `defining-abbrev-turns-on-abbrev-mode' -- if non-nil, defining an abbrev through an interactive function will automatically turn on abbrev-mode, either globally or locally depending on the command. This is the "what you'd expect" behavior. indent.el: general function for indenting a balanced expression in a mode-correct way. Works similar to indent-region in that a mode can specify a specific command to do the whole operation; if not, figure out the region using forward-sexp and indent each line using indent-according-to-mode. keydefs.el: Removed. Modify M-C-backslash to do indent-region-or-balanced-expression. Make S-Tab just insert a TAB char, like it's meant to do. make-docfile.el: Now that we're using the call-process-in-lisp, we need to load an extra file win32-native.el because we're running a bare temacs. menubar-items.el: Totally redo the Cmds menu so that most used commands appear directly on the menu and less used commands appear in submenus. The old way may have been very pretty, but rather impractical. process.el: Under Windows, don't ever use old-call-process-internal, even in batch mode. We can do processes in batch mode. subr.el: Someone recoded truncate-string-to-width, saying "the FSF version is too complicated and does lots of hard-to-understand stuff" but the resulting recoded version was *totally* wrong! it misunderstood the basic point of this function, which is work in *columns* not chars. i dumped ours and copied the version from FSF 21.1. Also added truncate-string-with-continuation-dots, since this idiom is used often. config.inc.samp, xemacs.mak: Separate out debug and optimize flags. Remove all vestiges of USE_MINIMAL_TAGBITS, USE_INDEXED_LRECORD_IMPLEMENTATION, and GUNG_HO, since those ifdefs have long been removed. Make error-checking support actually work. Some rearrangement of config.inc.samp to make it more logical. Remove callproc.c and ntproc.c from xemacs.mak, no longer used. Make pdump the default. lisp.h: Add support for strong type-checking of Bytecount, Bytebpos, Charcount, Charbpos, and others, by making them classes, overloading the operators to provide integer-like operation and carefully controlling what operations are allowed. Not currently enabled in C++ builds because there are still a number of compile errors, and it won't really work till we merge in my "8-bit-Mule" workspace, in which I make use of the new types Charxpos, Bytexpos, Memxpos, representing a "position" either in a buffer or a string. (This is especially important in the extent code.) abbrev.c, alloc.c, eval.c, buffer.c, buffer.h, editfns.c, fns.c, text.h: Warning fixes, some of them related to new C++ strict type checking of Bytecount, Charbpos, etc. dired.c: Caught an actual error due to strong type checking -- char len being passed when should be byte len. alloc.c, backtrace.h, bytecode.c, bytecode.h, eval.c, sysdep.c: Further optimize Ffuncall: -- process arg list at compiled-function creation time, converting into an array for extra-quick access at funcall time. -- rewrite funcall_compiled_function to use it, and inline this function. -- change the order of check for magic stuff in SPECBIND_FAST_UNSAFE to be faster. -- move the check for need to garbage collect into the allocation code, so only a single flag needs to be checked in funcall. buffer.c, symbols.c: add debug funs to check on mule optimization info in buffers and strings. eval.c, emacs.c, text.c, regex.c, scrollbar-msw.c, search.c: Fix evil crashes due to eistrings not properly reinitialized under pdump. Redo a bit some of the init routines; convert some complex_vars_of() into simple vars_of(), because they didn't need complex processing. callproc.c, emacs.c, event-stream.c, nt.c, process.c, process.h, sysdep.c, sysdep.h, syssignal.h, syswindows.h, ntproc.c: Delete. Hallelujah, praise the Lord, there is no god but Allah!!! fix so that processes can be invoked in bare temacs -- thereby eliminating any need for callproc.c. (currently only eliminated under NT.) remove all crufty and unnecessary old process code in ntproc.c and elsewhere. move non-callproc-specific stuff (mostly environment) into process.c, so callproc.c can be left out under NT. console-tty.c, doc.c, file-coding.c, file-coding.h, lstream.c, lstream.h: fix doc string handling so it works with Japanese, etc docs. change handling of "character mode" so callers don't have to manually set it (quite error-prone). event-msw.c: spacing fixes. lread.c: eliminate unused crufty vintage-19 "FSF defun hack" code. lrecord.h: improve pdump description docs. buffer.c, ntheap.c, unexnt.c, win32.c, emacs.c: Mule-ize some unexec and startup code. It was pseudo-Mule-ized before by simply always calling the ...A versions of functions, but that won't cut it -- eventually we want to be able to run properly even if XEmacs has been installed in a Japanese directory. (The current problem is the timing of the loading of the Unicode tables; this will eventually be fixed.) Go through and fix various other places where the code was not Mule-clean. Provide a function mswindows_get_module_file_name() to get our own name without resort to PATH_MAX and such. Add a big comment in main() about the problem with Unicode table load timing that I just alluded to. emacs.c: When error-checking is enabled (interpreted as "user is developing XEmacs"), don't ask user to "pause to read messages" when a fatal error has occurred, because it will wedge if we are in an inner modal loop (typically when a menu is popped up) and make us unable to get a useful stack trace in the debugger. text.c: Correct update_entirely_ascii_p_flag to actually work. lisp.h, symsinit.h: declarations for above changes.
author ben
date Sun, 14 Apr 2002 12:43:31 +0000
parents f846c2ef930d
children 804517e16990
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 558
diff changeset
1 /* unexec for XEmacs on Windows NT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to the Free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Geoff Voelker (voelker@cs.washington.edu) 8-12-94 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
25 /* This file has been Mule-ized, Ben Wing, 4-13-02. */
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
26
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* The linkers that come with MSVC >= 4.0 merge .bss into .data and reorder
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 * uninitialised data so that the .data section looks like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 * crt0 initialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 * emacs initialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 * <my_edata>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 * library initialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 * <start of bss part of .data>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 * emacs static uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 * library static uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 * emacs global uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 * <my_ebss>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 * library global uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 * This means that we can't use the normal my_ebss in lastfile.c trick to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 * differentiate between unitialised data that belongs to emacs and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 * uninitialised data that belongs to system libraries. This is bad because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 * we do want to initialise the emacs data, but we don't want to initialise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 * the system library data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 * To solve this problem using MSVC >= 5.0 we use a pragma directive to tell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 * the compiler to put emacs's data (both initialised and uninitialised) in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 * a separate section in the executable, and we only dump that section. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 * means that all files that define initialized data must include config.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 * to pick up the pragma. We don't try to make any part of that section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 * read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 * This pragma directive isn't supported by the MSVC 4.x compiler. Instead,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 * we dump crt0 initialised data and library static uninitialised data in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 * addition to the emacs data. This is wrong, but we appear to be able to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 * get away with it. A proper fix might involve the introduction of a static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 * version of my_ebss in lastfile.c and a new firstfile.c file. jhar */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #include <config.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
61 #include "lisp.h"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
62
558
ed498ef2108b [xemacs-hg @ 2001-05-23 09:59:33 by ben]
ben
parents: 442
diff changeset
63 #include "sysfile.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
64 #include "syswindows.h"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
65
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 /* From IMAGEHLP.H which is not installed by default by MSVC < 5 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 /* The IMAGEHLP.DLL library is not distributed by default with Windows95 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
68 typedef PIMAGE_NT_HEADERS
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
69 (__stdcall * pfnCheckSumMappedFile_t) (LPVOID BaseAddress, DWORD FileLength,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
70 LPDWORD HeaderSum, LPDWORD CheckSum);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
71
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 extern BOOL ctrl_c_handler (unsigned long type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
77 /* Sync with FSF Emacs 19.34.6
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
78 note: struct file_data is now defined in nt.h */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 enum {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 HEAP_UNINITIALIZED = 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 HEAP_UNLOADED,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 HEAP_LOADED
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 /* Basically, our "initialized" flag. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 int heap_state = HEAP_UNINITIALIZED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 /* So we can find our heap in the file to recreate it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 unsigned long heap_index_in_executable = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 void get_section_info (file_data *p_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 void copy_executable_and_dump_data_section (file_data *, file_data *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 void dump_bss_and_heap (file_data *p_infile, file_data *p_outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 /* Cached info about the .data section in the executable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 PUCHAR data_start_va = UNINIT_PTR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 DWORD data_start_file = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 DWORD data_size = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 /* Cached info about the .bss section in the executable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 PUCHAR bss_start = UNINIT_PTR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 DWORD bss_size = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 /* Startup code for running on NT. When we are running as the dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 version, we need to bootstrap our heap and .bss section into our
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 address space before we can actually hand off control to the startup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 code supplied by NT (primarily because that code relies upon malloc ()). */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
109
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
110 /* **********************
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
111 Hackers please remember, this _start() thingy is *not* called neither
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
112 when dumping portably, nor when running from temacs! Do not put
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
113 significant XEmacs initialization here!
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
114 ********************** */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
115
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 _start (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 extern void mainCRTStartup (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 /* Cache system info, e.g., the NT page size. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 cache_system_info ();
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
123 /* Set OS type, so that tchar stuff below works */
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
124 init_win32_very_early ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 /* If we're a dumped version of emacs then we need to recreate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 our heap and play tricks with our .bss section. Do this before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 start up. (WARNING: Do not put any code before this section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 that relies upon malloc () and runs in the dumped version. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 won't work.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 if (heap_state == HEAP_UNLOADED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
133 Extbyte executable_path[MAX_PATH * MAX_XETCHAR_SIZE];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
135 /* Don't use mswindows_get_module_file_name() because it uses
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
136 xmalloc() */
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
137 if (qxeGetModuleFileName (NULL, executable_path, MAX_PATH) == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
142 /* #### This is super-bogus. When I rename xemacs.exe,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
143 the renamed file still loads its heap from xemacs.exe --kkm */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
144 #if 0
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
145 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
146 Extbyte *p;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
147
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
148 /* To allow profiling, make sure executable_path names the .exe
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
149 file, not the file created by the profiler */
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
150 p = xetcsrchr (executable_path, '\\');
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
151 xetcscpy (p + 1, XETEXT (PATH_PROGNAME ".exe"));
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
152 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
153 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 recreate_heap (executable_path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 heap_state = HEAP_LOADED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
159 /* #### This is bogus, too. _fmode is set to different values
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
160 when we run `xemacs' and `temacs run-emacs'. The sooner we
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
161 hit and fix all the weirdities this causes us, the better --kkm */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
162 #if 0
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 /* The default behavior is to treat files as binary and patch up
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
164 text files appropriately. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 _fmode = O_BINARY;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
166 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 /* This prevents ctrl-c's in shells running while we're suspended from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 having us exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ctrl_c_handler, TRUE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 mainCRTStartup ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 /* Dump out .data and .bss sections into a new executable. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
178 int
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
179 unexec (Intbyte *new_name, Intbyte *old_name, unsigned int start_data,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
180 unsigned int start_bss, unsigned int entry_address)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 file_data in_file, out_file;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
183 Intbyte *out_filename = alloca_intbytes (qxestrlen (new_name) + 10);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
184 Intbyte *in_filename = alloca_intbytes (qxestrlen (old_name) + 10);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 unsigned long size;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
186 Intbyte *ptr;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
187 HINSTANCE hImagehelp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 /* Make sure that the input and output filenames have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 ".exe" extension...patch them up if they don't. */
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
191 qxestrcpy (in_filename, old_name);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
192 ptr = in_filename + qxestrlen (in_filename) - 4;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
193 if (qxestrcmp (ptr, ".exe"))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
194 qxestrcat (in_filename, ".exe");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
196 qxestrcpy (out_filename, new_name);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
197 ptr = out_filename + qxestrlen (out_filename) - 4;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
198 if (qxestrcmp (ptr, ".exe"))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
199 qxestrcat (out_filename, ".exe");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
201 stdout_out ("Dumping from %s\n", in_filename);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
202 stdout_out (" to %s\n", out_filename);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 /* We need to round off our heap to NT's allocation unit (64KB). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 round_heap (get_allocation_unit ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 /* Open the undumped executable file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 if (!open_input_file (&in_file, in_filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
210 stdout_out ("Failed to open %s (%d)...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
211 in_filename, GetLastError ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 /* Get the interesting section info, like start and size of .bss... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 get_section_info (&in_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 /* The size of the dumped executable is the size of the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 executable plus the size of the heap and the size of the .bss section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 heap_index_in_executable = (unsigned long)
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
221 round_to_next ((UChar_Binary *) in_file.size, get_allocation_unit ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 size = heap_index_in_executable + get_committed_heap_size () + bss_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 if (!open_output_file (&out_file, out_filename, size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
225 stdout_out ("Failed to open %s (%d)...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
226 out_filename, GetLastError ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 /* Set the flag (before dumping). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 heap_state = HEAP_UNLOADED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 copy_executable_and_dump_data_section (&in_file, &out_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 dump_bss_and_heap (&in_file, &out_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 /* Patch up header fields; profiler is picky about this. */
812
f846c2ef930d [xemacs-hg @ 2002-04-13 20:31:27 by jhar]
jhar
parents: 771
diff changeset
237 hImagehelp = LoadLibraryA ("imagehlp.dll");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 if (hImagehelp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 PIMAGE_DOS_HEADER dos_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 PIMAGE_NT_HEADERS nt_header;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 DWORD headersum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 DWORD checksum;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
245 pfnCheckSumMappedFile_t pfnCheckSumMappedFile;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 dos_header = (PIMAGE_DOS_HEADER) out_file.file_base;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
248 nt_header = (PIMAGE_NT_HEADERS) ((UChar_Binary *) dos_header +
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
249 dos_header->e_lfanew);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 nt_header->OptionalHeader.CheckSum = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
252 #if 0
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
253 nt_header->FileHeader.TimeDateStamp = time (NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
254 dos_header->e_cp = size / 512;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
255 nt_header->OptionalHeader.SizeOfImage = size;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
258 pfnCheckSumMappedFile =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
259 (pfnCheckSumMappedFile_t) GetProcAddress (hImagehelp,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
260 "CheckSumMappedFile");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 if (pfnCheckSumMappedFile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
263 #if 0
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 nt_header->FileHeader.TimeDateStamp = time (NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
265 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 pfnCheckSumMappedFile (out_file.file_base,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 out_file.size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 &headersum,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 &checksum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 nt_header->OptionalHeader.CheckSum = checksum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 FreeLibrary (hImagehelp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 close_file_data (&in_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 close_file_data (&out_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 /* Routines to manipulate NT executable file sections. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 get_bss_info_from_map_file (file_data *p_infile, PUCHAR *p_bss_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 DWORD *p_bss_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 int n, start, len;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
289 Intbyte *map_filename = alloca_intbytes (qxestrlen (p_infile->name) + 10);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
290 Extbyte buffer[256];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 FILE *map;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 /* Overwrite the .exe extension on the executable file name with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 the .map extension. */
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
295 qxestrcpy (map_filename, p_infile->name);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
296 n = qxestrlen (map_filename) - 3;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
297 qxestrcpy (&map_filename[n], "map");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
299 map = qxe_fopen (map_filename, "r");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 if (!map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
302 stdout_out ("Failed to open map file %s, error %d...bailing out.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
303 map_filename, GetLastError ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 exit (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 while (fgets (buffer, sizeof (buffer), map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 if (!(strstr (buffer, ".bss") && strstr (buffer, "DATA")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 n = sscanf (buffer, " %*d:%x %x", &start, &len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 if (n != 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
314 /* printf with external data, stdout_out with internal */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 printf ("Failed to scan the .bss section line:\n%s", buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 exit (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 *p_bss_start = (PUCHAR) start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 *p_bss_size = (DWORD) len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 /* Flip through the executable and cache the info necessary for dumping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 get_section_info (file_data *p_infile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 PIMAGE_DOS_HEADER dos_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 PIMAGE_NT_HEADERS nt_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 PIMAGE_SECTION_HEADER section, data_section;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
332 UChar_Binary *ptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
338 stdout_out ("Unknown EXE header in %s...bailing.\n", p_infile->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 dos_header->e_lfanew);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 if (nt_header == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
345 stdout_out ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
346 p_infile->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 /* Check the NT header signature ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 if (nt_header->Signature != IMAGE_NT_SIGNATURE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
353 stdout_out ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
354 nt_header->Signature, p_infile->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 /* Flip through the sections for .data and .bss ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 section = (PIMAGE_SECTION_HEADER) IMAGE_FIRST_SECTION (nt_header);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 if (!strcmp (section->Name, ".bss"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 extern int my_ebss; /* From lastfile.c */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
366 ptr = (UChar_Binary *) nt_header->OptionalHeader.ImageBase +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 section->VirtualAddress;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 bss_start = ptr;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
369 bss_size = (UChar_Binary*) &my_ebss - (UChar_Binary*) bss_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 if (!strcmp (section->Name, ".data"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 if (!strcmp (section->Name, "xdata"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
377 extern Char_Binary my_edata[]; /* From lastfile.c */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 /* The .data section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 data_section = section;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
381 ptr = (UChar_Binary *) nt_header->OptionalHeader.ImageBase +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 section->VirtualAddress;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 data_start_va = ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 data_start_file = section->PointerToRawData;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 /* Write only the part of the section that contains emacs data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 data_size = my_edata - data_start_va;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 /* Write back the full section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 data_size = section->SizeOfRawData;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 /* This code doesn't know how to grow the raw size of a section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 if (section->SizeOfRawData < section->Misc.VirtualSize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
396 stdout_out ("The emacs data section is smaller than expected"
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
397 "...bailing.\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 section++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 if (bss_start == UNINIT_PTR)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 /* Starting with MSVC 4.0, the .bss section has been eliminated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 and appended virtually to the end of the .data section. Our
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 only hint about where the .bss section starts in the address
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 comes from the SizeOfRawData field in the .data section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 header. Unfortunately, this field is only approximate, as it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 is a rounded number and is typically rounded just beyond the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 start of the .bss section. To find the start and size of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 .bss section exactly, we have to peek into the map file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 extern int my_ebss;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 get_bss_info_from_map_file (p_infile, &ptr, &bss_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 bss_start = ptr + nt_header->OptionalHeader.ImageBase
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 + data_section->VirtualAddress;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
421 bss_size = (UChar_Binary *) &my_ebss - (UChar_Binary *) bss_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 bss_size = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 /* The dump routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 #ifdef DEBUG_XEMACS
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
432 /* printf with external data, stdout_out with internal */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 #define DUMP_MSG(x) printf x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 #define DUMP_MSG(x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 copy_executable_and_dump_data_section (file_data *p_infile,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 file_data *p_outfile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
442 UChar_Binary *data_file, *data_va;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 unsigned long size, index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 /* Get a pointer to where the raw data should go in the executable file. */
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
446 data_file = (UChar_Binary *) p_outfile->file_base + data_start_file;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 /* Get a pointer to the raw data in our address space. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 data_va = data_start_va;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 size = (DWORD) data_file - (DWORD) p_outfile->file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 DUMP_MSG (("Copying executable up to data section...\n"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 DUMP_MSG (("\t0x%08x Offset in input file.\n", 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 DUMP_MSG (("\t0x%08x Offset in output file.\n", 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 memcpy (p_outfile->file_base, p_infile->file_base, size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 size = data_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 DUMP_MSG (("Dumping data section...\n"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 DUMP_MSG (("\t0x%08x Address in process.\n", data_va));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 DUMP_MSG (("\t0x%08x Offset in output file.\n",
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
462 (UChar_Binary *) data_file -
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
463 (UChar_Binary *) p_outfile->file_base));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 memcpy (data_file, data_va, size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 index = (DWORD) data_file + size - (DWORD) p_outfile->file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 size = p_infile->size - index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 DUMP_MSG (("Copying rest of executable...\n"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 DUMP_MSG (("\t0x%08x Offset in input file.\n", index));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 DUMP_MSG (("\t0x%08x Offset in output file.\n", index));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
473 memcpy ((UChar_Binary *) p_outfile->file_base + index,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
474 (UChar_Binary *) p_infile->file_base + index, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 dump_bss_and_heap (file_data *p_infile, file_data *p_outfile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
480 UChar_Binary *heap_data;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
481 unsigned long size, index;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
483 DUMP_MSG (("Dumping heap onto end of executable...\n"));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
485 index = heap_index_in_executable;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
486 size = get_committed_heap_size ();
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
487 heap_data = get_heap_start ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
489 DUMP_MSG (("\t0x%08x Heap start in process.\n", heap_data));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
490 DUMP_MSG (("\t0x%08x Heap offset in executable.\n", index));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
491 DUMP_MSG (("\t0x%08x Heap size in bytes.\n", size));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
493 memcpy ((PUCHAR) p_outfile->file_base + index, heap_data, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 #ifndef DUMP_SEPARATE_SECTION
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
496 DUMP_MSG (("Dumping bss onto end of executable...\n"));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
498 index += size;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
499 size = bss_size;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
501 DUMP_MSG (("\t0x%08x BSS start in process.\n", bss_start));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
502 DUMP_MSG (("\t0x%08x BSS offset in executable.\n", index));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
503 DUMP_MSG (("\t0x%08x BSS size in bytes.\n", size));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
504 memcpy ((UChar_Binary *) p_outfile->file_base + index, bss_start, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 #undef DUMP_MSG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 /* Reload and remap routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 /* Load the dumped .bss section into the .bss area of our address space. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 /* Already done if the .bss was part of a separate emacs data section */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 void
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
516 read_in_bss (Extbyte *filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 HANDLE file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 unsigned long index, n_read;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
522 file = qxeCreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
523 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 if (file == INVALID_HANDLE_VALUE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 /* Seek to where the .bss section is tucked away after the heap... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 index = heap_index_in_executable + get_committed_heap_size ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 if (SetFilePointer (file, index, NULL, FILE_BEGIN) == 0xFFFFFFFF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 /* Ok, read in the saved .bss section and initialize all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 uninitialized variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 if (!ReadFile (file, bss_start, bss_size, &n_read, NULL))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 CloseHandle (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 /* Map the heap dumped into the executable file into our address space. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 void
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
543 map_in_heap (Extbyte *filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 HANDLE file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 HANDLE file_mapping;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 void *file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 unsigned long size, upper_size, n_read;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
550 file = qxeCreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
551 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 if (file == INVALID_HANDLE_VALUE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 size = GetFileSize (file, &upper_size);
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
556 file_mapping = qxeCreateFileMapping (file, NULL, PAGE_WRITECOPY,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
557 0, size, NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 if (!file_mapping)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 size = get_committed_heap_size ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 file_base = MapViewOfFileEx (file_mapping, FILE_MAP_COPY, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 heap_index_in_executable, size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 get_heap_start ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 if (file_base != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 /* If we don't succeed with the mapping, then copy from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 data into the heap. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 CloseHandle (file_mapping);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 if (VirtualAlloc (get_heap_start (), get_committed_heap_size (),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 /* Seek to the location of the heap data in the executable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 if (SetFilePointer (file, heap_index_in_executable,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 NULL, FILE_BEGIN) == 0xFFFFFFFF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 /* Read in the data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 if (!ReadFile (file, get_heap_start (),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 get_committed_heap_size (), &n_read, NULL))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 CloseHandle (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 }