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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
20
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
21 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
22 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
23 what you give them. Help stamp out software-hoarding! */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
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 *
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
46 * 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
47 * 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
48 * 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
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
51 *
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
54 #ifndef emacs
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
55 #define PERROR(arg) perror (arg); return -1
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
58 #define PERROR(file) report_error (file, new)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
59 #endif
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
61 #include <a.out.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
62 /* Define getpagesize () if the system does not.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
63 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
64 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
65 #include "getpagesize.h"
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
67 #include <sys/types.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
68 #include <stdio.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
69 #include <sys/stat.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
77 extern int _data;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
80 #include <filehdr.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
81 #include <aouthdr.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
82 #include <scnhdr.h>
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
85 static struct filehdr f_hdr; /* File header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
90 static long text_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
93 static long load_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
94 static long orig_load_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
98 #ifndef MAX_SECTIONS
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
99 #define MAX_SECTIONS 10
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
100 #endif
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
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 static int pagemask;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
106 /* 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
107 into an int which is the number of a byte.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
108 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
109
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
110 #ifndef ADDR_CORRECT /* Let m-*.h files override this definition */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
111 #define ADDR_CORRECT(x) ((char *)(x) - (char*)0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
112 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
113
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
119 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
120 if (fd)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
123 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
124 #endif /* emacs */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
126 #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
127 #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
128 #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
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
133 close (fd);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
134 #ifdef emacs
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
135 error (msg, a1, a2);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
136 #else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
137 fprintf (stderr, msg, a1, a2);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
138 fprintf (stderr, "\n");
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
139 #endif
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
140 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
147
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
148 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
149 * unexec
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
150 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
151 * driving logic.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
162 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
163 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
164 if ((new = creat (new_name, 0666)) < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
165 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
166 PERROR (new_name);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
172 || copy_text_and_data (new) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
173 || copy_sym (new, a_out, a_name, new_name) < 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
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 close (new);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
178 return -1;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
181 close (new);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
182 if (a_out >= 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
183 close (a_out);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
184 mark_x (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
185 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
186 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
187
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
188 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
189 * make_hdr
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
190 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
191 * 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
192 * Modify the text and data sizes.
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
193 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
201 unsigned int bss_end;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
203 struct scnhdr section[MAX_SECTIONS];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
204 struct scnhdr * f_thdr; /* Text section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
205 struct scnhdr * f_dhdr; /* Data section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
206 struct scnhdr * f_bhdr; /* Bss section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
207 struct scnhdr * f_lhdr; /* Loader section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
208 struct scnhdr * f_tchdr; /* Typechk section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
209 struct scnhdr * f_dbhdr; /* Debug section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
210 struct scnhdr * f_xhdr; /* Except section header */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
211
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
212 load_scnptr = orig_load_scnptr = lnnoptr = 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
213 pagemask = getpagesize () - 1;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
214
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
215 /* Adjust text/data boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
216 data_start = (long) start_of_data ();
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
217 data_start = ADDR_CORRECT (data_start);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
218
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
219 data_start = data_start & ~pagemask; /* (Down) to page boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
220
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
221 bss_end = ADDR_CORRECT (sbrk (0)) + pagemask;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
222 bss_end &= ~ pagemask;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
223 /* Adjust data/bss boundary. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
224 if (bss_start != 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
226 bss_start = (ADDR_CORRECT (bss_start) + pagemask);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
227 /* (Up) to page bdry. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
228 bss_start &= ~ pagemask;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
229 if (bss_start > bss_end)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
230 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
231 ERROR1 ("unexec: Specified bss_start (%u) is past end of program",
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
232 bss_start);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
233 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 }
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
235 else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
236 bss_start = bss_end;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
238 if (data_start > bss_start) /* Can't have negative data size. */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
240 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
241 data_start, bss_start);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
244 /* Salvage as much info from the existing file as possible */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
245 f_thdr = NULL; f_dhdr = NULL; f_bhdr = NULL;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
246 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
247 if (a_out >= 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
249 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
250 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
251 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
252 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
253 if (f_hdr.f_opthdr > 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
254 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
255 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
256 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
257 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
258 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
259 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
260 if (f_hdr.f_nscns > MAX_SECTIONS)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
261 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
262 ERROR0 ("unexec: too many section headers -- increase MAX_SECTIONS");
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
263 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
264 /* Loop through section headers */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
265 for (scns = 0; scns < f_hdr.f_nscns; scns++) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
266 struct scnhdr *s = &section[scns];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
267 if (read (a_out, s, sizeof (*s)) != sizeof (*s))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
268 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
269 PERROR (a_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
270 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
272 #define CHECK_SCNHDR(ptr, name, flags) \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
273 if (strcmp(s->s_name, name) == 0) { \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
277 } \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
278 if (ptr) { \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
279 fprintf(stderr, "unexec: duplicate section header for section %s.\n", \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
280 name); \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
281 } \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
282 ptr = s; \
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
283 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
284 CHECK_SCNHDR(f_thdr, _TEXT, STYP_TEXT);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
285 CHECK_SCNHDR(f_dhdr, _DATA, STYP_DATA);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
286 CHECK_SCNHDR(f_bhdr, _BSS, STYP_BSS);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
287 CHECK_SCNHDR(f_lhdr, _LOADER, STYP_LOADER);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
288 CHECK_SCNHDR(f_dbhdr, _DEBUG, STYP_DEBUG);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
289 CHECK_SCNHDR(f_tchdr, _TYPCHK, STYP_TYPCHK);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
290 CHECK_SCNHDR(f_xhdr, _EXCEPT, STYP_EXCEPT);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
291 }
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 if (f_thdr == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
296 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
297 if (f_dhdr == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
300 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
301 if (f_bhdr == 0)
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
304 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
305 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
306 else
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
307 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
308 ERROR0 ("can't build a COFF file from scratch yet");
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
309 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
310 orig_data_scnptr = f_dhdr->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
311 orig_load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
313 /* Now we alter the contents of all the f_*hdr variables
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
321 f_ohdr.bsize = bss_end - bss_start;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
323 f_dhdr->s_size = f_ohdr.dsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
327
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
328 /* fix scnptr's */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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 = &section[scns];
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
364 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
365
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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 = &section[scns];
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
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 if (f_hdr.f_symptr > 0L)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
383 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
384 f_hdr.f_symptr += bias;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
385 }
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
386
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
387 text_scnptr = f_thdr->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
388 data_scnptr = f_dhdr->s_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
389 load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
391 if (write (new, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
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 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
394 }
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 (f_hdr.f_opthdr > 0)
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 if (write (new, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399 {
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
400 PERROR (new_name);
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
404 for (scns = 0; scns < f_hdr.f_nscns; scns++) {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
405 struct scnhdr *s = &section[scns];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
406 if (write (new, s, sizeof (*s)) != sizeof (*s))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
407 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
408 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
409 }
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
412 return (0);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
413 }
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 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
416
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
417 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
418 * 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
419 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
427 ptr = start_of_text () + text_scnptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
428 end = ptr + f_ohdr.tsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
429 write_segment (new, ptr, end);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
433 end = ptr + f_ohdr.dsize;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
434 write_segment (new, ptr, end);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
435
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
436 return 0;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
437 }
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
444 char buf[80];
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
448 for (i = 0; ptr < end;)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
452 /* But not beyond specified end. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
453 if (nwrite > end - ptr) nwrite = end - ptr;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
454 ret = write (new, ptr, nwrite);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
455 /* If write gets a page fault, it means we reached
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
456 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
457 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
458 So write zeros for it. */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
459 if (ret == -1 && errno == EFAULT)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
463 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
464 else if (nwrite != ret)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
465 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
469 PERROR (buf);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
470 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
471 i += nwrite;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
472 ptr += nwrite;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
473 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
474 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
475
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
476 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
477 * copy_sym
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
478 *
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
479 * 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
480 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
485 int n;
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 (a_out < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
488 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
491 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
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 while ((n = read (a_out, page, sizeof page)) > 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 if (write (new, page, n) != n)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
501 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
502 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
503 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
504 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
505 if (n < 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
506 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
507 PERROR (a_name);
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 return 0;
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 /* ****************************************************************
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
513 * mark_x
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
516 */
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
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 struct stat sbuf;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
521 int um;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
522 int new = 0; /* for PERROR */
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
523
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
524 um = umask (777);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
525 umask (um);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
526 if (stat (name, &sbuf) == -1)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
527 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
528 PERROR (name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
529 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
530 sbuf.st_mode |= 0111 & ~um;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
531 if (chmod (name, sbuf.st_mode) == -1)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
532 PERROR (name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
533 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
541 struct syment symentry;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
542 union auxent auxentry;
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
543
560
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
544 if (!lnnoptr || !f_hdr.f_symptr)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
545 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
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 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
550 return -1;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
551 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
554 for (nsyms = 0; nsyms < f_hdr.f_nsyms; nsyms++)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
555 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
565 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
566 read (new, &auxentry, AUXESZ);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
575 }
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 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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
580 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
596 int * p;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
597
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
598 if (load_scnptr == 0)
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
599 return 0;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
602 if (read (a_out, &ldhdr, sizeof (ldhdr)) != sizeof (ldhdr))
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
603 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
604 PERROR (new_name);
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
607 #define SYMNDX_TEXT 0
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
608 #define SYMNDX_DATA 1
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
609 #define SYMNDX_BSS 2
110
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
621
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
626
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
627 lseek (new,
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
632 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
633 PERROR (new_name);
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
634 }
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
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
638 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
639 int orig_int;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
647 {
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
648 PERROR (a_name);
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
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
656 break;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
657
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
658 case SYMNDX_DATA:
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
661 break;
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
662 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
675 }
68111c4a3885 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
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
2968112113f9 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
678 }