annotate src/unexaix.c @ 4413:5a00cec8e9b0

(fill-region-as-paragraph): When we take one word after the fill column, don't stop at period with just one space. When checking whether at beginning of line, if no fill prefix, ignore intervening whitespace.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 05:55:56 +0000
parents 507f64624555
children 1fc792473491
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
1 /* Modified by Andrew.Vignaux@comp.vuw.ac.nz to get it to work :-) */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
2
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
3 /* Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
4
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
5 This program is free software; you can redistribute it and/or modify
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
6 it under the terms of the GNU General Public License as published by
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
7 the Free Software Foundation; either version 1, or (at your option)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
8 any later version.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
9
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
10 This program is distributed in the hope that it will be useful,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
13 GNU General Public License for more details.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
14
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
15 You should have received a copy of the GNU General Public License
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
16 along with this program; if not, write to the Free Software
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
18
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
19 In other words, you are welcome to use, share and improve this program.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
20 You are forbidden to forbid anyone else to use, share and improve
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
21 what you give them. Help stamp out software-hoarding! */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
22
117
08356dc1077c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 110
diff changeset
23
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
24 /*
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
25 * unexec.c - Convert a running program into an a.out file.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
26 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
27 * Author: Spencer W. Thomas
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
28 * Computer Science Dept.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
29 * University of Utah
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
30 * Date: Tue Mar 2 1982
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
31 * Modified heavily since then.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
32 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
33 * Synopsis:
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
34 * unexec (new_name, a_name, data_start, bss_start, entry_address)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
35 * char *new_name, *a_name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
36 * unsigned data_start, bss_start, entry_address;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
37 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
38 * Takes a snapshot of the program and makes an a.out format file in the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
39 * file named by the string argument new_name.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
40 * If a_name is non-NULL, the symbol table will be taken from the given file.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
41 * On some machines, an existing a_name file is required.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
42 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
43 * The boundaries within the a.out file may be adjusted with the data_start
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
44 * and bss_start arguments. Either or both may be given as 0 for defaults.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
45 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
46 * Data_start gives the boundary between the text segment and the data
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
47 * segment of the program. The text segment can contain shared, read-only
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
48 * program code and literal data, while the data segment is always unshared
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
49 * and unprotected. Data_start gives the lowest unprotected address.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
50 * The value you specify may be rounded down to a suitable boundary
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
51 * as required by the machine you are using.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
52 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
53 * Specifying zero for data_start means the boundary between text and data
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
54 * should not be the same as when the program was loaded.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
55 * If NO_REMAP is defined, the argument data_start is ignored and the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
56 * segment boundaries are never changed.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
57 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
58 * Bss_start indicates how much of the data segment is to be saved in the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
59 * a.out file and restored when the program is executed. It gives the lowest
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
60 * unsaved address, and is rounded up to a page boundary. The default when 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
61 * is given assumes that the entire data segment is to be stored, including
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
62 * the previous data and bss as well as any additional storage allocated with
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
63 * break (2).
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
64 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
65 * The new file is set up to start at entry_address.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
66 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
67 * If you make improvements I'd like to get them too.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
68 * harpo!utah-cs!thomas, thomas@Utah-20
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
69 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
70 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
71
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
72 /* There are several compilation parameters affecting unexec:
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
73
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
74 * COFF
117
08356dc1077c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 110
diff changeset
75
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
76 Define this if your system uses COFF for executables.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
77 Otherwise we assume you use Berkeley format.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
78
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
79 * NO_REMAP
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
80
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
81 Define this if you do not want to try to save Emacs's pure data areas
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
82 as part of the text segment.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
83
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
84 Saving them as text is good because it allows users to share more.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
85
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
86 However, on machines that locate the text area far from the data area,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
87 the boundary cannot feasibly be moved. Such machines require
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
88 NO_REMAP.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
89
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
90 Also, remapping can cause trouble with the built-in startup routine
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
91 /lib/crt0.o, which defines `environ' as an initialized variable.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
92 Dumping `environ' as pure does not work! So, to use remapping,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
93 you must write a startup routine for your machine in Emacs's crt0.c.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
94 If NO_REMAP is defined, Emacs uses the system's crt0.o.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
95
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
96 * SECTION_ALIGNMENT
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
97
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
98 Some machines that use COFF executables require that each section
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
99 start on a certain boundary *in the COFF file*. Such machines should
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
100 define SECTION_ALIGNMENT to a mask of the low-order bits that must be
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
101 zero on such a boundary. This mask is used to control padding between
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
102 segments in the COFF file.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
103
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
104 If SECTION_ALIGNMENT is not defined, the segments are written
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
105 consecutively with no attempt at alignment. This is right for
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
106 unmodified system V.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
107
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
108 * SEGMENT_MASK
117
08356dc1077c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 110
diff changeset
109
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
110 Some machines require that the beginnings and ends of segments
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
111 *in core* be on certain boundaries. For most machines, a page
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
112 boundary is sufficient. That is the default. When a larger
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
113 boundary is needed, define SEGMENT_MASK to a mask of
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
114 the bits that must be zero on such a boundary.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
115
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
116 * A_TEXT_OFFSET(HDR)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
117
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
118 Some machines count the a.out header as part of the size of the text
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
119 segment (a_text); they may actually load the header into core as the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
120 first data in the text segment. Some have additional padding between
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
121 the header and the real text of the program that is counted in a_text.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
122
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
123 For these machines, define A_TEXT_OFFSET(HDR) to examine the header
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
124 structure HDR and return the number of bytes to add to `a_text'
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
125 before writing it (above and beyond the number of bytes of actual
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
126 program text). HDR's standard fields are already correct, except that
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
127 this adjustment to the `a_text' field has not yet been made;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
128 thus, the amount of offset can depend on the data in the file.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
129
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
130 * A_TEXT_SEEK(HDR)
117
08356dc1077c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 110
diff changeset
131
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
132 If defined, this macro specifies the number of bytes to seek into the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
133 a.out file before starting to write the text segment.a
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
134
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
135 * EXEC_MAGIC
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
136
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
137 For machines using COFF, this macro, if defined, is a value stored
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
138 into the magic number field of the output file.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
139
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
140 * ADJUST_EXEC_HEADER
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
141
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
142 This macro can be used to generate statements to adjust or
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
143 initialize nonstandard fields in the file header
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
144
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
145 * ADDR_CORRECT(ADDR)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
146
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
147 Macro to correct an int which is the bit pattern of a pointer to a byte
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
148 into an int which is the number of a byte.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
149
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
150 This macro has a default definition which is usually right.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
151 This default definition is a no-op on most machines (where a
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
152 pointer looks like an int) but not on all machines.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
153
117
08356dc1077c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 110
diff changeset
154 */
08356dc1077c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 110
diff changeset
155
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
156 #define XCOFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
157 #define COFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
158 #define NO_REMAP
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
160 #ifndef emacs
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
161 #define PERROR(arg) perror (arg); return -1
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
162 #else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
163 #include "config.h"
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
164 #define PERROR(file) report_error (file, new)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
165 #endif
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
167 #ifndef CANNOT_DUMP /* all rest of file! */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
168
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
169 #ifndef CANNOT_UNEXEC /* most of rest of file */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
171 #include <a.out.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
172 /* Define getpagesize () if the system does not.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
173 Note that this may depend on symbols defined in a.out.h
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
174 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
175 #include "getpagesize.h"
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
177 #ifndef makedev /* Try to detect types.h already loaded */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
178 #include <sys/types.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
179 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
180 #include <stdio.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
181 #include <sys/stat.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
182 #include <errno.h>
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
184 extern char *start_of_text (); /* Start of text */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
185 extern char *start_of_data (); /* Start of initialized data */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
187 extern int _data;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
188 extern int _edata;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
189 extern int _text;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
190 extern int _etext;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
191 extern int _end;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
192 #ifdef COFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
193 #ifndef USG
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
194 #ifndef STRIDE
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
195 #ifndef UMAX
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
196 #ifndef sun386
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
197 /* I have a suspicion that these are turned off on all systems
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
198 and can be deleted. Try it in version 19. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
199 #include <filehdr.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
200 #include <aouthdr.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
201 #include <scnhdr.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
202 #include <syms.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
203 #endif /* not sun386 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
204 #endif /* not UMAX */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
205 #endif /* Not STRIDE */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
206 #endif /* not USG */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
207 static long block_copy_start; /* Old executable start point */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
208 static struct filehdr f_hdr; /* File header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
209 static struct aouthdr f_ohdr; /* Optional file header (a.out) */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
210 long bias; /* Bias to add for growth */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
211 long lnnoptr; /* Pointer to line-number info within file */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
212 #define SYMS_START block_copy_start
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
214 static long text_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
215 static long data_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
216 #ifdef XCOFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
217 static long load_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
218 static long orig_load_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
219 static long orig_data_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
220 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
221 static long data_st;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
223 #ifndef MAX_SECTIONS
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
224 #define MAX_SECTIONS 10
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
225 #endif
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
227 #endif /* COFF */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
228
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
229 static int pagemask;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
231 /* Correct an int which is the bit pattern of a pointer to a byte
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
232 into an int which is the number of a byte.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
233 This is a no-op on ordinary machines, but not on all. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
234
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
235 #ifndef ADDR_CORRECT /* Let m-*.h files override this definition */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
236 #define ADDR_CORRECT(x) ((char *)(x) - (char*)0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
237 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
238
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
239 #ifdef emacs
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
241 static
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
242 report_error (file, fd)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
243 char *file;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
244 int fd;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
245 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
246 if (fd)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
247 close (fd);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
248 error ("Failure operating on %s", file);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
249 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
250 #endif /* emacs */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
252 #define ERROR0(msg) report_error_1 (new, msg, 0, 0); return -1
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
253 #define ERROR1(msg,x) report_error_1 (new, msg, x, 0); return -1
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
254 #define ERROR2(msg,x,y) report_error_1 (new, msg, x, y); return -1
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
256 static
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
257 report_error_1 (fd, msg, a1, a2)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
258 int fd;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
259 char *msg;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
260 int a1, a2;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
262 close (fd);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
263 #ifdef emacs
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
264 error (msg, a1, a2);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
265 #else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
266 fprintf (stderr, msg, a1, a2);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
267 fprintf (stderr, "\n");
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
268 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
269 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
271 static int make_hdr ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
272 static void mark_x ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
273 static int copy_text_and_data ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
274 static int copy_sym ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
275
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
276 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
277 * unexec
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
278 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
279 * driving logic.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
280 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
281 unexec (new_name, a_name, data_start, bss_start, entry_address)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
282 char *new_name, *a_name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
283 unsigned data_start, bss_start, entry_address;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
284 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
285 int new, a_out = -1;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
286
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
287 if (a_name && (a_out = open (a_name, 0)) < 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
289 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
290 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
291 if ((new = creat (new_name, 0666)) < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
292 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
293 PERROR (new_name);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 }
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
295 if (make_hdr (new,a_out,data_start,bss_start,entry_address,a_name,new_name) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
296 || copy_text_and_data (new) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
297 || copy_sym (new, a_out, a_name, new_name) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
298 #ifdef COFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
299 || adjust_lnnoptrs (new, a_out, new_name) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
300 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
301 #ifdef XCOFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
302 || unrelocate_symbols (new, a_out, a_name, new_name) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
303 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
304 )
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
306 close (new);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
307 /* unlink (new_name); /* Failed, unlink new a.out */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
308 return -1;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
311 close (new);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
312 if (a_out >= 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
313 close (a_out);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
314 mark_x (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
315 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
316 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
317
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
318 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
319 * make_hdr
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
320 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
321 * Make the header in the new a.out from the header in core.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
322 * Modify the text and data sizes.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
323 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
324 static int
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
325 make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
326 int new, a_out;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
327 unsigned data_start, bss_start, entry_address;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
328 char *a_name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
329 char *new_name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
330 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
331 register int scns;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
332 unsigned int bss_end;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
334 struct scnhdr section[MAX_SECTIONS];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
335 struct scnhdr * f_thdr; /* Text section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
336 struct scnhdr * f_dhdr; /* Data section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
337 struct scnhdr * f_bhdr; /* Bss section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
338 struct scnhdr * f_lhdr; /* Loader section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
339 struct scnhdr * f_tchdr; /* Typechk section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
340 struct scnhdr * f_dbhdr; /* Debug section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
341 struct scnhdr * f_xhdr; /* Except section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
342
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
343 load_scnptr = orig_load_scnptr = lnnoptr = 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
344 pagemask = getpagesize () - 1;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
345
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
346 /* Adjust text/data boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
347 #ifdef NO_REMAP
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
348 data_start = (long) start_of_data ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
349 #endif /* NO_REMAP */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
350 data_start = ADDR_CORRECT (data_start);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
351
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
352 #ifdef SEGMENT_MASK
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
353 data_start = data_start & ~SEGMENT_MASK; /* (Down) to segment boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
354 #else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
355 data_start = data_start & ~pagemask; /* (Down) to page boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
356 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
357
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
358
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
359 bss_end = ADDR_CORRECT (sbrk (0)) + pagemask;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
360 bss_end &= ~ pagemask;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
361 /* Adjust data/bss boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
362 if (bss_start != 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
364 bss_start = (ADDR_CORRECT (bss_start) + pagemask);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
365 /* (Up) to page bdry. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
366 bss_start &= ~ pagemask;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
367 if (bss_start > bss_end)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
368 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
369 ERROR1 ("unexec: Specified bss_start (%u) is past end of program",
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
370 bss_start);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
371 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 }
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
373 else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
374 bss_start = bss_end;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
376 if (data_start > bss_start) /* Can't have negative data size. */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
378 ERROR2 ("unexec: data_start (%u) can't be greater than bss_start (%u)",
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
379 data_start, bss_start);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
382 #ifdef COFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
383 /* Salvage as much info from the existing file as possible */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
384 block_copy_start = 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
385 f_thdr = NULL; f_dhdr = NULL; f_bhdr = NULL;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
386 f_lhdr = NULL; f_tchdr = NULL; f_dbhdr = NULL; f_xhdr = NULL;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
387 if (a_out >= 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
388 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
389 if (read (a_out, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
390 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
391 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
392 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
393 block_copy_start += sizeof (f_hdr);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
394 if (f_hdr.f_opthdr > 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
395 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
396 if (read (a_out, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
397 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
398 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
399 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
400 block_copy_start += sizeof (f_ohdr);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
401 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
402 if (f_hdr.f_nscns > MAX_SECTIONS)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
403 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
404 ERROR0 ("unexec: too many section headers -- increase MAX_SECTIONS");
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
405 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
406 /* Loop through section headers */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
407 for (scns = 0; scns < f_hdr.f_nscns; scns++) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
408 struct scnhdr *s = &section[scns];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
409 if (read (a_out, s, sizeof (*s)) != sizeof (*s))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
410 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
411 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
412 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
413 if (s->s_scnptr > 0L)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
414 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
415 if (block_copy_start < s->s_scnptr + s->s_size)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
416 block_copy_start = s->s_scnptr + s->s_size;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
417 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
418
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
419 #define CHECK_SCNHDR(ptr, name, flags) \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
420 if (strcmp(s->s_name, name) == 0) { \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
421 if (s->s_flags != flags) { \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
422 fprintf(stderr, "unexec: %x flags where %x expected in %s section.\n", \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
423 s->s_flags, flags, name); \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
424 } \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
425 if (ptr) { \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
426 fprintf(stderr, "unexec: duplicate section header for section %s.\n", \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
427 name); \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
428 } \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
429 ptr = s; \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
430 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
431 CHECK_SCNHDR(f_thdr, _TEXT, STYP_TEXT);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
432 CHECK_SCNHDR(f_dhdr, _DATA, STYP_DATA);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
433 CHECK_SCNHDR(f_bhdr, _BSS, STYP_BSS);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
434 CHECK_SCNHDR(f_lhdr, _LOADER, STYP_LOADER);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
435 CHECK_SCNHDR(f_dbhdr, _DEBUG, STYP_DEBUG);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
436 CHECK_SCNHDR(f_tchdr, _TYPCHK, STYP_TYPCHK);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
437 CHECK_SCNHDR(f_xhdr, _EXCEPT, STYP_EXCEPT);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
438 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
439
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
440 if (f_thdr == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
441 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
442 ERROR1 ("unexec: couldn't find \"%s\" section", _TEXT);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
443 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
444 if (f_dhdr == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
445 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
446 ERROR1 ("unexec: couldn't find \"%s\" section", _DATA);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
447 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
448 if (f_bhdr == 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
449 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
450 ERROR1 ("unexec: couldn't find \"%s\" section", _BSS);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
451 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
452 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
453 else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
454 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
455 ERROR0 ("can't build a COFF file from scratch yet");
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
456 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
457 orig_data_scnptr = f_dhdr->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
458 orig_load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
460 /* Now we alter the contents of all the f_*hdr variables
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
461 to correspond to what we want to dump. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
462 f_hdr.f_flags |= (F_RELFLG | F_EXEC); /* Why? */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
463 #ifdef EXEC_MAGIC
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
464 f_ohdr.magic = EXEC_MAGIC;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
465 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
466 #ifndef NO_REMAP
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
467 f_ohdr.tsize = data_start - f_ohdr.text_start;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
468 f_ohdr.text_start = (long) start_of_text ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
469 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
470 f_ohdr.dsize = bss_start - ((unsigned) &_data);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
471 f_ohdr.bsize = bss_end - bss_start;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
473 f_dhdr->s_size = f_ohdr.dsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
474 f_bhdr->s_size = f_ohdr.bsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
475 f_bhdr->s_paddr = f_ohdr.dsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
476 f_bhdr->s_vaddr = f_ohdr.dsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
477
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
478 /* fix scnptr's */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
479 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
480 long ptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
481
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
482 for (scns = 0; scns < f_hdr.f_nscns; scns++) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
483 struct scnhdr *s = &section[scns];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
484 if (scns == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
485 ptr = s->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
486
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
487 if (s->s_scnptr != 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
488 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
489 s->s_scnptr = ptr;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
492 if ((s->s_flags & 0xffff) == STYP_PAD)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
494 /*
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
495 * the text_start should probably be o_algntext but that doesn't
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
496 * seem to change
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
497 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
498 if (f_ohdr.text_start != 0) /* && scns != 0 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
499 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
500 s->s_size = 512 - (s->s_scnptr % 512);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
501 if (s->s_size == 512)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
502 s->s_size = 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
503 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
505
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
506 ptr = ptr + s->s_size;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
507 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
508
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
509 bias = ptr - block_copy_start;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
510 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
511
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
512 /* fix other pointers */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
513 for (scns = 0; scns < f_hdr.f_nscns; scns++) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
514 struct scnhdr *s = &section[scns];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
515
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
516 if (s->s_relptr != 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
517 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
518 s->s_relptr += bias;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
519 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
520 if (s->s_lnnoptr != 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
521 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
522 if (lnnoptr == 0) lnnoptr = s->s_lnnoptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
523 s->s_lnnoptr += bias;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
524 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
525 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
526
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
527 if (f_hdr.f_symptr > 0L)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
528 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
529 f_hdr.f_symptr += bias;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
530 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
532 data_st = data_start;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
533 text_scnptr = f_thdr->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
534 data_scnptr = f_dhdr->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
535 load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
536 block_copy_start = orig_load_scnptr;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
538 #ifdef ADJUST_EXEC_HEADER
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
539 ADJUST_EXEC_HEADER
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
540 #endif /* ADJUST_EXEC_HEADER */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
541
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
542 if (write (new, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
543 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
544 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
545 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
546
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
547 if (f_hdr.f_opthdr > 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
548 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
549 if (write (new, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
551 PERROR (new_name);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
554
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
555 for (scns = 0; scns < f_hdr.f_nscns; scns++) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
556 struct scnhdr *s = &section[scns];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
557 if (write (new, s, sizeof (*s)) != sizeof (*s))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
558 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
559 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
560 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
561 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
562
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
563 return (0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
564
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
565 #endif /* COFF */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
566 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
567
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
568 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
569
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
570 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
571 * Copy the text and data segments from memory to the new a.out
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
572 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
573 static int
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
574 copy_text_and_data (new)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
575 int new;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
576 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
577 register char *end;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
578 register char *ptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
579
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
580 lseek (new, (long) text_scnptr, 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
581 ptr = start_of_text () + text_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
582 end = ptr + f_ohdr.tsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
583 write_segment (new, ptr, end);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
584
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
585 lseek (new, (long) data_scnptr, 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
586 ptr = (char *) &_data;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
587 end = ptr + f_ohdr.dsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
588 write_segment (new, ptr, end);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
589
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
590 return 0;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
593 write_segment (new, ptr, end)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
594 int new;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
595 register char *ptr, *end;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
596 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
597 register int i, nwrite, ret;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
598 char buf[80];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
599 extern int errno;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
600 char zeros[128];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
601
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
602 bzero (zeros, sizeof zeros);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
603
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
604 for (i = 0; ptr < end;)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
605 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
606 /* distance to next multiple of 128. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
607 nwrite = (((int) ptr + 128) & -128) - (int) ptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
608 /* But not beyond specified end. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
609 if (nwrite > end - ptr) nwrite = end - ptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
610 ret = write (new, ptr, nwrite);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
611 /* If write gets a page fault, it means we reached
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
612 a gap between the old text segment and the old data segment.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
613 This gap has probably been remapped into part of the text segment.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
614 So write zeros for it. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
615 if (ret == -1 && errno == EFAULT)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
616 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
617 write (new, zeros, nwrite);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
618 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
619 else if (nwrite != ret)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
620 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
621 sprintf (buf,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
622 "unexec write failure: addr 0x%x, fileno %d, size 0x%x, wrote 0x%x, errno %d",
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
623 ptr, new, nwrite, ret, errno);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
624 PERROR (buf);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
625 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
626 i += nwrite;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
627 ptr += nwrite;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
628 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
629 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
630
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
631 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
632 * copy_sym
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
633 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
634 * Copy the relocation information and symbol table from the a.out to the new
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
635 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
636 static int
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
637 copy_sym (new, a_out, a_name, new_name)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
638 int new, a_out;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
639 char *a_name, *new_name;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
641 char page[1024];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
642 int n;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
643
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
644 if (a_out < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
645 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
646
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
647 if (SYMS_START == 0L)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
648 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
649
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
650 if (lnnoptr && lnnoptr < SYMS_START) /* if there is line number info */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
651 lseek (a_out, lnnoptr, 0); /* start copying from there */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
652 else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
653 lseek (a_out, SYMS_START, 0); /* Position a.out to symtab. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
654
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
655 while ((n = read (a_out, page, sizeof page)) > 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
656 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
657 if (write (new, page, n) != n)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
658 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
659 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
660 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
661 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
662 if (n < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
663 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
664 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
665 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
666 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
667 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
668
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
669 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
670 * mark_x
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
671 *
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 560
diff changeset
672 * After successfully building the new a.out, mark it executable
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
673 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
674 static void
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
675 mark_x (name)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
676 char *name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
677 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
678 struct stat sbuf;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
679 int um;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
680 int new = 0; /* for PERROR */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
681
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
682 um = umask (777);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
683 umask (um);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
684 if (stat (name, &sbuf) == -1)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
685 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
686 PERROR (name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
687 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
688 sbuf.st_mode |= 0111 & ~um;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
689 if (chmod (name, sbuf.st_mode) == -1)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
690 PERROR (name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
691 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
692
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
693 /*
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
694 * If the COFF file contains a symbol table and a line number section,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
695 * then any auxiliary entries that have values for x_lnnoptr must
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
696 * be adjusted by the amount that the line number section has moved
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
697 * in the file (bias computed in make_hdr). The #@$%&* designers of
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
698 * the auxiliary entry structures used the absolute file offsets for
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
699 * the line number entry rather than an offset from the start of the
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
700 * line number section!
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
701 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
702 * When I figure out how to scan through the symbol table and pick out
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
703 * the auxiliary entries that need adjustment, this routine will
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
704 * be fixed. As it is now, all such entries are wrong and sdb
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
705 * will complain. Fred Fish, UniSoft Systems Inc.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
706 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
707
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
708 #ifdef COFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
709
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
710 /* This function is probably very slow. Instead of reopening the new
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
711 file for input and output it should copy from the old to the new
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
712 using the two descriptors already open (WRITEDESC and READDESC).
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
713 Instead of reading one small structure at a time it should use
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
714 a reasonable size buffer. But I don't have time to work on such
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
715 things, so I am installing it as submitted to me. -- RMS. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
716
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
717 adjust_lnnoptrs (writedesc, readdesc, new_name)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
718 int writedesc;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
719 int readdesc;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
720 char *new_name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
721 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
722 register int nsyms;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
723 register int new;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
724 #ifdef amdahl_uts
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
725 SYMENT symentry;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
726 AUXENT auxentry;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
727 #else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
728 struct syment symentry;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
729 union auxent auxentry;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
730 #endif
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
732 if (!lnnoptr || !f_hdr.f_symptr)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
733 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
734
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
735 if ((new = open (new_name, 2)) < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
736 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
737 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
738 return -1;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
739 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
740
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
741 lseek (new, f_hdr.f_symptr, 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
742 for (nsyms = 0; nsyms < f_hdr.f_nsyms; nsyms++)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
743 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
744 read (new, &symentry, SYMESZ);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
745 if (symentry.n_numaux)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
746 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
747 read (new, &auxentry, AUXESZ);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
748 nsyms++;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
749 if (ISFCN (symentry.n_type)) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
750 auxentry.x_sym.x_fcnary.x_fcn.x_lnnoptr += bias;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
751 lseek (new, -AUXESZ, 1);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
752 write (new, &auxentry, AUXESZ);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
753 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
754 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
755 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
756 close (new);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
757 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
758
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
759 #endif /* COFF */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
760
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
761 #ifdef XCOFF
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
762
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
763 /* It is probably a false economy to optimise this routine (it used to
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
764 read one LDREL and do do two lseeks per iteration) but the wrath of
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
765 RMS (see above :-) would be too much to bear */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
766
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
767 unrelocate_symbols (new, a_out, a_name, new_name)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
768 int new, a_out;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
769 char *a_name, *new_name;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
770 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
771 register int i;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
772 register int l;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
773 register LDREL *ldrel;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
774 LDHDR ldhdr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
775 LDREL ldrel_buf [20];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
776 ulong t_start = (ulong) &_text;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
777 ulong d_start = (ulong) &_data;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
778 int * p;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
779 int dirty;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
780
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
781 if (load_scnptr == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
782 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
783
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
784 lseek (a_out, orig_load_scnptr, 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
785 if (read (a_out, &ldhdr, sizeof (ldhdr)) != sizeof (ldhdr))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
786 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
787 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
788 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
789
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
790 #define SYMNDX_TEXT 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
791 #define SYMNDX_DATA 1
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
792 #define SYMNDX_BSS 2
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
793 l = 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
794 for (i = 0; i < ldhdr.l_nreloc; i++, l--, ldrel++)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
795 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
796 if (l == 0) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
797 lseek (a_out,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
798 orig_load_scnptr + LDHDRSZ + LDSYMSZ*ldhdr.l_nsyms + LDRELSZ*i,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
799 0);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
800
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
801 l = ldhdr.l_nreloc - i;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
802 if (l > sizeof (ldrel_buf) / LDRELSZ)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
803 l = sizeof (ldrel_buf) / LDRELSZ;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
804
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
805 if (read (a_out, ldrel_buf, l * LDRELSZ) != l * LDRELSZ)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
806 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
807 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
808 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
809 ldrel = ldrel_buf;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
810 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
811 dirty = 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
812
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
813 /* this code may not be necessary */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
814 /* I originally had == in the "assignment" and it still unrelocated */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
815
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
816 /* move the BSS loader symbols to the DATA segment */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
817 if (ldrel->l_rsecnm == f_ohdr.o_snbss)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
818 ldrel->l_rsecnm = f_ohdr.o_sndata, dirty++;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
819
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
820 if (ldrel->l_symndx == SYMNDX_BSS)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
821 ldrel->l_symndx = SYMNDX_DATA, dirty++;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
822
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
823 if (dirty)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
824 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
825 lseek (new,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
826 load_scnptr + LDHDRSZ + LDSYMSZ*ldhdr.l_nsyms + LDRELSZ*i,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
827 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
828
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
829 if (write (new, ldrel, LDRELSZ) != LDRELSZ)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
830 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
831 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
832 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
833 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
834
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
835 if (ldrel->l_rsecnm == f_ohdr.o_sndata)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
836 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
837 int orig_int;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
838
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
839 lseek (a_out, orig_data_scnptr + ldrel->l_vaddr, 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
840
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
841 if (read (a_out, (void *) &orig_int, sizeof (orig_int)) != sizeof (orig_int))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
842 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
843 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
844 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
845
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
846 switch (ldrel->l_symndx) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
847 case SYMNDX_TEXT:
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
848 p = (int *) (d_start + ldrel->l_vaddr);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
849 orig_int = * p - (t_start - f_ohdr.text_start);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
850 break;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
851
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
852 case SYMNDX_DATA:
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
853 case SYMNDX_BSS:
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
854 p = (int *) (d_start + ldrel->l_vaddr);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
855 orig_int = * p - (d_start - f_ohdr.data_start);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
856 break;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
857 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
858
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
859 lseek (new, data_scnptr + ldrel->l_vaddr, 0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
860 if (write (new, (void *) &orig_int, sizeof (orig_int)) != sizeof (orig_int))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
861 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
862 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
863 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
864 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
865 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 }
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
867 #endif /* XCOFF */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
868
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
869 #endif /* not CANNOT_UNEXEC */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
870
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
871 #endif /* not CANNOT_DUMP */