annotate src/unexw32.c @ 112313:a68c30a5d799

* configure: Regenerate.
author Paul Eggert <eggert@cs.ucla.edu>
date Sat, 08 Jan 2011 23:40:50 -0800
parents 99084f50aa8e
children 417b1e4d63cd
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.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
2 Copyright (C) 1994, 2001, 2002, 2003, 2004, 2005,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 100951
diff changeset
3 2006, 2007, 2008, 2009, 2010 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
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
7 GNU Emacs is free software: you can redistribute it and/or modify
14186
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
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
10 (at your option) 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
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
20 /*
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
21 Geoff Voelker (voelker@cs.washington.edu) 8-12-94
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
22 */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
24 #include <config.h>
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
25
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
26 #include <stdio.h>
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27 #include <fcntl.h>
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
28 #include <time.h>
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29 #include <windows.h>
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
31 /* 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
32 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
33
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
34 PIMAGE_NT_HEADERS
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
35 (__stdcall * pfnCheckSumMappedFile) (LPVOID BaseAddress,
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
36 DWORD FileLength,
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
37 LPDWORD HeaderSum,
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
38 LPDWORD CheckSum);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
39
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
40 extern BOOL ctrl_c_handler (unsigned long type);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
41
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
42 extern char my_begdata[];
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
43 extern char my_edata[];
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
44 extern char my_begbss[];
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
45 extern char my_endbss[];
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
46 extern char *my_begbss_static;
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
47 extern char *my_endbss_static;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
48
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
49 #include "w32heap.h"
18506
bcc706aedcea Add pragma to force zero initialized
Geoff Voelker <voelker@cs.washington.edu>
parents: 16593
diff changeset
50
21456
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
51 #undef min
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
52 #undef max
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
53 #define min(x, y) (((x) < (y)) ? (x) : (y))
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
54 #define max(x, y) (((x) > (y)) ? (x) : (y))
c0496e62b737 (min, max): Define as macros.
Karl Heuer <kwzh@gnu.org>
parents: 19703
diff changeset
55
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
56 /* Basically, our "initialized" flag. */
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
57 BOOL using_dynamic_heap = FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
58
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
59 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
60 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
61 void close_file_data (file_data *p_file);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
62
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
63 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
64 void copy_executable_and_dump_data (file_data *, file_data *);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
65 void dump_bss_and_heap (file_data *p_infile, file_data *p_outfile);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
66
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
67 /* 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
68 PIMAGE_SECTION_HEADER data_section;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
69 PCHAR data_start = 0;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
70 DWORD data_size = 0;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
71
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
72 /* 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
73 PIMAGE_SECTION_HEADER bss_section;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
74 PCHAR bss_start = 0;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
75 DWORD bss_size = 0;
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
76 DWORD extra_bss_size = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
77 /* 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
78 PIMAGE_SECTION_HEADER bss_section_static;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
79 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
80 DWORD bss_size_static = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
81 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
82
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
83 PIMAGE_SECTION_HEADER heap_section;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
84
13423
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
85 #ifdef HAVE_NTGUI
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
86 HINSTANCE hinst = NULL;
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
87 HINSTANCE hprevinst = NULL;
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
88 LPSTR lpCmdLine = "";
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
89 int nCmdShow = 0;
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
90 #endif /* HAVE_NTGUI */
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
91
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
92 /* Startup code for running on NT. When we are running as the dumped
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
93 version, we need to bootstrap our heap and .bss section into our
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
94 address space before we can actually hand off control to the startup
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
95 code supplied by NT (primarily because that code relies upon malloc ()). */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
96 void
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
97 _start (void)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
98 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
99 extern void mainCRTStartup (void);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
100
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
101 #if 1
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
102 /* 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
103 running under the MSVC profiler. */
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
104 if (GetEnvironmentVariable ("EMACS_DEBUG", NULL, 0) > 0)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
105 DebugBreak ();
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
106 #endif
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
107
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
108 /* Cache system info, e.g., the NT page size. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
109 cache_system_info ();
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
110
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
111 /* 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
112 init_heap ();
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
113
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
114 /* This prevents ctrl-c's in shells running while we're suspended from
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115 having us exit. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
116 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ctrl_c_handler, TRUE);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
117
23948
5d7a43e8b133 (_start): Force system calls accessing unmounted devices to fail
Andrew Innes <andrewi@gnu.org>
parents: 22300
diff changeset
118 /* 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
119 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
120 SetErrorMode (SEM_FAILCRITICALERRORS);
5d7a43e8b133 (_start): Force system calls accessing unmounted devices to fail
Andrew Innes <andrewi@gnu.org>
parents: 22300
diff changeset
121
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
122 /* Invoke the NT CRT startup routine now that our housecleaning
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123 is finished. */
13423
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
124 #ifdef HAVE_NTGUI
15146
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
125 /* determine WinMain args like crt0.c does */
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
126 hinst = GetModuleHandle(NULL);
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
127 lpCmdLine = GetCommandLine();
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
128 nCmdShow = SW_SHOWDEFAULT;
be6560506cce (WinMain): Function removed.
Geoff Voelker <voelker@cs.washington.edu>
parents: 14812
diff changeset
129 #endif
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
130 mainCRTStartup ();
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131 }
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 /* File handling. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
136 int
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
137 open_input_file (file_data *p_file, char *filename)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
138 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
139 HANDLE file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140 HANDLE file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141 void *file_base;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
142 unsigned long size, upper_size;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144 file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL,
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
146 if (file == INVALID_HANDLE_VALUE)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
147 return FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
148
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
149 size = GetFileSize (file, &upper_size);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
150 file_mapping = CreateFileMapping (file, NULL, PAGE_READONLY,
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
151 0, size, NULL);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
152 if (!file_mapping)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
153 return FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
154
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
155 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
156 if (file_base == 0)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
157 return FALSE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
158
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
159 p_file->name = filename;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
160 p_file->size = size;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
161 p_file->file = file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162 p_file->file_mapping = file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
163 p_file->file_base = file_base;
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
164
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
165 return TRUE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
168 int
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
169 open_output_file (file_data *p_file, char *filename, unsigned long size)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 HANDLE file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
172 HANDLE file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173 void *file_base;
13423
eefa4f720371 [HAVE_NTGUI] (WinMain): New procedure.
Geoff Voelker <voelker@cs.washington.edu>
parents: 12454
diff changeset
174
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175 file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
176 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
177 if (file == INVALID_HANDLE_VALUE)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
178 return FALSE;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
179
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
180 file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE,
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
181 0, size, NULL);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
182 if (!file_mapping)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
183 return FALSE;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
184
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 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
186 if (file_base == 0)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
187 return FALSE;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
188
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189 p_file->name = filename;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190 p_file->size = size;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 p_file->file = file;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192 p_file->file_mapping = file_mapping;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 p_file->file_base = file_base;
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
194
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
195 return TRUE;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
198 /* 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
199 void
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
200 close_file_data (file_data *p_file)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
202 UnmapViewOfFile (p_file->file_base);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
203 CloseHandle (p_file->file_mapping);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
204 /* 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
205 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
206 SetEndOfFile (p_file->file);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
207 CloseHandle (p_file->file);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
208 }
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 /* Routines to manipulate NT executable file sections. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
213 /* 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
214 IMAGE_SECTION_HEADER *
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
215 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
216 {
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
217 PIMAGE_SECTION_HEADER section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
218 int i;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
219
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
220 section = IMAGE_FIRST_SECTION (nt_header);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
221
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
222 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
223 {
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
224 if (strcmp (section->Name, name) == 0)
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
225 return section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
226 section++;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
227 }
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
228 return NULL;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
229 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
230
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
231 /* 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
232 relative virtual address. */
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
233 IMAGE_SECTION_HEADER *
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
234 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
235 {
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
236 PIMAGE_SECTION_HEADER section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
237 int i;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
238
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
239 section = IMAGE_FIRST_SECTION (nt_header);
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
240
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
241 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
242 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
243 /* 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
244 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
245 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
246 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
247 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
248 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
249 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
250 section->Misc.VirtualSize);
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
251 if (rva >= section->VirtualAddress
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
252 && rva < section->VirtualAddress + real_size)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
253 return section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
254 section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
255 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
256 return NULL;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
257 }
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 /* 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
260 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
261 IMAGE_SECTION_HEADER *
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
262 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
263 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
264 PIMAGE_SECTION_HEADER section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
265 int i;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
266
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
267 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
268
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
269 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
270 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
271 if (offset >= section->PointerToRawData
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
272 && offset < section->PointerToRawData + section->SizeOfRawData)
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
273 return section;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
274 section++;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
275 }
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
276 return NULL;
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
277 }
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
278
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
279 /* 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
280 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
281 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
282 DWORD
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
283 relocate_offset (DWORD offset,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
284 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
285 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
286 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
287 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
288 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
289 int i = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
290
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
291 while (offset >= src_section->PointerToRawData)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
292 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
293 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
294 break;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
295 i++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
296 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
297 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
298 /* 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
299 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
300 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
301 while (dst_section->PointerToRawData == 0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
302 dst_section--;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
303 while (src_section->PointerToRawData == 0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
304 src_section--;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
305 return offset
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
306 + (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
307 - (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
308 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
309 src_section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
310 dst_section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
311 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
312 return offset +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
313 (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
314 }
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 #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
317 (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
318
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
319 #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
320 (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
321
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
322 #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
323 ((DWORD)(rva) - section->VirtualAddress)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
324
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
325 /* 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
326 #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
327
63086
96407b684751 (RVA_TO_PTR): Moved here from w32heap.h.
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
328 #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
329 ((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
330
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
331 #define PTR_TO_OFFSET(ptr, pfile_data) \
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
332 ((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
333
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
334 #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
335 ((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
336
19703
9fa57c73882d Include config.h and time.h.
Geoff Voelker <voelker@cs.washington.edu>
parents: 18506
diff changeset
337
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
338 /* 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
339 void
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
340 get_section_info (file_data *p_infile)
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
341 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
342 PIMAGE_DOS_HEADER dos_header;
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
343 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
344 PIMAGE_SECTION_HEADER section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
345 int overlap;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
346
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
347 dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
348 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
349 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
350 printf ("Unknown EXE header in %s...bailing.\n", p_infile->name);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
351 exit (1);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
352 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
353 nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) +
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
354 dos_header->e_lfanew);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
355 if (nt_header == NULL)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
356 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
357 printf ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n",
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
358 p_infile->name);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
359 exit (1);
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
360 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
361
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
362 /* Check the NT header signature ... */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
363 if (nt_header->Signature != IMAGE_NT_SIGNATURE)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
364 {
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
365 printf ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n",
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
366 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
367 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
368 }
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 /* 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
371 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
372 actually be the same section.)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
373
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
374 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
375 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
376 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
377 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
378 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
379 size. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
380
24669
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
381 /* 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
382 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
383 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
384 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
385 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
386 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
387 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
388 if (data_section)
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
389 {
24669
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
390 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
391 data_section->VirtualAddress;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
392 data_size = data_section->Misc.VirtualSize;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
393 }
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
394 else
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
395 {
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
396 /* 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
397 data_set #pragma (or its equivalent). */
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
398 data_start = my_begdata;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
399 data_size = my_edata - my_begdata;
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
400 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
401 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
402 {
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
403 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
404 exit (1);
66df82aa955e (get_section_info): Dump back the entire EMDATA
Andrew Innes <andrewi@gnu.org>
parents: 24237
diff changeset
405 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
406 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
407
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
408 /* 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
409 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
410 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
411 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
412 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
413
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
414 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
415 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
416 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
417 system data on the Alpha). */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
418
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
419 bss_start = my_begbss;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
420 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
421 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
422 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
423 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
424 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
425 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
426 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
427 /* 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
428 extra_bss_size =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
429 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
430 nt_header->OptionalHeader.FileAlignment)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
431 - 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
432
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
433 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
434 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
435 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
436 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
437 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
438 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
439 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
440 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
441 /* 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
442 extra_bss_size_static =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
443 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
444 nt_header->OptionalHeader.FileAlignment)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
445 - 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
446
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
447 /* 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
448 #ifdef _ALPHA_
a67730c51617 (get_section_info) [_ALPHA_]: Force as much bss data
Andrew Innes <andrewi@gnu.org>
parents: 24669
diff changeset
449 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
450 #else
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
451 overlap = 0;
24806
a67730c51617 (get_section_info) [_ALPHA_]: Force as much bss data
Andrew Innes <andrewi@gnu.org>
parents: 24669
diff changeset
452 #endif
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
453 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
454 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
455 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
456 overlap = 1;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
457 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
458 else
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
459 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
460 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
461 overlap = 1;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
462 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
463 if (overlap)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
464 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
465 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
466 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
467 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
468 exit (1);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
469 }
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
470 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
471 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
472 bss_section_static = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
473 extra_bss_size_static = 0;
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
474 }
13830
8d30151f4acb (get_bss_info_from_map_file): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 13423
diff changeset
475
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
476 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
477 }
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 /* The dump routines. */
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
481
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
482 void
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
483 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
484 file_data *p_outfile)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
485 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
486 unsigned char *dst, *dst_save;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
487 PIMAGE_DOS_HEADER dos_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
488 PIMAGE_NT_HEADERS nt_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
489 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
490 PIMAGE_SECTION_HEADER section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
491 PIMAGE_SECTION_HEADER dst_section;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
492 DWORD offset;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
493 int i;
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
494 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
495
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
496 #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
497 do { \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
498 unsigned char *s = (void *)(src); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
499 unsigned long count = (size); \
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
500 if (verbose) \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
501 { \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
502 printf ("%s\n", (message)); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
503 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
504 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
505 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
506 } \
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
507 memcpy (dst, s, count); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
508 dst += count; \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
509 } while (0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
510
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
511 #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
512 do { \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
513 unsigned char *s = (void *)(src); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
514 unsigned long count = (size); \
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
515 if (verbose) \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
516 { \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
517 printf ("%s\n", (message)); \
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
518 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
519 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
520 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
521 } \
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
522 memcpy (dst, s, count); \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
523 dst += count; \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
524 } while (0)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
525
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
526 #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
527 #define ROUND_UP_DST(align) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
528 (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
529 #define ROUND_UP_DST_AND_ZERO(align) \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
530 do { \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
531 unsigned char *newdst = p_outfile->file_base \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
532 + ROUND_UP (DST_TO_OFFSET (), (align)); \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
533 /* 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
534 memset (dst, 0, newdst - dst); \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
535 dst = newdst; \
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
536 } while (0)
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
537
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
538 /* 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
539 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
540 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
541
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
542 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
543
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
544 dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
545 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
546 dos_header->e_lfanew);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
547 section = IMAGE_FIRST_SECTION (nt_header);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
548
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
549 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
550
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
551 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
552 (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
553 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
554 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
555 (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
556 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
557 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
558 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
559 be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
560
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
561 /* 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
562 field accordingly. */
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
563 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
564 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
565
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
566 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
567 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
568 char msg[100];
63233
816cb0451814 (COPY_CHUNK, COPY_PROC_CHUNK): Add a new argument
Eli Zaretskii <eliz@gnu.org>
parents: 63086
diff changeset
569 /* 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
570 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
571 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
572
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
573 dst_save = dst;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
574
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
575 /* 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
576 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
577 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
578 if (dst_section->PointerToRawData)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
579 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
580
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
581 /* 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
582 COPY_CHUNK
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
583 (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
584 section->SizeOfRawData, be_verbose);
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
585 /* Ensure alignment slop is zeroed. */
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
586 ROUND_UP_DST_AND_ZERO (dst_nt_header->OptionalHeader.FileAlignment);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
587
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
588 /* 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
589 if (section == data_section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
590 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
591 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
592 + 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
593 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
594 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
595 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
596 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
597 if (section == bss_section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
598 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
599 /* 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
600 data size as necessary. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
601 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
602 + 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
603 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
604 bss_size, be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
605 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
606 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
607 /* 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
608 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
609 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
610 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
611 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
612 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
613 if (section == bss_section_static)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
614 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
615 /* 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
616 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
617 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
618 + 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
619 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
620 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
621 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
622 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
623 /* 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
624 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
625 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
626 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
627 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
628 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
629 if (section == heap_section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
630 {
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
631 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
632 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
633
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
634 /* 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
635 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
636 dst = dst_save
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
637 + 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
638 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
639 be_verbose);
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
640 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
641 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
642 /* 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
643 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
644 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
645 /* 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
646 section). */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
647 dst_nt_header->OptionalHeader.SizeOfImage -=
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
648 dst_section->Misc.VirtualSize
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
649 - ROUND_UP (dst_section->SizeOfRawData,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
650 dst_nt_header->OptionalHeader.SectionAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
651 dst_section->Misc.VirtualSize =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
652 ROUND_UP (dst_section->SizeOfRawData,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
653 dst_nt_header->OptionalHeader.SectionAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
654 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
655 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
656 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
657
24237
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
658 /* Align the section's raw data area. */
16e5582ed876 (ROUND_UP_DST_AND_ZERO): New macro.
Andrew Innes <andrewi@gnu.org>
parents: 24102
diff changeset
659 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
660
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
661 section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
662 dst_section++;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
663 }
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 /* Copy remainder of source image. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
666 do
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
667 section--;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
668 while (section->PointerToRawData == 0);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
669 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
670 nt_header->OptionalHeader.FileAlignment);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
671 COPY_CHUNK
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
672 ("Copying remainder of executable...",
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
673 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
674 p_infile->size - offset, be_verbose);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
675
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
676 /* Final size for new image. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
677 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
678
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
679 /* 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
680 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
681 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
682
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
683 #define ADJUST_OFFSET(var) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
684 do { \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
685 if ((var) != 0) \
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
686 (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
687 } while (0)
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
688
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
689 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
690 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
691 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
692 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
693 /* Recompute data sizes for completeness. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
694 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
695 dst_nt_header->OptionalHeader.SizeOfInitializedData +=
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
696 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
697 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
698 dst_nt_header->OptionalHeader.SizeOfUninitializedData +=
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
699 ROUND_UP (dst_section[i].Misc.VirtualSize, dst_nt_header->OptionalHeader.FileAlignment);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
700
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
701 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
702 }
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 ADJUST_OFFSET (dst_nt_header->FileHeader.PointerToSymbolTable);
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
705
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
706 /* 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
707 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
708 IMAGE_DATA_DIRECTORY debug_dir =
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
709 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
710 PIMAGE_DEBUG_DIRECTORY debug_entry;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
711
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
712 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
713 if (section)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
714 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
715 debug_entry = (PIMAGE_DEBUG_DIRECTORY)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
716 (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
717 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
718
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
719 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
720 ADJUST_OFFSET (debug_entry->PointerToRawData);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
721 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
722 }
12245
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
723 }
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
724
e8a6dfd8d5d2 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
725
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
726 /* Dump out .data and .bss sections into a new executable. */
110729
99084f50aa8e Remove unused arguments for unexec.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
727 int
99084f50aa8e Remove unused arguments for unexec.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
728 unexec (const char *new_name, const char *old_name)
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
729 {
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
730 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
731 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
732 unsigned long size;
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
733 char *p;
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
734 char *q;
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
735
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
736 /* 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
737 if (!GetModuleFileName (NULL, in_filename, MAX_PATH))
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
738 abort ();
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
739 dostounix_filename (in_filename);
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
740 strcpy (out_filename, in_filename);
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
741
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
742 /* 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
743 if ((p = strrchr (out_filename, '/')) == NULL)
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
744 abort ();
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
745 /* 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
746 format, so it is safe to expect an absolute name. */
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
747 if ((q = strrchr (new_name, '/')) == NULL)
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
748 abort ();
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
749 strcpy (p, q);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
750
31104
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
751 /* 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
752 it up if not. */
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
753 p = out_filename + strlen (out_filename) - 4;
79c890cce460 Change PUCHAR to PCHAR.
Andrew Innes <andrewi@gnu.org>
parents: 24806
diff changeset
754 if (strcmp (p, ".exe"))
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
755 strcat (out_filename, ".exe");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
756
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
757 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
758 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
759
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
760 /* 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
761 round_heap (get_page_size ());
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
762
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
763 /* Open the undumped executable file. */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
764 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
765 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
766 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
767 in_filename, GetLastError ());
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
768 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
769 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
770
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
771 /* 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
772 get_section_info (&in_file);
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
773
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
774 /* 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
775 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
776 size = in_file.size +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
777 get_committed_heap_size () +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
778 extra_bss_size +
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
779 extra_bss_size_static;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
780 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
781 {
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 31104
diff changeset
782 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
783 out_filename, GetLastError ());
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
784 exit (1);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
785 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
786
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
787 /* Set the flag (before dumping). */
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
788 using_dynamic_heap = TRUE;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
789
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
790 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
791
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
792 /* 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
793 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
794 PIMAGE_DOS_HEADER dos_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
795 PIMAGE_NT_HEADERS nt_header;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
796 HANDLE hImagehelp = LoadLibrary ("imagehlp.dll");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
797 DWORD headersum;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
798 DWORD checksum;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
799
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
800 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
801 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
802
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
803 nt_header->OptionalHeader.CheckSum = 0;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
804 // 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
805 // 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
806 // nt_header->OptionalHeader.SizeOfImage = size;
21604
104277bc1444 (my_begbss_static, my_endbss_static): Declare.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21456
diff changeset
807
24102
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
808 pfnCheckSumMappedFile = (void *) GetProcAddress (hImagehelp, "CheckSumMappedFile");
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
809 if (pfnCheckSumMappedFile)
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
810 {
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
811 // 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
812 pfnCheckSumMappedFile (out_file.file_base,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
813 out_file.size,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
814 &headersum,
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
815 &checksum);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
816 nt_header->OptionalHeader.CheckSum = checksum;
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
817 }
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
818 FreeLibrary (hImagehelp);
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
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
821 close_file_data (&in_file);
1086aa5db591 Major rewrite to support cleaner method of dumping; a
Andrew Innes <andrewi@gnu.org>
parents: 23948
diff changeset
822 close_file_data (&out_file);
110729
99084f50aa8e Remove unused arguments for unexec.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
823
99084f50aa8e Remove unused arguments for unexec.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
824 return 0;
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) */