annotate src/unexw32.c @ 69478:e8bb5df2ba7a

Add index entries around each paragraph rather than depend on entries from beginning of node. Doing so ensures that index entries are less likely to be forgotten if text is cut and pasted, and are necessary anyway if the references are on a separate page. It seems that makeinfo is now (v. 4.8) only producing one index entry per node, so there is no longer any excuse not to. Use subheading instead of heading. The incorrect use of heading produced very large fonts in Info--as large as the main heading. (From Bill Wohler): MH-E never did appear in Emacs 21--MH-E versions 6 and 7 appeared *around* the time of these Emacs releases.
author Bill Wohler <wohler@newt.com>
date Wed, 15 Mar 2006 00:26:12 +0000
parents 3bd95f4f2941
children e90d04cd455a c5406394f567
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
1 /* unexec for GNU Emacs on Windows NT.
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64770
diff changeset
2 Copyright (C) 1994, 2002, 2003, 2004, 2005,
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64770
diff changeset
3 2006 Free Software Foundation, Inc.
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
5 This file is part of GNU Emacs.
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
8 it under the terms of the GNU General Public License as published by
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
10 any later version.
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
11
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
15 GNU General Public License for more details.
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
16
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
17 You should have received a copy of the GNU General Public License
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63247
diff changeset
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63247
diff changeset
20 Boston, MA 02110-1301, USA.
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
21
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
22 Geoff Voelker (voelker@cs.washington.edu) 8-12-94
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23 */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
24
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
25 #include <config.h>
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
26
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27 #include <stdio.h>
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
28 #include <fcntl.h>
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
29 #include <time.h>
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30 #include <windows.h>
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
31
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
32 /* Include relevant definitions from IMAGEHLP.H, which can be found
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
33 in \\win32sdk\mstools\samples\image\include\imagehlp.h. */
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
34
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
35 PIMAGE_NT_HEADERS
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
36 (__stdcall * pfnCheckSumMappedFile) (LPVOID BaseAddress,
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
37 DWORD FileLength,
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
38 LPDWORD HeaderSum,
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
39 LPDWORD CheckSum);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
40
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
41 extern BOOL ctrl_c_handler (unsigned long type);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
42
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
43 extern char my_begdata[];
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
44 extern char my_edata[];
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
45 extern char my_begbss[];
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
46 extern char my_endbss[];
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
47 extern char *my_begbss_static;
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
48 extern char *my_endbss_static;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
49
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
50 #include "w32heap.h"
18506
bcc706aedcea Add pragma to force zero initialized
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
51
21456
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
52 #undef min
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
53 #undef max
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
54 #define min(x, y) (((x) < (y)) ? (x) : (y))
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
55 #define max(x, y) (((x) > (y)) ? (x) : (y))
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
56
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
57 /* Basically, our "initialized" flag. */
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
58 BOOL using_dynamic_heap = FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
59
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
60 int open_input_file (file_data *p_file, char *name);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
61 int open_output_file (file_data *p_file, char *name, unsigned long size);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
62 void close_file_data (file_data *p_file);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
63
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
64 void get_section_info (file_data *p_file);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
65 void copy_executable_and_dump_data (file_data *, file_data *);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
66 void dump_bss_and_heap (file_data *p_infile, file_data *p_outfile);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
67
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
68 /* Cached info about the .data section in the executable. */
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
69 PIMAGE_SECTION_HEADER data_section;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
70 PCHAR data_start = 0;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
71 DWORD data_size = 0;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
72
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
73 /* Cached info about the .bss section in the executable. */
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
74 PIMAGE_SECTION_HEADER bss_section;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
75 PCHAR bss_start = 0;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
76 DWORD bss_size = 0;
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
77 DWORD extra_bss_size = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
78 /* bss data that is static might be discontiguous from non-static. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
79 PIMAGE_SECTION_HEADER bss_section_static;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
80 PCHAR bss_start_static = 0;
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
81 DWORD bss_size_static = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
82 DWORD extra_bss_size_static = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
83
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
84 PIMAGE_SECTION_HEADER heap_section;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
85
13423
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
86 #ifdef HAVE_NTGUI
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
87 HINSTANCE hinst = NULL;
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
88 HINSTANCE hprevinst = NULL;
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
89 LPSTR lpCmdLine = "";
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
90 int nCmdShow = 0;
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
91 #endif /* HAVE_NTGUI */
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
92
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
93 /* Startup code for running on NT. When we are running as the dumped
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
94 version, we need to bootstrap our heap and .bss section into our
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
95 address space before we can actually hand off control to the startup
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
96 code supplied by NT (primarily because that code relies upon malloc ()). */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
97 void
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
98 _start (void)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
99 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
100 extern void mainCRTStartup (void);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
101
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
102 #if 1
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
103 /* Give us a way to debug problems with crashes on startup when
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
104 running under the MSVC profiler. */
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
105 if (GetEnvironmentVariable ("EMACS_DEBUG", NULL, 0) > 0)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
106 DebugBreak ();
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
107 #endif
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
108
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
109 /* Cache system info, e.g., the NT page size. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
110 cache_system_info ();
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
111
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
112 /* Grab our malloc arena space now, before CRT starts up. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
113 init_heap ();
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
114
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115 /* This prevents ctrl-c's in shells running while we're suspended from
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
116 having us exit. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
117 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ctrl_c_handler, TRUE);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
118
23948
5d7a43e8b133 (_start): Force system calls accessing unmounted devices to fail
Andrew Innes <andrewi@gnu.org>
parents: 22300
diff changeset
119 /* Prevent Emacs from being locked up (eg. in batch mode) when
5d7a43e8b133 (_start): Force system calls accessing unmounted devices to fail
Andrew Innes <andrewi@gnu.org>
parents: 22300
diff changeset
120 accessing devices that aren't mounted (eg. removable media drives). */
5d7a43e8b133 (_start): Force system calls accessing unmounted devices to fail
Andrew Innes <andrewi@gnu.org>
parents: 22300
diff changeset
121 SetErrorMode (SEM_FAILCRITICALERRORS);
5d7a43e8b133 (_start): Force system calls accessing unmounted devices to fail
Andrew Innes <andrewi@gnu.org>
parents: 22300
diff changeset
122
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123 /* Invoke the NT CRT startup routine now that our housecleaning
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
124 is finished. */
13423
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
125 #ifdef HAVE_NTGUI
15146
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
126 /* determine WinMain args like crt0.c does */
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
127 hinst = GetModuleHandle(NULL);
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
128 lpCmdLine = GetCommandLine();
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
129 nCmdShow = SW_SHOWDEFAULT;
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
130 #endif
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131 mainCRTStartup ();
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
132 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
133
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
134
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135 /* File handling. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
136
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
137 int
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
138 open_input_file (file_data *p_file, char *filename)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
139 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140 HANDLE file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141 HANDLE file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
142 void *file_base;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143 unsigned long size, upper_size;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL,
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
146 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
147 if (file == INVALID_HANDLE_VALUE)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
148 return FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
149
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
150 size = GetFileSize (file, &upper_size);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
151 file_mapping = CreateFileMapping (file, NULL, PAGE_READONLY,
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
152 0, size, NULL);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
153 if (!file_mapping)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
154 return FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
155
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
156 file_base = MapViewOfFile (file_mapping, FILE_MAP_READ, 0, 0, size);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
157 if (file_base == 0)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
158 return FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
159
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
160 p_file->name = filename;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
161 p_file->size = size;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162 p_file->file = file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
163 p_file->file_mapping = file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
164 p_file->file_base = file_base;
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
165
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
166 return TRUE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
168
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
169 int
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 open_output_file (file_data *p_file, char *filename, unsigned long size)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
172 HANDLE file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173 HANDLE file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174 void *file_base;
13423
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
175
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
176 file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
177 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
178 if (file == INVALID_HANDLE_VALUE)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
179 return FALSE;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
180
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
181 file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE,
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
182 0, size, NULL);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
183 if (!file_mapping)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
184 return FALSE;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
185
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
187 if (file_base == 0)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
188 return FALSE;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
189
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190 p_file->name = filename;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 p_file->size = size;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192 p_file->file = file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 p_file->file_mapping = file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194 p_file->file_base = file_base;
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
195
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
196 return TRUE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
198
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
199 /* Close the system structures associated with the given file. */
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
200 void
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 close_file_data (file_data *p_file)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
202 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
203 UnmapViewOfFile (p_file->file_base);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
204 CloseHandle (p_file->file_mapping);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
205 /* For the case of output files, set final size. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
206 SetFilePointer (p_file->file, p_file->size, NULL, FILE_BEGIN);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
207 SetEndOfFile (p_file->file);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
208 CloseHandle (p_file->file);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
209 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
210
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
211
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212 /* Routines to manipulate NT executable file sections. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
213
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
214 /* Return pointer to section header for named section. */
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
215 IMAGE_SECTION_HEADER *
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
216 find_section (char * name, IMAGE_NT_HEADERS * nt_header)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
217 {
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
218 PIMAGE_SECTION_HEADER section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
219 int i;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
220
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
221 section = IMAGE_FIRST_SECTION (nt_header);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
222
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
223 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
224 {
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
225 if (strcmp (section->Name, name) == 0)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
226 return section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
227 section++;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
228 }
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
229 return NULL;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
230 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
231
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
232 /* Return pointer to section header for section containing the given
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
233 relative virtual address. */
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
234 IMAGE_SECTION_HEADER *
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
235 rva_to_section (DWORD rva, IMAGE_NT_HEADERS * nt_header)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
236 {
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
237 PIMAGE_SECTION_HEADER section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
238 int i;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
239
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
240 section = IMAGE_FIRST_SECTION (nt_header);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
241
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
242 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
243 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
244 /* Some linkers (eg. the NT SDK linker I believe) swapped the
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
245 meaning of these two values - or rather, they ignored
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
246 VirtualSize entirely and always set it to zero. This affects
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
247 some very old exes (eg. gzip dated Dec 1993). Since
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
248 w32_executable_type relies on this function to work reliably,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
249 we need to cope with this. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
250 DWORD real_size = max (section->SizeOfRawData,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
251 section->Misc.VirtualSize);
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
252 if (rva >= section->VirtualAddress
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
253 && rva < section->VirtualAddress + real_size)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
254 return section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
255 section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
256 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
257 return NULL;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
258 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
259
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
260 /* Return pointer to section header for section containing the given
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
261 offset in its raw data area. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
262 IMAGE_SECTION_HEADER *
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
263 offset_to_section (DWORD offset, IMAGE_NT_HEADERS * nt_header)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
264 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
265 PIMAGE_SECTION_HEADER section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
266 int i;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
267
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
268 section = IMAGE_FIRST_SECTION (nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
269
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
270 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
271 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
272 if (offset >= section->PointerToRawData
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
273 && offset < section->PointerToRawData + section->SizeOfRawData)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
274 return section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
275 section++;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
276 }
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
277 return NULL;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
278 }
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
279
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
280 /* Return offset to an object in dst, given offset in src. We assume
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
281 there is at least one section in both src and dst images, and that
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
282 the some sections may have been added to dst (after sections in src). */
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
283 DWORD
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
284 relocate_offset (DWORD offset,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
285 IMAGE_NT_HEADERS * src_nt_header,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
286 IMAGE_NT_HEADERS * dst_nt_header)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
287 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
288 PIMAGE_SECTION_HEADER src_section = IMAGE_FIRST_SECTION (src_nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
289 PIMAGE_SECTION_HEADER dst_section = IMAGE_FIRST_SECTION (dst_nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
290 int i = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
291
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
292 while (offset >= src_section->PointerToRawData)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
293 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
294 if (offset < src_section->PointerToRawData + src_section->SizeOfRawData)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
295 break;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
296 i++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
297 if (i == src_nt_header->FileHeader.NumberOfSections)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
298 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
299 /* Handle offsets after the last section. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
300 dst_section = IMAGE_FIRST_SECTION (dst_nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
301 dst_section += dst_nt_header->FileHeader.NumberOfSections - 1;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
302 while (dst_section->PointerToRawData == 0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
303 dst_section--;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
304 while (src_section->PointerToRawData == 0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
305 src_section--;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
306 return offset
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
307 + (dst_section->PointerToRawData + dst_section->SizeOfRawData)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
308 - (src_section->PointerToRawData + src_section->SizeOfRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
309 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
310 src_section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
311 dst_section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
312 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
313 return offset +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
314 (dst_section->PointerToRawData - src_section->PointerToRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
315 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
316
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
317 #define OFFSET_TO_RVA(offset, section) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
318 (section->VirtualAddress + ((DWORD)(offset) - section->PointerToRawData))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
319
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
320 #define RVA_TO_OFFSET(rva, section) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
321 (section->PointerToRawData + ((DWORD)(rva) - section->VirtualAddress))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
322
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
323 #define RVA_TO_SECTION_OFFSET(rva, section) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
324 ((DWORD)(rva) - section->VirtualAddress)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
325
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
326 /* Convert address in executing image to RVA. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
327 #define PTR_TO_RVA(ptr) ((DWORD)(ptr) - (DWORD) GetModuleHandle (NULL))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
328
63086
96407b684751 (RVA_TO_PTR): Moved here from w32heap.h.
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
329 #define RVA_TO_PTR(var,section,filedata) \
96407b684751 (RVA_TO_PTR): Moved here from w32heap.h.
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
330 ((void *)(RVA_TO_OFFSET(var,section) + (filedata).file_base))
96407b684751 (RVA_TO_PTR): Moved here from w32heap.h.
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
331
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
332 #define PTR_TO_OFFSET(ptr, pfile_data) \
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
333 ((unsigned char *)(ptr) - (pfile_data)->file_base)
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
334
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
335 #define OFFSET_TO_PTR(offset, pfile_data) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
336 ((pfile_data)->file_base + (DWORD)(offset))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
337
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
338
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
339 /* Flip through the executable and cache the info necessary for dumping. */
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
340 void
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
341 get_section_info (file_data *p_infile)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
342 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
343 PIMAGE_DOS_HEADER dos_header;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
344 PIMAGE_NT_HEADERS nt_header;
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
345 PIMAGE_SECTION_HEADER section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
346 int overlap;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
347
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
348 dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
349 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
350 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
351 printf ("Unknown EXE header in %s...bailing.\n", p_infile->name);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
352 exit (1);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
353 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
354 nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) +
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
355 dos_header->e_lfanew);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
356 if (nt_header == NULL)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
357 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
358 printf ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n",
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
359 p_infile->name);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
360 exit (1);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
361 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
362
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
363 /* Check the NT header signature ... */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
364 if (nt_header->Signature != IMAGE_NT_SIGNATURE)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
365 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
366 printf ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n",
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
367 nt_header->Signature, p_infile->name);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
368 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
369 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
370
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
371 /* Locate the ".data" and ".bss" sections for Emacs. (Note that the
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
372 actual section names are probably different from these, and might
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
373 actually be the same section.)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
374
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
375 We do this as follows: first we determine the virtual address
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
376 ranges in this process for the data and bss variables that we wish
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
377 to preserve. Then we map these VAs to the section entries in the
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
378 source image. Finally, we determine the new size of the raw data
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
379 area for the bss section, so we can make the new image the correct
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
380 size. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
381
24669
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
382 /* We arrange for the Emacs initialized data to be in a separate
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
383 section if possible, because we cannot rely on my_begdata and
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
384 my_edata marking out the full extent of the initialized data, at
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
385 least on the Alpha where the linker freely reorders variables
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
386 across libraries. If we can arrange for this, all we need to do is
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
387 find the start and size of the EMDATA section. */
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
388 data_section = find_section ("EMDATA", nt_header);
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
389 if (data_section)
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
390 {
24669
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
391 data_start = (char *) nt_header->OptionalHeader.ImageBase +
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
392 data_section->VirtualAddress;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
393 data_size = data_section->Misc.VirtualSize;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
394 }
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
395 else
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
396 {
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
397 /* Fallback on the old method if compiler doesn't support the
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
398 data_set #pragma (or its equivalent). */
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
399 data_start = my_begdata;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
400 data_size = my_edata - my_begdata;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
401 data_section = rva_to_section (PTR_TO_RVA (my_begdata), nt_header);
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
402 if (data_section != rva_to_section (PTR_TO_RVA (my_edata), nt_header))
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
403 {
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
404 printf ("Initialized data is not in a single section...bailing\n");
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
405 exit (1);
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
406 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
407 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
408
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
409 /* As noted in lastfile.c, the Alpha (but not the Intel) MSVC linker
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
410 globally segregates all static and public bss data (ie. across all
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
411 linked modules, not just per module), so we must take both static
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
412 and public bss areas into account to determine the true extent of
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
413 the bss area used by Emacs.
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
414
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
415 To be strictly correct, we dump the static and public bss areas
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
416 used by Emacs separately if non-overlapping (since otherwise we are
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
417 dumping bss data belonging to system libraries, eg. the static bss
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
418 system data on the Alpha). */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
419
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
420 bss_start = my_begbss;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
421 bss_size = my_endbss - my_begbss;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
422 bss_section = rva_to_section (PTR_TO_RVA (my_begbss), nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
423 if (bss_section != rva_to_section (PTR_TO_RVA (my_endbss), nt_header))
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
424 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
425 printf ("Uninitialized data is not in a single section...bailing\n");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
426 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
427 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
428 /* Compute how much the .bss section's raw data will grow. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
429 extra_bss_size =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
430 ROUND_UP (RVA_TO_SECTION_OFFSET (PTR_TO_RVA (my_endbss), bss_section),
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
431 nt_header->OptionalHeader.FileAlignment)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
432 - bss_section->SizeOfRawData;
12454
3f4da17a7cd8 (get_section_info): Set the end of the data region
Geoff Voelker <voelker@cs.washington.edu>
parents: 12245
diff changeset
433
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
434 bss_start_static = my_begbss_static;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
435 bss_size_static = my_endbss_static - my_begbss_static;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
436 bss_section_static = rva_to_section (PTR_TO_RVA (my_begbss_static), nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
437 if (bss_section_static != rva_to_section (PTR_TO_RVA (my_endbss_static), nt_header))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
438 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
439 printf ("Uninitialized static data is not in a single section...bailing\n");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
440 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
441 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
442 /* Compute how much the static .bss section's raw data will grow. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
443 extra_bss_size_static =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
444 ROUND_UP (RVA_TO_SECTION_OFFSET (PTR_TO_RVA (my_endbss_static), bss_section_static),
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
445 nt_header->OptionalHeader.FileAlignment)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
446 - bss_section_static->SizeOfRawData;
12454
3f4da17a7cd8 (get_section_info): Set the end of the data region
Geoff Voelker <voelker@cs.washington.edu>
parents: 12245
diff changeset
447
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
448 /* Combine the bss sections into one if they overlap. */
24806
a67730c51617 (get_section_info) [_ALPHA_]: Force as much bss data
Andrew Innes <andrewi@gnu.org>
parents: 24669
diff changeset
449 #ifdef _ALPHA_
a67730c51617 (get_section_info) [_ALPHA_]: Force as much bss data
Andrew Innes <andrewi@gnu.org>
parents: 24669
diff changeset
450 overlap = 1; /* force all bss data to be dumped */
a67730c51617 (get_section_info) [_ALPHA_]: Force as much bss data
Andrew Innes <andrewi@gnu.org>
parents: 24669
diff changeset
451 #else
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
452 overlap = 0;
24806
a67730c51617 (get_section_info) [_ALPHA_]: Force as much bss data
Andrew Innes <andrewi@gnu.org>
parents: 24669
diff changeset
453 #endif
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
454 if (bss_start < bss_start_static)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
455 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
456 if (bss_start_static < bss_start + bss_size)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
457 overlap = 1;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
458 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
459 else
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
460 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
461 if (bss_start < bss_start_static + bss_size_static)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
462 overlap = 1;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
463 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
464 if (overlap)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
465 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
466 if (bss_section != bss_section_static)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
467 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
468 printf ("BSS data not in a single section...bailing\n");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
469 exit (1);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
470 }
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
471 bss_start = min (bss_start, bss_start_static);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
472 bss_size = max (my_endbss, my_endbss_static) - bss_start;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
473 bss_section_static = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
474 extra_bss_size_static = 0;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
475 }
13830
8d30151f4acb (get_bss_info_from_map_file): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 13423
diff changeset
476
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
477 heap_section = rva_to_section (PTR_TO_RVA (get_heap_start ()), nt_header);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
478 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
479
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
480
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
481 /* The dump routines. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
482
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
483 void
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
484 copy_executable_and_dump_data (file_data *p_infile,
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
485 file_data *p_outfile)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
486 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
487 unsigned char *dst, *dst_save;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
488 PIMAGE_DOS_HEADER dos_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
489 PIMAGE_NT_HEADERS nt_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
490 PIMAGE_NT_HEADERS dst_nt_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
491 PIMAGE_SECTION_HEADER section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
492 PIMAGE_SECTION_HEADER dst_section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
493 DWORD offset;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
494 int i;
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
495 int be_verbose = GetEnvironmentVariable ("DEBUG_DUMP", NULL, 0) > 0;
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
496
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
497 #define COPY_CHUNK(message, src, size, verbose) \
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
498 do { \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
499 unsigned char *s = (void *)(src); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
500 unsigned long count = (size); \
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
501 if (verbose) \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
502 { \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
503 printf ("%s\n", (message)); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
504 printf ("\t0x%08x Offset in input file.\n", s - p_infile->file_base); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
505 printf ("\t0x%08x Offset in output file.\n", dst - p_outfile->file_base); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
506 printf ("\t0x%08x Size in bytes.\n", count); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
507 } \
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
508 memcpy (dst, s, count); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
509 dst += count; \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
510 } while (0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
511
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
512 #define COPY_PROC_CHUNK(message, src, size, verbose) \
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
513 do { \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
514 unsigned char *s = (void *)(src); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
515 unsigned long count = (size); \
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
516 if (verbose) \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
517 { \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
518 printf ("%s\n", (message)); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
519 printf ("\t0x%08x Address in process.\n", s); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
520 printf ("\t0x%08x Offset in output file.\n", dst - p_outfile->file_base); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
521 printf ("\t0x%08x Size in bytes.\n", count); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
522 } \
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
523 memcpy (dst, s, count); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
524 dst += count; \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
525 } while (0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
526
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
527 #define DST_TO_OFFSET() PTR_TO_OFFSET (dst, p_outfile)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
528 #define ROUND_UP_DST(align) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
529 (dst = p_outfile->file_base + ROUND_UP (DST_TO_OFFSET (), (align)))
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
530 #define ROUND_UP_DST_AND_ZERO(align) \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
531 do { \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
532 unsigned char *newdst = p_outfile->file_base \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
533 + ROUND_UP (DST_TO_OFFSET (), (align)); \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
534 /* Zero the alignment slop; it may actually initialize real data. */ \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
535 memset (dst, 0, newdst - dst); \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
536 dst = newdst; \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
537 } while (0)
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
538
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
539 /* Copy the source image sequentially, ie. section by section after
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
540 copying the headers and section table, to simplify the process of
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
541 dumping the raw data for the bss and heap sections.
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
542
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
543 Note that dst is updated implicitly by each COPY_CHUNK. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
544
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
545 dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
546 nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) +
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
547 dos_header->e_lfanew);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
548 section = IMAGE_FIRST_SECTION (nt_header);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
549
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
550 dst = (unsigned char *) p_outfile->file_base;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
551
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
552 COPY_CHUNK ("Copying DOS header...", dos_header,
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
553 (DWORD) nt_header - (DWORD) dos_header, be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
554 dst_nt_header = (PIMAGE_NT_HEADERS) dst;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
555 COPY_CHUNK ("Copying NT header...", nt_header,
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
556 (DWORD) section - (DWORD) nt_header, be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
557 dst_section = (PIMAGE_SECTION_HEADER) dst;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
558 COPY_CHUNK ("Copying section table...", section,
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
559 nt_header->FileHeader.NumberOfSections * sizeof (*section),
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
560 be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
561
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
562 /* Align the first section's raw data area, and set the header size
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
563 field accordingly. */
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
564 ROUND_UP_DST_AND_ZERO (dst_nt_header->OptionalHeader.FileAlignment);
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
565 dst_nt_header->OptionalHeader.SizeOfHeaders = DST_TO_OFFSET ();
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
566
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
567 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
568 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
569 char msg[100];
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
570 /* Windows section names are fixed 8-char strings, only
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
571 zero-terminated if the name is shorter than 8 characters. */
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
572 sprintf (msg, "Copying raw data for %.8s...", section->Name);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
573
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
574 dst_save = dst;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
575
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
576 /* Update the file-relative offset for this section's raw data (if
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
577 it has any) in case things have been relocated; we will update
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
578 the other offsets below once we know where everything is. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
579 if (dst_section->PointerToRawData)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
580 dst_section->PointerToRawData = DST_TO_OFFSET ();
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
581
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
582 /* Can always copy the original raw data. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
583 COPY_CHUNK
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
584 (msg, OFFSET_TO_PTR (section->PointerToRawData, p_infile),
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
585 section->SizeOfRawData, be_verbose);
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
586 /* Ensure alignment slop is zeroed. */
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
587 ROUND_UP_DST_AND_ZERO (dst_nt_header->OptionalHeader.FileAlignment);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
588
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
589 /* Note that various sections below may be aliases. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
590 if (section == data_section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
591 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
592 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
593 + RVA_TO_SECTION_OFFSET (PTR_TO_RVA (data_start), dst_section);
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
594 COPY_PROC_CHUNK ("Dumping initialized data...",
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
595 data_start, data_size, be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
596 dst = dst_save + dst_section->SizeOfRawData;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
597 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
598 if (section == bss_section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
599 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
600 /* Dump contents of bss variables, adjusting the section's raw
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
601 data size as necessary. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
602 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
603 + RVA_TO_SECTION_OFFSET (PTR_TO_RVA (bss_start), dst_section);
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
604 COPY_PROC_CHUNK ("Dumping bss data...", bss_start,
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
605 bss_size, be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
606 ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
607 dst_section->PointerToRawData = PTR_TO_OFFSET (dst_save, p_outfile);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
608 /* Determine new size of raw data area. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
609 dst = max (dst, dst_save + dst_section->SizeOfRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
610 dst_section->SizeOfRawData = dst - dst_save;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
611 dst_section->Characteristics &= ~IMAGE_SCN_CNT_UNINITIALIZED_DATA;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
612 dst_section->Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
613 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
614 if (section == bss_section_static)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
615 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
616 /* Dump contents of static bss variables, adjusting the
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
617 section's raw data size as necessary. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
618 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
619 + RVA_TO_SECTION_OFFSET (PTR_TO_RVA (bss_start_static), dst_section);
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
620 COPY_PROC_CHUNK ("Dumping static bss data...", bss_start_static,
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
621 bss_size_static, be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
622 ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
623 dst_section->PointerToRawData = PTR_TO_OFFSET (dst_save, p_outfile);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
624 /* Determine new size of raw data area. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
625 dst = max (dst, dst_save + dst_section->SizeOfRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
626 dst_section->SizeOfRawData = dst - dst_save;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
627 dst_section->Characteristics &= ~IMAGE_SCN_CNT_UNINITIALIZED_DATA;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
628 dst_section->Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
629 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
630 if (section == heap_section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
631 {
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
632 DWORD heap_start = (DWORD) get_heap_start ();
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
633 DWORD heap_size = get_committed_heap_size ();
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
634
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
635 /* Dump the used portion of the predump heap, adjusting the
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
636 section's size to the appropriate size. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
637 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
638 + RVA_TO_SECTION_OFFSET (PTR_TO_RVA (heap_start), dst_section);
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
639 COPY_PROC_CHUNK ("Dumping heap...", heap_start, heap_size,
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
640 be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
641 ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
642 dst_section->PointerToRawData = PTR_TO_OFFSET (dst_save, p_outfile);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
643 /* Determine new size of raw data area. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
644 dst = max (dst, dst_save + dst_section->SizeOfRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
645 dst_section->SizeOfRawData = dst - dst_save;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
646 /* Reduce the size of the heap section to fit (must be last
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
647 section). */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
648 dst_nt_header->OptionalHeader.SizeOfImage -=
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
649 dst_section->Misc.VirtualSize
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
650 - ROUND_UP (dst_section->SizeOfRawData,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
651 dst_nt_header->OptionalHeader.SectionAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
652 dst_section->Misc.VirtualSize =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
653 ROUND_UP (dst_section->SizeOfRawData,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
654 dst_nt_header->OptionalHeader.SectionAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
655 dst_section->Characteristics &= ~IMAGE_SCN_CNT_UNINITIALIZED_DATA;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
656 dst_section->Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
657 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
658
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
659 /* Align the section's raw data area. */
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
660 ROUND_UP_DST (dst_nt_header->OptionalHeader.FileAlignment);
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
661
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
662 section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
663 dst_section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
664 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
665
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
666 /* Copy remainder of source image. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
667 do
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
668 section--;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
669 while (section->PointerToRawData == 0);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
670 offset = ROUND_UP (section->PointerToRawData + section->SizeOfRawData,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
671 nt_header->OptionalHeader.FileAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
672 COPY_CHUNK
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
673 ("Copying remainder of executable...",
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
674 OFFSET_TO_PTR (offset, p_infile),
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
675 p_infile->size - offset, be_verbose);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
676
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
677 /* Final size for new image. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
678 p_outfile->size = DST_TO_OFFSET ();
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
679
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
680 /* Now patch up remaining file-relative offsets. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
681 section = IMAGE_FIRST_SECTION (nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
682 dst_section = IMAGE_FIRST_SECTION (dst_nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
683
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
684 #define ADJUST_OFFSET(var) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
685 do { \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
686 if ((var) != 0) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
687 (var) = relocate_offset ((var), nt_header, dst_nt_header); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
688 } while (0)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
689
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
690 dst_nt_header->OptionalHeader.SizeOfInitializedData = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
691 dst_nt_header->OptionalHeader.SizeOfUninitializedData = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
692 for (i = 0; i < dst_nt_header->FileHeader.NumberOfSections; i++)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
693 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
694 /* Recompute data sizes for completeness. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
695 if (dst_section[i].Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
696 dst_nt_header->OptionalHeader.SizeOfInitializedData +=
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
697 ROUND_UP (dst_section[i].Misc.VirtualSize, dst_nt_header->OptionalHeader.FileAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
698 else if (dst_section[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
699 dst_nt_header->OptionalHeader.SizeOfUninitializedData +=
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
700 ROUND_UP (dst_section[i].Misc.VirtualSize, dst_nt_header->OptionalHeader.FileAlignment);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
701
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
702 ADJUST_OFFSET (dst_section[i].PointerToLinenumbers);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
703 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
704
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
705 ADJUST_OFFSET (dst_nt_header->FileHeader.PointerToSymbolTable);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
706
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
707 /* Update offsets in debug directory entries. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
708 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
709 IMAGE_DATA_DIRECTORY debug_dir =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
710 dst_nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
711 PIMAGE_DEBUG_DIRECTORY debug_entry;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
712
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
713 section = rva_to_section (debug_dir.VirtualAddress, dst_nt_header);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
714 if (section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
715 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
716 debug_entry = (PIMAGE_DEBUG_DIRECTORY)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
717 (RVA_TO_OFFSET (debug_dir.VirtualAddress, section) + p_outfile->file_base);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
718 debug_dir.Size /= sizeof (IMAGE_DEBUG_DIRECTORY);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
719
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
720 for (i = 0; i < debug_dir.Size; i++, debug_entry++)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
721 ADJUST_OFFSET (debug_entry->PointerToRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
722 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
723 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
724 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
725
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
726
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
727 /* Dump out .data and .bss sections into a new executable. */
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
728 void
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
729 unexec (char *new_name, char *old_name, void *start_data, void *start_bss,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
730 void *entry_address)
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
731 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
732 file_data in_file, out_file;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
733 char out_filename[MAX_PATH], in_filename[MAX_PATH];
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
734 unsigned long size;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
735 char *p;
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
736 char *q;
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
737
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
738 /* Ignore old_name, and get our actual location from the OS. */
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
739 if (!GetModuleFileName (NULL, in_filename, MAX_PATH))
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
740 abort ();
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
741 dostounix_filename (in_filename);
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
742 strcpy (out_filename, in_filename);
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
743
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
744 /* Change the base of the output filename to match the requested name. */
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
745 if ((p = strrchr (out_filename, '/')) == NULL)
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
746 abort ();
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
747 /* The filenames have already been expanded, and will be in Unix
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
748 format, so it is safe to expect an absolute name. */
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
749 if ((q = strrchr (new_name, '/')) == NULL)
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
750 abort ();
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
751 strcpy (p, q);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
752
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
753 /* Make sure that the output filename has the ".exe" extension...patch
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
754 it up if not. */
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
755 p = out_filename + strlen (out_filename) - 4;
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
756 if (strcmp (p, ".exe"))
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
757 strcat (out_filename, ".exe");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
758
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
759 printf ("Dumping from %s\n", in_filename);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
760 printf (" to %s\n", out_filename);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
761
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
762 /* We need to round off our heap to NT's page size. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
763 round_heap (get_page_size ());
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
764
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
765 /* Open the undumped executable file. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
766 if (!open_input_file (&in_file, in_filename))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
767 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
768 printf ("Failed to open %s (%d)...bailing.\n",
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
769 in_filename, GetLastError ());
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
770 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
771 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
772
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
773 /* Get the interesting section info, like start and size of .bss... */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
774 get_section_info (&in_file);
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
775
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
776 /* The size of the dumped executable is the size of the original
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
777 executable plus the size of the heap and the size of the .bss section. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
778 size = in_file.size +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
779 get_committed_heap_size () +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
780 extra_bss_size +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
781 extra_bss_size_static;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
782 if (!open_output_file (&out_file, out_filename, size))
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
783 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
784 printf ("Failed to open %s (%d)...bailing.\n",
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
785 out_filename, GetLastError ());
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
786 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
787 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
788
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
789 /* Set the flag (before dumping). */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
790 using_dynamic_heap = TRUE;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
791
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
792 copy_executable_and_dump_data (&in_file, &out_file);
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
793
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
794 /* Patch up header fields; profiler is picky about this. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
795 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
796 PIMAGE_DOS_HEADER dos_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
797 PIMAGE_NT_HEADERS nt_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
798 HANDLE hImagehelp = LoadLibrary ("imagehlp.dll");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
799 DWORD headersum;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
800 DWORD checksum;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
801
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
802 dos_header = (PIMAGE_DOS_HEADER) out_file.file_base;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
803 nt_header = (PIMAGE_NT_HEADERS) ((char *) dos_header + dos_header->e_lfanew);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
804
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
805 nt_header->OptionalHeader.CheckSum = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
806 // nt_header->FileHeader.TimeDateStamp = time (NULL);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
807 // dos_header->e_cp = size / 512;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
808 // nt_header->OptionalHeader.SizeOfImage = size;
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
809
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
810 pfnCheckSumMappedFile = (void *) GetProcAddress (hImagehelp, "CheckSumMappedFile");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
811 if (pfnCheckSumMappedFile)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
812 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
813 // nt_header->FileHeader.TimeDateStamp = time (NULL);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
814 pfnCheckSumMappedFile (out_file.file_base,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
815 out_file.size,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
816 &headersum,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
817 &checksum);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
818 nt_header->OptionalHeader.CheckSum = checksum;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
819 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
820 FreeLibrary (hImagehelp);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
821 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
822
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
823 close_file_data (&in_file);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
824 close_file_data (&out_file);
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
825 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
826
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
827 /* eof */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51124
diff changeset
828
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51124
diff changeset
829 /* arch-tag: fe1d3d1c-ef88-4917-ab22-f12ab16b3254
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51124
diff changeset
830 (do not change this comment) */