Mercurial > emacs
annotate src/unexaix.c @ 29473:80835e075d87
(display_line): Set row's and iterator's
starts_in_middle_of_char_p and ends_in_middle_of_char_p flags.
Set cursor even if row ends in the middle of a character.
(dump_glyph_row): Print values of new flags.
(redisplay_window) <cursor movement in unchanged window>: When
point has been moved forward, and PT is at the end of the cursor
row, don't place the cursor in the next row if the cursor row ends
in the middle of a character or at ZV.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 06 Jun 2000 20:02:39 +0000 |
parents | 9698de836607 |
children | 23a1cea22d13 |
rev | line source |
---|---|
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
1 /* Dump an executable image. |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
2 Copyright (C) 1985, 1986, 1987, 1988, 1999 Free Software Foundation, Inc. |
560 | 3 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
4 This file is part of GNU Emacs. |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
5 |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
6 GNU Emacs is free software; you can redistribute it and/or modify |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
7 it under the terms of the GNU General Public License as published by |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
9 any later version. |
560 | 10 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
11 GNU Emacs is distributed in the hope that it will be useful, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
14 GNU General Public License for more details. |
560 | 15 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
16 You should have received a copy of the GNU General Public License |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
17 along with GNU Emacs; see the file COPYING. If not, write to |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12244
diff
changeset
|
19 Boston, MA 02111-1307, USA. |
560 | 20 |
21 In other words, you are welcome to use, share and improve this program. | |
22 You are forbidden to forbid anyone else to use, share and improve | |
23 what you give them. Help stamp out software-hoarding! */ | |
24 | |
117
08356dc1077c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
110
diff
changeset
|
25 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
26 /* Originally based on the COFF unexec.c by Spencer W. Thomas. |
560 | 27 * |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
28 * Subsequently hacked on by |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
29 * Bill Mann <Bill_Man@praxisint.com> |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
30 * Andrew Vignaux <Andrew.Vignaux@comp.vuw.ac.nz> |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
31 * Mike Sperber <sperber@informatik.uni-tuebingen.de> |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
32 * |
560 | 33 * Synopsis: |
34 * unexec (new_name, a_name, data_start, bss_start, entry_address) | |
35 * char *new_name, *a_name; | |
36 * unsigned data_start, bss_start, entry_address; | |
37 * | |
38 * Takes a snapshot of the program and makes an a.out format file in the | |
39 * file named by the string argument new_name. | |
40 * If a_name is non-NULL, the symbol table will be taken from the given file. | |
41 * On some machines, an existing a_name file is required. | |
42 * | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
43 * data_start and entry_address are ignored. |
560 | 44 * |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
45 * bss_start indicates how much of the data segment is to be saved in the |
560 | 46 * a.out file and restored when the program is executed. It gives the lowest |
47 * unsaved address, and is rounded up to a page boundary. The default when 0 | |
48 * is given assumes that the entire data segment is to be stored, including | |
49 * the previous data and bss as well as any additional storage allocated with | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
50 * sbrk(2). |
560 | 51 * |
52 */ | |
53 | |
54 #ifndef emacs | |
55 #define PERROR(arg) perror (arg); return -1 | |
56 #else | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
3591
diff
changeset
|
57 #include <config.h> |
560 | 58 #define PERROR(file) report_error (file, new) |
59 #endif | |
110 | 60 |
560 | 61 #include <a.out.h> |
62 /* Define getpagesize () if the system does not. | |
63 Note that this may depend on symbols defined in a.out.h | |
64 */ | |
65 #include "getpagesize.h" | |
110 | 66 |
560 | 67 #include <sys/types.h> |
68 #include <stdio.h> | |
69 #include <sys/stat.h> | |
70 #include <errno.h> | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
71 #include <unistd.h> |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
72 #include <fcntl.h> |
110 | 73 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
74 extern char *start_of_text (void); /* Start of text */ |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
75 extern char *start_of_data (void); /* Start of initialized data */ |
110 | 76 |
560 | 77 extern int _data; |
78 extern int _text; | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
79 |
560 | 80 #include <filehdr.h> |
81 #include <aouthdr.h> | |
82 #include <scnhdr.h> | |
83 #include <syms.h> | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
84 |
560 | 85 static struct filehdr f_hdr; /* File header */ |
86 static struct aouthdr f_ohdr; /* Optional file header (a.out) */ | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
87 static long bias; /* Bias to add for growth */ |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
88 static long lnnoptr; /* Pointer to line-number info within file */ |
110 | 89 |
560 | 90 static long text_scnptr; |
91 static long data_scnptr; | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
92 #define ALIGN(val, pwr) (((val) + ((1L<<(pwr))-1)) & ~((1L<<(pwr))-1)) |
560 | 93 static long load_scnptr; |
94 static long orig_load_scnptr; | |
95 static long orig_data_scnptr; | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
96 static int unrelocate_symbols (int, int, char *, char *); |
110 | 97 |
560 | 98 #ifndef MAX_SECTIONS |
99 #define MAX_SECTIONS 10 | |
100 #endif | |
110 | 101 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
102 static int adjust_lnnoptrs (int, int, char *); |
560 | 103 |
104 static int pagemask; | |
110 | 105 |
560 | 106 /* Correct an int which is the bit pattern of a pointer to a byte |
107 into an int which is the number of a byte. | |
108 This is a no-op on ordinary machines, but not on all. */ | |
109 | |
110 #ifndef ADDR_CORRECT /* Let m-*.h files override this definition */ | |
111 #define ADDR_CORRECT(x) ((char *)(x) - (char*)0) | |
112 #endif | |
113 | |
114 #ifdef emacs | |
8956
390019f3ab08
(report_error): Include reason in error message.
Karl Heuer <kwzh@gnu.org>
parents:
7867
diff
changeset
|
115 #include "lisp.h" |
110 | 116 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
117 static void |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
118 report_error (char *file, int fd) |
560 | 119 { |
120 if (fd) | |
121 close (fd); | |
8956
390019f3ab08
(report_error): Include reason in error message.
Karl Heuer <kwzh@gnu.org>
parents:
7867
diff
changeset
|
122 report_file_error ("Cannot unexec", Fcons (build_string (file), Qnil)); |
560 | 123 } |
124 #endif /* emacs */ | |
110 | 125 |
560 | 126 #define ERROR0(msg) report_error_1 (new, msg, 0, 0); return -1 |
127 #define ERROR1(msg,x) report_error_1 (new, msg, x, 0); return -1 | |
128 #define ERROR2(msg,x,y) report_error_1 (new, msg, x, y); return -1 | |
110 | 129 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
130 static void |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
131 report_error_1 (int fd, char *msg, int a1, int a2) |
110 | 132 { |
560 | 133 close (fd); |
134 #ifdef emacs | |
135 error (msg, a1, a2); | |
136 #else | |
137 fprintf (stderr, msg, a1, a2); | |
138 fprintf (stderr, "\n"); | |
139 #endif | |
140 } | |
110 | 141 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
142 static int make_hdr (int, int, unsigned, unsigned, unsigned, char *, char *); |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
143 static void mark_x (char *); |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
144 static int copy_text_and_data (int); |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
145 static int copy_sym (int, int, char *, char *); |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
146 static void write_segment (int, char *, char *); |
560 | 147 |
148 /* **************************************************************** | |
149 * unexec | |
150 * | |
151 * driving logic. | |
152 */ | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
153 int unexec (char *new_name, char *a_name, |
26556
9698de836607
(unexec): Use unsigned instead of uintptr_t because
Gerd Moellmann <gerd@gnu.org>
parents:
25564
diff
changeset
|
154 unsigned data_start, |
9698de836607
(unexec): Use unsigned instead of uintptr_t because
Gerd Moellmann <gerd@gnu.org>
parents:
25564
diff
changeset
|
155 unsigned bss_start, |
9698de836607
(unexec): Use unsigned instead of uintptr_t because
Gerd Moellmann <gerd@gnu.org>
parents:
25564
diff
changeset
|
156 unsigned entry_address) |
560 | 157 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
158 int new = -1, a_out = -1; |
560 | 159 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
160 if (a_name && (a_out = open (a_name, O_RDONLY)) < 0) |
110 | 161 { |
560 | 162 PERROR (a_name); |
163 } | |
164 if ((new = creat (new_name, 0666)) < 0) | |
165 { | |
166 PERROR (new_name); | |
110 | 167 } |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
168 if (make_hdr (new, a_out, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
169 data_start, bss_start, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
170 entry_address, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
171 a_name, new_name) < 0 |
560 | 172 || copy_text_and_data (new) < 0 |
173 || copy_sym (new, a_out, a_name, new_name) < 0 | |
174 || adjust_lnnoptrs (new, a_out, new_name) < 0 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
175 || unrelocate_symbols (new, a_out, a_name, new_name) < 0) |
110 | 176 { |
560 | 177 close (new); |
178 return -1; | |
110 | 179 } |
180 | |
560 | 181 close (new); |
182 if (a_out >= 0) | |
183 close (a_out); | |
184 mark_x (new_name); | |
185 return 0; | |
186 } | |
187 | |
188 /* **************************************************************** | |
189 * make_hdr | |
190 * | |
191 * Make the header in the new a.out from the header in core. | |
192 * Modify the text and data sizes. | |
193 */ | |
194 static int | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
195 make_hdr (int new, int a_out, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
196 unsigned data_start, unsigned bss_start, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
197 unsigned entry_address, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
198 char *a_name, char *new_name) |
560 | 199 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
200 int scns; |
560 | 201 unsigned int bss_end; |
110 | 202 |
560 | 203 struct scnhdr section[MAX_SECTIONS]; |
204 struct scnhdr * f_thdr; /* Text section header */ | |
205 struct scnhdr * f_dhdr; /* Data section header */ | |
206 struct scnhdr * f_bhdr; /* Bss section header */ | |
207 struct scnhdr * f_lhdr; /* Loader section header */ | |
208 struct scnhdr * f_tchdr; /* Typechk section header */ | |
209 struct scnhdr * f_dbhdr; /* Debug section header */ | |
210 struct scnhdr * f_xhdr; /* Except section header */ | |
211 | |
212 load_scnptr = orig_load_scnptr = lnnoptr = 0; | |
213 pagemask = getpagesize () - 1; | |
214 | |
215 /* Adjust text/data boundary. */ | |
216 data_start = (long) start_of_data (); | |
217 data_start = ADDR_CORRECT (data_start); | |
218 | |
219 data_start = data_start & ~pagemask; /* (Down) to page boundary. */ | |
220 | |
221 bss_end = ADDR_CORRECT (sbrk (0)) + pagemask; | |
222 bss_end &= ~ pagemask; | |
223 /* Adjust data/bss boundary. */ | |
224 if (bss_start != 0) | |
110 | 225 { |
560 | 226 bss_start = (ADDR_CORRECT (bss_start) + pagemask); |
227 /* (Up) to page bdry. */ | |
228 bss_start &= ~ pagemask; | |
229 if (bss_start > bss_end) | |
230 { | |
231 ERROR1 ("unexec: Specified bss_start (%u) is past end of program", | |
232 bss_start); | |
233 } | |
110 | 234 } |
560 | 235 else |
236 bss_start = bss_end; | |
110 | 237 |
560 | 238 if (data_start > bss_start) /* Can't have negative data size. */ |
110 | 239 { |
560 | 240 ERROR2 ("unexec: data_start (%u) can't be greater than bss_start (%u)", |
241 data_start, bss_start); | |
110 | 242 } |
243 | |
560 | 244 /* Salvage as much info from the existing file as possible */ |
245 f_thdr = NULL; f_dhdr = NULL; f_bhdr = NULL; | |
246 f_lhdr = NULL; f_tchdr = NULL; f_dbhdr = NULL; f_xhdr = NULL; | |
247 if (a_out >= 0) | |
110 | 248 { |
560 | 249 if (read (a_out, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr)) |
250 { | |
251 PERROR (a_name); | |
252 } | |
253 if (f_hdr.f_opthdr > 0) | |
254 { | |
255 if (read (a_out, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr)) | |
256 { | |
257 PERROR (a_name); | |
258 } | |
259 } | |
260 if (f_hdr.f_nscns > MAX_SECTIONS) | |
261 { | |
262 ERROR0 ("unexec: too many section headers -- increase MAX_SECTIONS"); | |
263 } | |
264 /* Loop through section headers */ | |
265 for (scns = 0; scns < f_hdr.f_nscns; scns++) { | |
266 struct scnhdr *s = §ion[scns]; | |
267 if (read (a_out, s, sizeof (*s)) != sizeof (*s)) | |
268 { | |
269 PERROR (a_name); | |
270 } | |
110 | 271 |
560 | 272 #define CHECK_SCNHDR(ptr, name, flags) \ |
273 if (strcmp(s->s_name, name) == 0) { \ | |
274 if (s->s_flags != flags) { \ | |
9181
b27c4cad21fb
(CHECK_SCNHDR, write_segment): Fix format/arg mismatch.
Karl Heuer <kwzh@gnu.org>
parents:
9037
diff
changeset
|
275 fprintf(stderr, "unexec: %lx flags where %x expected in %s section.\n", \ |
b27c4cad21fb
(CHECK_SCNHDR, write_segment): Fix format/arg mismatch.
Karl Heuer <kwzh@gnu.org>
parents:
9037
diff
changeset
|
276 (unsigned long)s->s_flags, flags, name); \ |
560 | 277 } \ |
278 if (ptr) { \ | |
279 fprintf(stderr, "unexec: duplicate section header for section %s.\n", \ | |
280 name); \ | |
281 } \ | |
282 ptr = s; \ | |
283 } | |
284 CHECK_SCNHDR(f_thdr, _TEXT, STYP_TEXT); | |
285 CHECK_SCNHDR(f_dhdr, _DATA, STYP_DATA); | |
286 CHECK_SCNHDR(f_bhdr, _BSS, STYP_BSS); | |
287 CHECK_SCNHDR(f_lhdr, _LOADER, STYP_LOADER); | |
288 CHECK_SCNHDR(f_dbhdr, _DEBUG, STYP_DEBUG); | |
289 CHECK_SCNHDR(f_tchdr, _TYPCHK, STYP_TYPCHK); | |
290 CHECK_SCNHDR(f_xhdr, _EXCEPT, STYP_EXCEPT); | |
291 } | |
292 | |
293 if (f_thdr == 0) | |
294 { | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
295 ERROR1 ("unexec: couldn't find \"%s\" section", (int) _TEXT); |
560 | 296 } |
297 if (f_dhdr == 0) | |
298 { | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
299 ERROR1 ("unexec: couldn't find \"%s\" section", (int) _DATA); |
560 | 300 } |
301 if (f_bhdr == 0) | |
110 | 302 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
303 ERROR1 ("unexec: couldn't find \"%s\" section", (int) _BSS); |
560 | 304 } |
305 } | |
306 else | |
307 { | |
308 ERROR0 ("can't build a COFF file from scratch yet"); | |
309 } | |
310 orig_data_scnptr = f_dhdr->s_scnptr; | |
311 orig_load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0; | |
110 | 312 |
560 | 313 /* Now we alter the contents of all the f_*hdr variables |
314 to correspond to what we want to dump. */ | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
315 |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
316 /* Indicate that the reloc information is no longer valid for ld (bind); |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
317 we only update it enough to fake out the exec-time loader. */ |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
318 f_hdr.f_flags |= (F_RELFLG | F_EXEC); |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
319 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
320 f_ohdr.dsize = bss_start - f_ohdr.data_start; |
560 | 321 f_ohdr.bsize = bss_end - bss_start; |
110 | 322 |
560 | 323 f_dhdr->s_size = f_ohdr.dsize; |
324 f_bhdr->s_size = f_ohdr.bsize; | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
325 f_bhdr->s_paddr = f_ohdr.data_start + f_ohdr.dsize; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
326 f_bhdr->s_vaddr = f_ohdr.data_start + f_ohdr.dsize; |
560 | 327 |
328 /* fix scnptr's */ | |
329 { | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
330 ulong ptr = section[0].s_scnptr; |
560 | 331 |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
332 bias = -1; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
333 for (scns = 0; scns < f_hdr.f_nscns; scns++) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
334 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
335 struct scnhdr *s = §ion[scns]; |
110 | 336 |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
337 if (s->s_flags & STYP_PAD) /* .pad sections omitted in AIX 4.1 */ |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
338 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
339 /* |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
340 * the text_start should probably be o_algntext but that doesn't |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
341 * seem to change |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
342 */ |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
343 if (f_ohdr.text_start != 0) /* && scns != 0 */ |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
344 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
345 s->s_size = 512 - (ptr % 512); |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
346 if (s->s_size == 512) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
347 s->s_size = 0; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
348 } |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
349 s->s_scnptr = ptr; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
350 } |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
351 else if (s->s_flags & STYP_DATA) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
352 s->s_scnptr = ptr; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
353 else if (!(s->s_flags & (STYP_TEXT | STYP_BSS))) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
354 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
355 if (bias == -1) /* if first section after bss */ |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
356 bias = ptr - s->s_scnptr; |
110 | 357 |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
358 s->s_scnptr += bias; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
359 ptr = s->s_scnptr; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
360 } |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
361 |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
362 ptr = ptr + s->s_size; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
363 } |
560 | 364 } |
365 | |
366 /* fix other pointers */ | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
367 for (scns = 0; scns < f_hdr.f_nscns; scns++) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
368 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
369 struct scnhdr *s = §ion[scns]; |
560 | 370 |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
371 if (s->s_relptr != 0) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
372 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
373 s->s_relptr += bias; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
374 } |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
375 if (s->s_lnnoptr != 0) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
376 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
377 if (lnnoptr == 0) lnnoptr = s->s_lnnoptr; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
378 s->s_lnnoptr += bias; |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
379 } |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
380 } |
110 | 381 |
560 | 382 if (f_hdr.f_symptr > 0L) |
383 { | |
384 f_hdr.f_symptr += bias; | |
385 } | |
110 | 386 |
560 | 387 text_scnptr = f_thdr->s_scnptr; |
388 data_scnptr = f_dhdr->s_scnptr; | |
389 load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0; | |
110 | 390 |
560 | 391 if (write (new, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr)) |
392 { | |
393 PERROR (new_name); | |
394 } | |
395 | |
396 if (f_hdr.f_opthdr > 0) | |
397 { | |
398 if (write (new, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr)) | |
110 | 399 { |
560 | 400 PERROR (new_name); |
110 | 401 } |
402 } | |
403 | |
560 | 404 for (scns = 0; scns < f_hdr.f_nscns; scns++) { |
405 struct scnhdr *s = §ion[scns]; | |
406 if (write (new, s, sizeof (*s)) != sizeof (*s)) | |
407 { | |
408 PERROR (new_name); | |
409 } | |
410 } | |
411 | |
412 return (0); | |
413 } | |
414 | |
415 /* **************************************************************** | |
416 | |
417 * | |
418 * Copy the text and data segments from memory to the new a.out | |
419 */ | |
420 static int | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
421 copy_text_and_data (int new) |
560 | 422 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
423 char *end; |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
424 char *ptr; |
560 | 425 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
426 lseek (new, (long) text_scnptr, SEEK_SET); |
560 | 427 ptr = start_of_text () + text_scnptr; |
428 end = ptr + f_ohdr.tsize; | |
429 write_segment (new, ptr, end); | |
430 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
431 lseek (new, (long) data_scnptr, SEEK_SET); |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
432 ptr = (char *) f_ohdr.data_start; |
560 | 433 end = ptr + f_ohdr.dsize; |
434 write_segment (new, ptr, end); | |
435 | |
436 return 0; | |
110 | 437 } |
438 | |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
439 #define UnexBlockSz (1<<12) /* read/write block size */ |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
440 static void |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
441 write_segment (int new, char *ptr, char *end) |
560 | 442 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
443 int i, nwrite, ret; |
560 | 444 char buf[80]; |
445 extern int errno; | |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
446 char zeros[UnexBlockSz]; |
110 | 447 |
560 | 448 for (i = 0; ptr < end;) |
449 { | |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
450 /* distance to next block. */ |
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
451 nwrite = (((int) ptr + UnexBlockSz) & -UnexBlockSz) - (int) ptr; |
560 | 452 /* But not beyond specified end. */ |
453 if (nwrite > end - ptr) nwrite = end - ptr; | |
454 ret = write (new, ptr, nwrite); | |
455 /* If write gets a page fault, it means we reached | |
456 a gap between the old text segment and the old data segment. | |
457 This gap has probably been remapped into part of the text segment. | |
458 So write zeros for it. */ | |
459 if (ret == -1 && errno == EFAULT) | |
460 { | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
461 memset (zeros, 0, nwrite); |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
462 write (new, zeros, nwrite); |
560 | 463 } |
464 else if (nwrite != ret) | |
465 { | |
466 sprintf (buf, | |
9181
b27c4cad21fb
(CHECK_SCNHDR, write_segment): Fix format/arg mismatch.
Karl Heuer <kwzh@gnu.org>
parents:
9037
diff
changeset
|
467 "unexec write failure: addr 0x%lx, fileno %d, size 0x%x, wrote 0x%x, errno %d", |
b27c4cad21fb
(CHECK_SCNHDR, write_segment): Fix format/arg mismatch.
Karl Heuer <kwzh@gnu.org>
parents:
9037
diff
changeset
|
468 (unsigned long)ptr, new, nwrite, ret, errno); |
560 | 469 PERROR (buf); |
470 } | |
471 i += nwrite; | |
472 ptr += nwrite; | |
473 } | |
474 } | |
475 | |
476 /* **************************************************************** | |
477 * copy_sym | |
478 * | |
479 * Copy the relocation information and symbol table from the a.out to the new | |
480 */ | |
481 static int | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
482 copy_sym (int new, int a_out, char *a_name, char *new_name) |
110 | 483 { |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
484 char page[UnexBlockSz]; |
560 | 485 int n; |
486 | |
487 if (a_out < 0) | |
488 return 0; | |
489 | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
490 if (orig_load_scnptr == 0L) |
560 | 491 return 0; |
492 | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
493 if (lnnoptr && lnnoptr < orig_load_scnptr) /* if there is line number info */ |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
494 lseek (a_out, lnnoptr, SEEK_SET); /* start copying from there */ |
560 | 495 else |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
496 lseek (a_out, orig_load_scnptr, SEEK_SET); /* Position a.out to symtab. */ |
560 | 497 |
498 while ((n = read (a_out, page, sizeof page)) > 0) | |
499 { | |
500 if (write (new, page, n) != n) | |
501 { | |
502 PERROR (new_name); | |
503 } | |
504 } | |
505 if (n < 0) | |
506 { | |
507 PERROR (a_name); | |
508 } | |
509 return 0; | |
510 } | |
511 | |
512 /* **************************************************************** | |
513 * mark_x | |
514 * | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
560
diff
changeset
|
515 * After successfully building the new a.out, mark it executable |
560 | 516 */ |
517 static void | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
518 mark_x (char *name) |
560 | 519 { |
520 struct stat sbuf; | |
521 int um; | |
522 int new = 0; /* for PERROR */ | |
110 | 523 |
560 | 524 um = umask (777); |
525 umask (um); | |
526 if (stat (name, &sbuf) == -1) | |
527 { | |
528 PERROR (name); | |
529 } | |
530 sbuf.st_mode |= 0111 & ~um; | |
531 if (chmod (name, sbuf.st_mode) == -1) | |
532 PERROR (name); | |
533 } | |
534 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
535 static int |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
536 adjust_lnnoptrs (int writedesc, int readdesc, char *new_name) |
560 | 537 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
538 int nsyms; |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
539 int naux; |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
540 int new; |
560 | 541 struct syment symentry; |
542 union auxent auxentry; | |
110 | 543 |
560 | 544 if (!lnnoptr || !f_hdr.f_symptr) |
545 return 0; | |
546 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
547 if ((new = open (new_name, O_RDWR)) < 0) |
560 | 548 { |
549 PERROR (new_name); | |
550 return -1; | |
551 } | |
552 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
553 lseek (new, f_hdr.f_symptr, SEEK_SET); |
560 | 554 for (nsyms = 0; nsyms < f_hdr.f_nsyms; nsyms++) |
555 { | |
556 read (new, &symentry, SYMESZ); | |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
557 if (symentry.n_sclass == C_BINCL || symentry.n_sclass == C_EINCL) |
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
558 { |
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
559 symentry.n_value += bias; |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
560 lseek (new, -SYMESZ, SEEK_CUR); |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
561 write (new, &symentry, SYMESZ); |
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
562 } |
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
563 |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
564 for (naux = symentry.n_numaux; naux-- != 0; ) |
560 | 565 { |
566 read (new, &auxentry, AUXESZ); | |
567 nsyms++; | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
568 if (naux != 0 /* skip csect auxentry (last entry) */ |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
569 && (symentry.n_sclass == C_EXT || symentry.n_sclass == C_HIDEXT)) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
570 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
571 auxentry.x_sym.x_fcnary.x_fcn.x_lnnoptr += bias; |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
572 lseek (new, -AUXESZ, SEEK_CUR); |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
573 write (new, &auxentry, AUXESZ); |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
574 } |
560 | 575 } |
576 } | |
577 close (new); | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
578 |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
579 return 0; |
560 | 580 } |
581 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
582 static int |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
583 unrelocate_symbols (int new, int a_out, char *a_name, char *new_name) |
560 | 584 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
585 int i; |
560 | 586 LDHDR ldhdr; |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
587 LDREL ldrel; |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
588 ulong t_reloc = (ulong) &_text - f_ohdr.text_start; |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
589 #ifndef ALIGN_DATA_RELOC |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
590 ulong d_reloc = (ulong) &_data - f_ohdr.data_start; |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
591 #else |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
592 /* This worked (and was needed) before AIX 4.2. |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
593 I have no idea why. -- Mike */ |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
594 ulong d_reloc = (ulong) &_data - ALIGN(f_ohdr.data_start, 2); |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
595 #endif |
560 | 596 int * p; |
597 | |
598 if (load_scnptr == 0) | |
599 return 0; | |
600 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
601 lseek (a_out, orig_load_scnptr, SEEK_SET); |
560 | 602 if (read (a_out, &ldhdr, sizeof (ldhdr)) != sizeof (ldhdr)) |
603 { | |
604 PERROR (new_name); | |
605 } | |
606 | |
607 #define SYMNDX_TEXT 0 | |
608 #define SYMNDX_DATA 1 | |
609 #define SYMNDX_BSS 2 | |
110 | 610 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
611 for (i = 0; i < ldhdr.l_nreloc; i++) |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
612 { |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
613 lseek (a_out, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
614 orig_load_scnptr + LDHDRSZ + LDSYMSZ*ldhdr.l_nsyms + LDRELSZ*i, |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
615 SEEK_SET); |
560 | 616 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
617 if (read (a_out, &ldrel, LDRELSZ) != LDRELSZ) |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
618 { |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
619 PERROR (a_name); |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
620 } |
560 | 621 |
622 /* move the BSS loader symbols to the DATA segment */ | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
623 if (ldrel.l_symndx == SYMNDX_BSS) |
14787
0c751a0e86cd
(write_segment,copy_sym): Increase blocking from 128 to 4k bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14782
diff
changeset
|
624 { |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
625 ldrel.l_symndx = SYMNDX_DATA; |
560 | 626 |
627 lseek (new, | |
628 load_scnptr + LDHDRSZ + LDSYMSZ*ldhdr.l_nsyms + LDRELSZ*i, | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
629 SEEK_SET); |
560 | 630 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
631 if (write (new, &ldrel, LDRELSZ) != LDRELSZ) |
560 | 632 { |
633 PERROR (new_name); | |
634 } | |
635 } | |
636 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
637 if (ldrel.l_rsecnm == f_ohdr.o_sndata) |
560 | 638 { |
639 int orig_int; | |
640 | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
641 lseek (a_out, |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
642 orig_data_scnptr + (ldrel.l_vaddr - f_ohdr.data_start), |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
643 SEEK_SET); |
560 | 644 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
645 if (read (a_out, (void *) &orig_int, sizeof (orig_int)) |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
646 != sizeof (orig_int)) |
560 | 647 { |
648 PERROR (a_name); | |
649 } | |
650 | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
651 p = (int *) (ldrel.l_vaddr + d_reloc); |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
652 |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
653 switch (ldrel.l_symndx) { |
560 | 654 case SYMNDX_TEXT: |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
655 orig_int = * p - t_reloc; |
560 | 656 break; |
657 | |
658 case SYMNDX_DATA: | |
659 case SYMNDX_BSS: | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
660 orig_int = * p - d_reloc; |
560 | 661 break; |
662 } | |
663 | |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
664 if (orig_int != * p) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
665 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
666 lseek (new, |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
667 data_scnptr + (ldrel.l_vaddr - f_ohdr.data_start), |
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
668 SEEK_SET); |
14782
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
669 if (write (new, (void *) &orig_int, sizeof (orig_int)) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
670 != sizeof (orig_int)) |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
671 { |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
672 PERROR (new_name); |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
673 } |
8988aa71854e
Handle both AIX 3.2 and 4.1 bind output.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
674 } |
560 | 675 } |
676 } | |
25564
d0383ec2061e
New version incorporating Michael Sperber's changes from XEmacs.
Dave Love <fx@gnu.org>
parents:
19924
diff
changeset
|
677 return 0; |
110 | 678 } |