annotate src/unexec.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents 5efe4b10d2b2
children e038c1a8307c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
1 /* Copyright (C) 1985, 1986, 1987, 1988, 1992, 1993, 1994, 2001, 2002, 2003,
79759
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78260
diff changeset
2 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91702
diff changeset
6 GNU Emacs is free software: you can redistribute it and/or modify
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 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: 91702
diff changeset
8 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: 91702
diff changeset
9 (at your option) any later version.
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 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: 91702
diff changeset
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 /*
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 * unexec.c - Convert a running program into an a.out file.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 * Author: Spencer W. Thomas
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 * Computer Science Dept.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 * University of Utah
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 * Date: Tue Mar 2 1982
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 * Modified heavily since then.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 * Synopsis:
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 * unexec (new_name, a_name, data_start, bss_start, entry_address)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 * char *new_name, *a_name;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 * unsigned data_start, bss_start, entry_address;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 * Takes a snapshot of the program and makes an a.out format file in the
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 * file named by the string argument new_name.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 * If a_name is non-NULL, the symbol table will be taken from the given file.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 * On some machines, an existing a_name file is required.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 * The boundaries within the a.out file may be adjusted with the data_start
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 * and bss_start arguments. Either or both may be given as 0 for defaults.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 * Data_start gives the boundary between the text segment and the data
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 * segment of the program. The text segment can contain shared, read-only
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 * program code and literal data, while the data segment is always unshared
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 * and unprotected. Data_start gives the lowest unprotected address.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 * The value you specify may be rounded down to a suitable boundary
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 * as required by the machine you are using.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 * Specifying zero for data_start means the boundary between text and data
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 * should not be the same as when the program was loaded.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 * If NO_REMAP is defined, the argument data_start is ignored and the
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 * segment boundaries are never changed.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 * Bss_start indicates how much of the data segment is to be saved in the
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 * a.out file and restored when the program is executed. It gives the lowest
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 * unsaved address, and is rounded up to a page boundary. The default when 0
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 * is given assumes that the entire data segment is to be stored, including
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 * the previous data and bss as well as any additional storage allocated with
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 * break (2).
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 * The new file is set up to start at entry_address.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 * If you make improvements I'd like to get them too.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 * harpo!utah-cs!thomas, thomas@Utah-20
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 /* Modified to support SysVr3 shared libraries by James Van Artsdalen
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 * of Dell Computer Corporation. james@bigtex.cactus.org.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 /* There are several compilation parameters affecting unexec:
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 * COFF
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 Define this if your system uses COFF for executables.
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 172
diff changeset
77
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 * NO_REMAP
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 Define this if you do not want to try to save Emacs's pure data areas
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 as part of the text segment.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 Saving them as text is good because it allows users to share more.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 However, on machines that locate the text area far from the data area,
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 the boundary cannot feasibly be moved. Such machines require
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 NO_REMAP.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 Also, remapping can cause trouble with the built-in startup routine
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 /lib/crt0.o, which defines `environ' as an initialized variable.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 Dumping `environ' as pure does not work! So, to use remapping,
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 you must write a startup routine for your machine in Emacs's crt0.c.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 If NO_REMAP is defined, Emacs uses the system's crt0.o.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 * SECTION_ALIGNMENT
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 Some machines that use COFF executables require that each section
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 start on a certain boundary *in the COFF file*. Such machines should
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 define SECTION_ALIGNMENT to a mask of the low-order bits that must be
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 zero on such a boundary. This mask is used to control padding between
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 segments in the COFF file.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 If SECTION_ALIGNMENT is not defined, the segments are written
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 consecutively with no attempt at alignment. This is right for
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 unmodified system V.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 * SEGMENT_MASK
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 Some machines require that the beginnings and ends of segments
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 *in core* be on certain boundaries. For most machines, a page
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 boundary is sufficient. That is the default. When a larger
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 boundary is needed, define SEGMENT_MASK to a mask of
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 the bits that must be zero on such a boundary.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 * ADJUST_EXEC_HEADER
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 This macro can be used to generate statements to adjust or
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 initialize nonstandard fields in the file header
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 #ifndef emacs
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 #define PERROR(arg) perror (arg); return -1
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 #else
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4319
diff changeset
125 #include <config.h>
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 #define PERROR(file) report_error (file, new)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 #endif
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 #ifndef CANNOT_DUMP /* all rest of file! */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130
96926
baf6162e41d4 Remove code depending on !COFF and USG, the file is
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96732
diff changeset
131 #ifdef HAVE_COFF_H
29650
2411aacca614 (toplevel) [COFF]: Include coff.h.
Gerd Moellmann <gerd@gnu.org>
parents: 22647
diff changeset
132 #include <coff.h>
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
133 #ifdef MSDOS
14975
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
134 #if __DJGPP__ > 1
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
135 #include <fcntl.h> /* for O_RDONLY, O_RDWR */
15732
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
136 #include <crt0.h> /* for _crt0_startup_flags and its bits */
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
137 static int save_djgpp_startup_flags;
29668
1e6eeead2f1d (toplevel): Fix last change, so as not to deprive MSDOS
Eli Zaretskii <eliz@gnu.org>
parents: 29650
diff changeset
138 #endif /* __DJGPP__ > 1 */
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
139 #define filehdr external_filehdr
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
140 #define scnhdr external_scnhdr
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
141 #define syment external_syment
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
142 #define auxent external_auxent
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
143 #define n_numaux e_numaux
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
144 #define n_type e_type
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
145 struct aouthdr
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
146 {
7626
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
147 unsigned short magic; /* type of file */
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
148 unsigned short vstamp; /* version stamp */
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
149 unsigned long tsize; /* text size in bytes, padded to FW bdry*/
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
150 unsigned long dsize; /* initialized data " " */
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
151 unsigned long bsize; /* uninitialized data " " */
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
152 unsigned long entry; /* entry pt. */
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
153 unsigned long text_start;/* base of text used for this file */
7ae305576201 [MSDOS]: Don't include files from the dos extender
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
154 unsigned long data_start;/* base of data used for this file */
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
155 };
29668
1e6eeead2f1d (toplevel): Fix last change, so as not to deprive MSDOS
Eli Zaretskii <eliz@gnu.org>
parents: 29650
diff changeset
156 #endif /* not MSDOS */
96926
baf6162e41d4 Remove code depending on !COFF and USG, the file is
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96732
diff changeset
157 #else /* not HAVE_COFF_H */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 #include <a.out.h>
96926
baf6162e41d4 Remove code depending on !COFF and USG, the file is
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96732
diff changeset
159 #endif /* not HAVE_COFF_H */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 172
diff changeset
160
9699
0b471201bbd4 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 9351
diff changeset
161 /* Define getpagesize if the system does not.
0b471201bbd4 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 9351
diff changeset
162 Note that this may depend on symbols defined in a.out.h. */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 #include "getpagesize.h"
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 #ifndef makedev /* Try to detect types.h already loaded */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 #include <sys/types.h>
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 172
diff changeset
167 #endif /* makedev */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 #include <stdio.h>
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 #include <sys/stat.h>
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 #include <errno.h>
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171
96926
baf6162e41d4 Remove code depending on !COFF and USG, the file is
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96732
diff changeset
172 #include <sys/file.h>
7921
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
173
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
174 #ifndef O_RDONLY
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
175 #define O_RDONLY 0
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
176 #endif
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
177 #ifndef O_RDWR
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
178 #define O_RDWR 2
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
179 #endif
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
180
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
181
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 extern char *start_of_text (); /* Start of text */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 extern char *start_of_data (); /* Start of initialized data */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 static long block_copy_start; /* Old executable start point */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 static struct filehdr f_hdr; /* File header */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 static struct aouthdr f_ohdr; /* Optional file header (a.out) */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 long bias; /* Bias to add for growth */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 long lnnoptr; /* Pointer to line-number info within file */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 #define SYMS_START block_copy_start
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 static long text_scnptr;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 static long data_scnptr;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194
22647
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
195 static long coff_offset;
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
196
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 static int pagemask;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 /* Correct an int which is the bit pattern of a pointer to a byte
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 into an int which is the number of a byte.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 This is a no-op on ordinary machines, but not on all. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 #define ADDR_CORRECT(x) ((char *)(x) - (char*)0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 #ifdef emacs
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206
7921
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
207 #include "lisp.h"
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
208
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 static
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 report_error (file, fd)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 char *file;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 int fd;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 if (fd)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 close (fd);
7921
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
216 report_file_error ("Cannot unexec", Fcons (build_string (file), Qnil));
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 #endif /* emacs */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 #define ERROR0(msg) report_error_1 (new, msg, 0, 0); return -1
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 #define ERROR1(msg,x) report_error_1 (new, msg, x, 0); return -1
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 #define ERROR2(msg,x,y) report_error_1 (new, msg, x, y); return -1
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 static
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 report_error_1 (fd, msg, a1, a2)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 int fd;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 char *msg;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 int a1, a2;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 close (fd);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 #ifdef emacs
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 error (msg, a1, a2);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 #else
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 fprintf (stderr, msg, a1, a2);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 fprintf (stderr, "\n");
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 #endif
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 static int make_hdr ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 static int copy_text_and_data ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 static int copy_sym ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 static void mark_x ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 /* ****************************************************************
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 * make_hdr
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 * Make the header in the new a.out from the header in core.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 * Modify the text and data sizes.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 static int
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 int new, a_out;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 unsigned data_start, bss_start, entry_address;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 char *a_name;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 char *new_name;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 int tem;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 auto struct scnhdr f_thdr; /* Text section header */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 auto struct scnhdr f_dhdr; /* Data section header */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 auto struct scnhdr f_bhdr; /* Bss section header */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 auto struct scnhdr scntemp; /* Temporary section header */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 register int scns;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 unsigned int bss_end;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 pagemask = getpagesize () - 1;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 /* Adjust text/data boundary. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 #ifdef NO_REMAP
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 data_start = (int) start_of_data ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 #else /* not NO_REMAP */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 if (!data_start)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 data_start = (int) start_of_data ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 #endif /* not NO_REMAP */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 data_start = ADDR_CORRECT (data_start);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 #ifdef SEGMENT_MASK
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 data_start = data_start & ~SEGMENT_MASK; /* (Down) to segment boundary. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 #else
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 data_start = data_start & ~pagemask; /* (Down) to page boundary. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 #endif
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 bss_end = ADDR_CORRECT (sbrk (0)) + pagemask;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 bss_end &= ~ pagemask;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 /* Adjust data/bss boundary. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 if (bss_start != 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 bss_start = (ADDR_CORRECT (bss_start) + pagemask);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 /* (Up) to page bdry. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 bss_start &= ~ pagemask;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 if (bss_start > bss_end)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 ERROR1 ("unexec: Specified bss_start (%u) is past end of program",
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 bss_start);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 else
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 bss_start = bss_end;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 if (data_start > bss_start) /* Can't have negative data size. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 ERROR2 ("unexec: data_start (%u) can't be greater than bss_start (%u)",
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 data_start, bss_start);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305
22647
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
306 coff_offset = 0L; /* stays zero, except in DJGPP */
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
307
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 /* Salvage as much info from the existing file as possible */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 if (a_out >= 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 {
22647
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
311 #ifdef MSDOS
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
312 #if __DJGPP__ > 1
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
313 /* Support the coff-go32-exe format with a prepended stub, since
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
314 this is what GCC 2.8.0 and later generates by default in DJGPP. */
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
315 unsigned short mz_header[3];
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
316
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
317 if (read (a_out, &mz_header, sizeof (mz_header)) != sizeof (mz_header))
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
318 {
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
319 PERROR (a_name);
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
320 }
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
321 if (mz_header[0] == 0x5a4d || mz_header[0] == 0x4d5a) /* "MZ" or "ZM" */
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
322 {
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
323 coff_offset = (long)mz_header[2] * 512L;
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
324 if (mz_header[1])
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
325 coff_offset += (long)mz_header[1] - 512L;
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
326 lseek (a_out, coff_offset, 0);
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
327 }
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
328 else
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
329 lseek (a_out, 0L, 0);
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
330 #endif /* __DJGPP__ > 1 */
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
331 #endif /* MSDOS */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 if (read (a_out, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 PERROR (a_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 block_copy_start += sizeof (f_hdr);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 if (f_hdr.f_opthdr > 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 if (read (a_out, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 PERROR (a_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 block_copy_start += sizeof (f_ohdr);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 /* Loop through section headers, copying them in */
22647
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
346 lseek (a_out, coff_offset + sizeof (f_hdr) + f_hdr.f_opthdr, 0);
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 for (scns = f_hdr.f_nscns; scns > 0; scns--) {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 if (read (a_out, &scntemp, sizeof (scntemp)) != sizeof (scntemp))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 PERROR (a_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 if (scntemp.s_scnptr > 0L)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 if (block_copy_start < scntemp.s_scnptr + scntemp.s_size)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 block_copy_start = scntemp.s_scnptr + scntemp.s_size;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 if (strcmp (scntemp.s_name, ".text") == 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 f_thdr = scntemp;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 else if (strcmp (scntemp.s_name, ".data") == 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 f_dhdr = scntemp;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 else if (strcmp (scntemp.s_name, ".bss") == 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 f_bhdr = scntemp;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 else
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 ERROR0 ("can't build a COFF file from scratch yet");
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 /* Now we alter the contents of all the f_*hdr variables
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 to correspond to what we want to dump. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 f_hdr.f_flags |= (F_RELFLG | F_EXEC);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 #ifndef NO_REMAP
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 f_ohdr.text_start = (long) start_of_text ();
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 f_ohdr.tsize = data_start - f_ohdr.text_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 f_ohdr.data_start = data_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 #endif /* NO_REMAP */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 f_ohdr.dsize = bss_start - f_ohdr.data_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 f_ohdr.bsize = bss_end - bss_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 /* On some machines, the old values are right.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 ??? Maybe on all machines with NO_REMAP. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 f_thdr.s_size = f_ohdr.tsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 f_thdr.s_scnptr = sizeof (f_hdr) + sizeof (f_ohdr);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 f_thdr.s_scnptr += (f_hdr.f_nscns) * (sizeof (f_thdr));
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 lnnoptr = f_thdr.s_lnnoptr;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 #ifdef SECTION_ALIGNMENT
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 /* Some systems require special alignment
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 of the sections in the file itself. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 f_thdr.s_scnptr
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 = (f_thdr.s_scnptr + SECTION_ALIGNMENT) & ~SECTION_ALIGNMENT;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 #endif /* SECTION_ALIGNMENT */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 text_scnptr = f_thdr.s_scnptr;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 f_dhdr.s_paddr = f_ohdr.data_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 f_dhdr.s_vaddr = f_ohdr.data_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 f_dhdr.s_size = f_ohdr.dsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 f_dhdr.s_scnptr = f_thdr.s_scnptr + f_thdr.s_size;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 #ifdef SECTION_ALIGNMENT
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 /* Some systems require special alignment
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 of the sections in the file itself. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 f_dhdr.s_scnptr
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 = (f_dhdr.s_scnptr + SECTION_ALIGNMENT) & ~SECTION_ALIGNMENT;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 #endif /* SECTION_ALIGNMENT */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 #ifdef DATA_SECTION_ALIGNMENT
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 /* Some systems require special alignment
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 of the data section only. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 f_dhdr.s_scnptr
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 = (f_dhdr.s_scnptr + DATA_SECTION_ALIGNMENT) & ~DATA_SECTION_ALIGNMENT;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 #endif /* DATA_SECTION_ALIGNMENT */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 data_scnptr = f_dhdr.s_scnptr;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 f_bhdr.s_paddr = f_ohdr.data_start + f_ohdr.dsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 f_bhdr.s_vaddr = f_ohdr.data_start + f_ohdr.dsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 f_bhdr.s_size = f_ohdr.bsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 f_bhdr.s_scnptr = 0L;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 bias = f_dhdr.s_scnptr + f_dhdr.s_size - block_copy_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 if (f_hdr.f_symptr > 0L)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 f_hdr.f_symptr += bias;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 if (f_thdr.s_lnnoptr > 0L)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 f_thdr.s_lnnoptr += bias;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 #ifdef ADJUST_EXEC_HEADER
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 ADJUST_EXEC_HEADER;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 #endif /* ADJUST_EXEC_HEADER */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 if (write (new, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 if (write (new, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 if (write (new, &f_thdr, sizeof (f_thdr)) != sizeof (f_thdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 if (write (new, &f_dhdr, sizeof (f_dhdr)) != sizeof (f_dhdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 if (write (new, &f_bhdr, sizeof (f_bhdr)) != sizeof (f_bhdr))
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 return (0);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465
60728
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
466 write_segment (new, ptr, end)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
467 int new;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
468 register char *ptr, *end;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
469 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
470 register int i, nwrite, ret;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
471 char buf[80];
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
472 #ifndef USE_CRT_DLL
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
473 extern int errno;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
474 #endif
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
475 /* This is the normal amount to write at once.
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
476 It is the size of block that NFS uses. */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
477 int writesize = 1 << 13;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
478 int pagesize = getpagesize ();
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
479 char zeros[1 << 13];
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
480
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
481 bzero (zeros, sizeof (zeros));
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
482
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
483 for (i = 0; ptr < end;)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
484 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
485 /* Distance to next multiple of writesize. */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
486 nwrite = (((int) ptr + writesize) & -writesize) - (int) ptr;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
487 /* But not beyond specified end. */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
488 if (nwrite > end - ptr) nwrite = end - ptr;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
489 ret = write (new, ptr, nwrite);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
490 /* If write gets a page fault, it means we reached
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
491 a gap between the old text segment and the old data segment.
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
492 This gap has probably been remapped into part of the text segment.
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
493 So write zeros for it. */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
494 if (ret == -1
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
495 #ifdef EFAULT
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
496 && errno == EFAULT
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
497 #endif
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
498 )
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
499 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
500 /* Write only a page of zeros at once,
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
501 so that we we don't overshoot the start
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
502 of the valid memory in the old data segment. */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
503 if (nwrite > pagesize)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
504 nwrite = pagesize;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
505 write (new, zeros, nwrite);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
506 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
507 #if 0 /* Now that we have can ask `write' to write more than a page,
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
508 it is legit for write do less than the whole amount specified. */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
509 else if (nwrite != ret)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
510 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
511 sprintf (buf,
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
512 "unexec write failure: addr 0x%x, fileno %d, size 0x%x, wrote 0x%x, errno %d",
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
513 ptr, new, nwrite, ret, errno);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
514 PERROR (buf);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
515 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
516 #endif
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
517 i += nwrite;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
518 ptr += nwrite;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
519 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
520 }
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 /* ****************************************************************
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 * copy_text_and_data
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 * Copy the text and data segments from memory to the new a.out
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 static int
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 copy_text_and_data (new, a_out)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 int new, a_out;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 register char *end;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 register char *ptr;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532
14975
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
533 #ifdef MSDOS
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
534 #if __DJGPP__ >= 2
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
535 /* Dump the original table of exception handlers, not the one
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
536 where our exception hooks are registered. */
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
537 __djgpp_exception_toggle ();
15732
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
538
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
539 /* Switch off startup flags that might have been set at runtime
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
540 and which might change the way that dumped Emacs works. */
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
541 save_djgpp_startup_flags = _crt0_startup_flags;
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
542 _crt0_startup_flags &= ~(_CRT0_FLAG_NO_LFN | _CRT0_FLAG_NEARPTR);
14975
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
543 #endif
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
544 #endif
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
545
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 lseek (new, (long) text_scnptr, 0);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 ptr = (char *) f_ohdr.text_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 end = ptr + f_ohdr.tsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 write_segment (new, ptr, end);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 lseek (new, (long) data_scnptr, 0);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 ptr = (char *) f_ohdr.data_start;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 end = ptr + f_ohdr.dsize;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 write_segment (new, ptr, end);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555
14975
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
556 #ifdef MSDOS
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
557 #if __DJGPP__ >= 2
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
558 /* Restore our exception hooks. */
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
559 __djgpp_exception_toggle ();
15732
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
560
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
561 /* Restore the startup flags. */
c24b00e705ba (copy_text_and_data) [DJGPP >= 2]: Switch off two bits
Karl Heuer <kwzh@gnu.org>
parents: 14975
diff changeset
562 _crt0_startup_flags = save_djgpp_startup_flags;
14975
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
563 #endif
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
564 #endif
7b91ceb19771 [DJGPP v2]: Include fcntl.h.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
565
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 return 0;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 /* ****************************************************************
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 * copy_sym
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 * Copy the relocation information and symbol table from the a.out to the new
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 static int
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 copy_sym (new, a_out, a_name, new_name)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 int new, a_out;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 char *a_name, *new_name;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580 char page[1024];
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 int n;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 if (a_out < 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 return 0;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 if (SYMS_START == 0L)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 return 0;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 if (lnnoptr) /* if there is line number info */
22647
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
590 lseek (a_out, coff_offset + lnnoptr, 0); /* start copying from there */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
591 else
22647
1f418e353dd7 [COFF]: New variable coff_offset.
Richard M. Stallman <rms@gnu.org>
parents: 15732
diff changeset
592 lseek (a_out, coff_offset + SYMS_START, 0); /* Position a.out to symtab. */
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594 while ((n = read (a_out, page, sizeof page)) > 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
596 if (write (new, page, n) != n)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 if (n < 0)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 PERROR (a_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 return 0;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 /* ****************************************************************
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 * mark_x
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610 *
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 2917
diff changeset
611 * After successfully building the new a.out, mark it executable
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613 static void
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 mark_x (name)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615 char *name;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 struct stat sbuf;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618 int um;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 int new = 0; /* for PERROR */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 um = umask (777);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 umask (um);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
623 if (stat (name, &sbuf) == -1)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 PERROR (name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
626 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
627 sbuf.st_mode |= 0111 & ~um;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 if (chmod (name, sbuf.st_mode) == -1)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 PERROR (name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 #ifndef COFF_BSD_SYMBOLS
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 /*
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
635 * If the COFF file contains a symbol table and a line number section,
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636 * then any auxiliary entries that have values for x_lnnoptr must
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
637 * be adjusted by the amount that the line number section has moved
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
638 * in the file (bias computed in make_hdr). The #@$%&* designers of
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 * the auxiliary entry structures used the absolute file offsets for
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 * the line number entry rather than an offset from the start of the
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 * line number section!
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 *
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 * When I figure out how to scan through the symbol table and pick out
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 * the auxiliary entries that need adjustment, this routine will
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 * be fixed. As it is now, all such entries are wrong and sdb
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
646 * will complain. Fred Fish, UniSoft Systems Inc.
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647 */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
649 /* This function is probably very slow. Instead of reopening the new
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
650 file for input and output it should copy from the old to the new
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651 using the two descriptors already open (WRITEDESC and READDESC).
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
652 Instead of reading one small structure at a time it should use
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653 a reasonable size buffer. But I don't have time to work on such
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
654 things, so I am installing it as submitted to me. -- RMS. */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
655
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
656 adjust_lnnoptrs (writedesc, readdesc, new_name)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657 int writedesc;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
658 int readdesc;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 char *new_name;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661 register int nsyms;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 register int new;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663 struct syment symentry;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 union auxent auxentry;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 if (!lnnoptr || !f_hdr.f_symptr)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
667 return 0;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
669 #ifdef MSDOS
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
670 if ((new = writedesc) < 0)
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
671 #else
7921
b3a5b629fe26 Include <sys/file.h> and [USG5] <fcntl.h> to define O_* macros.
Roland McGrath <roland@gnu.org>
parents: 7626
diff changeset
672 if ((new = open (new_name, O_RDWR)) < 0)
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
673 #endif
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 PERROR (new_name);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 return -1;
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
679 lseek (new, f_hdr.f_symptr, 0);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 for (nsyms = 0; nsyms < f_hdr.f_nsyms; nsyms++)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
682 read (new, &symentry, SYMESZ);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
683 if (symentry.n_numaux)
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 {
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
685 read (new, &auxentry, AUXESZ);
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
686 nsyms++;
1937
087889e85644 (Fforward_comment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
687 if (ISFCN (symentry.n_type) || symentry.n_type == 0x2400)
087889e85644 (Fforward_comment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
688 {
087889e85644 (Fforward_comment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
689 auxentry.x_sym.x_fcnary.x_fcn.x_lnnoptr += bias;
087889e85644 (Fforward_comment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
690 lseek (new, -AUXESZ, 1);
087889e85644 (Fforward_comment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
691 write (new, &auxentry, AUXESZ);
087889e85644 (Fforward_comment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
692 }
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694 }
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
695 #ifndef MSDOS
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696 close (new);
5500
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
697 #endif
6f6637309b38 [MSDOS]: Don't #include <a.out.h>, but use other headers.
Richard M. Stallman <rms@gnu.org>
parents: 4973
diff changeset
698 return 0;
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
699 }
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701 #endif /* COFF_BSD_SYMBOLS */
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702
60728
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
703 /* ****************************************************************
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
704 * unexec
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
705 *
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
706 * driving logic.
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
707 */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
708 unexec (new_name, a_name, data_start, bss_start, entry_address)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
709 char *new_name, *a_name;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
710 unsigned data_start, bss_start, entry_address;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
711 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
712 int new, a_out = -1;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
713
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
714 if (a_name && (a_out = open (a_name, O_RDONLY)) < 0)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
715 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
716 PERROR (a_name);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
717 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
718 if ((new = creat (new_name, 0666)) < 0)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
719 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
720 PERROR (new_name);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
721 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
722
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
723 if (make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) < 0
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
724 || copy_text_and_data (new, a_out) < 0
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
725 || copy_sym (new, a_out, a_name, new_name) < 0
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
726 #ifndef COFF_BSD_SYMBOLS
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
727 || adjust_lnnoptrs (new, a_out, new_name) < 0
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
728 #endif
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
729 )
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
730 {
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
731 close (new);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
732 /* unlink (new_name); /* Failed, unlink new a.out */
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
733 return -1;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
734 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
735
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
736 close (new);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
737 if (a_out >= 0)
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
738 close (a_out);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
739 mark_x (new_name);
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
740 return 0;
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
741 }
1e22d789c8c7 (write_segment, unexec): Move these functions to avoid forward
Eli Zaretskii <eliz@gnu.org>
parents: 52401
diff changeset
742
172
bd964fa17294 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
743 #endif /* not CANNOT_DUMP */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51093
diff changeset
744
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51093
diff changeset
745 /* arch-tag: 62409b69-e27a-4a7c-9413-0210d6b54e7f
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51093
diff changeset
746 (do not change this comment) */