annotate src/unexhp9k800.c @ 17846:c427501449a1

(display_text_line): Move the code to fill out the line with the newline's face to the end of the newline code. Add changes (commented out) to record ellipsis positions in charstarts.
author Richard M. Stallman <rms@gnu.org>
date Fri, 16 May 1997 07:32:59 +0000
parents 575a17a3c9fb
children b7aa6ac26872
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Unexec for HP 9000 Series 800 machines.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2 Bob Desinger <hpsemc!bd@hplabs.hp.com>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 Note that the GNU project considers support for HP operation a
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5 peripheral activity which should not be allowed to divert effort
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 from development of the GNU system. Changes in this code will be
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 installed when users send them in, but aside from that we don't
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 plan to think about it, or about whether other Emacs maintenance
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 might break it.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 Unexec creates a copy of the old a.out file, and replaces the old data
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 area with the current data area. When the new file is executed, the
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 process will see the same data structures and data values that the
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 original process had when unexec was called.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 Unlike other versions of unexec, this one copies symbol table and
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 debug information to the new a.out file. Thus, the new a.out file
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 may be debugged with symbolic debuggers.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 If you fix any bugs in this, I'd like to incorporate your fixes.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 Send them to uunet!hpda!hpsemc!jmorris or jmorris%hpsemc@hplabs.HP.COM.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 CAVEATS:
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 This routine saves the current value of all static and external
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 variables. This means that any data structure that needs to be
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 initialized must be explicitly reset. Variables will not have their
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 expected default values.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 Unfortunately, the HP-UX signal handler has internal initialization
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 flags which are not explicitly reset. Thus, for signals to work in
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 conjunction with this routine, the following code must executed when
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 the new process starts up.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
35 void _sigreturn ();
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 ...
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
37 sigsetreturn (_sigreturn);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 #include <stdio.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 #include <fcntl.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 #include <errno.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 #include <a.out.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45
7625
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
46 #ifdef emacs
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
47 #include <config.h>
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
48 #endif
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
49
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
50 #ifdef HPUX_USE_SHLIBS
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
51 #include <dl.h>
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
52 #endif
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
53
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
54 /* brk value to restore, stored as a global.
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
55 This is really used only if we used shared libraries. */
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
56 static long brk_on_dump = 0;
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
57
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
58 /* Called from main, if we use shared libraries. */
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
59 int
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
60 run_time_remap (ignored)
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
61 char *ignored;
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
62 {
15527
575a17a3c9fb (unexec): Cast result of sbrk.
Richard M. Stallman <rms@gnu.org>
parents: 7740
diff changeset
63 brk ((char *) brk_on_dump);
7625
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
64 }
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
65
7740
0ba4d34bcff4 (roundup): Undef before defining.
Richard M. Stallman <rms@gnu.org>
parents: 7625
diff changeset
66 #undef roundup
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
67 #define roundup(x,n) (((x) + ((n) - 1)) & ~((n) - 1)) /* n is power of 2 */
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
68 #define min(x,y) (((x) < (y)) ? (x) : (y))
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 /* Create a new a.out file, same as old but with current data space */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
73 unexec (new_name, old_name, new_end_of_text, dummy1, dummy2)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 char new_name[]; /* name of the new a.out file to be created */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 char old_name[]; /* name of the old a.out file */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 char *new_end_of_text; /* ptr to new edata/etext; NOT USED YET */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 int dummy1, dummy2; /* not used by emacs */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 int old, new;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 int old_size, new_size;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 struct header hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 struct som_exec_auxhdr auxhdr;
484
3165b2697c78 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 118
diff changeset
83 long i;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 /* For the greatest flexibility, should create a temporary file in
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 the same directory as the new file. When everything is complete,
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 rename the temp file to the new name.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 This way, a program could update its own a.out file even while
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 it is still executing. If problems occur, everything is still
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 intact. NOT implemented. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 /* Open the input and output a.out files */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
93 old = open (old_name, O_RDONLY);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 if (old < 0)
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
95 { perror (old_name); exit (1); }
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
96 new = open (new_name, O_CREAT|O_RDWR|O_TRUNC, 0777);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 if (new < 0)
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
98 { perror (new_name); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 /* Read the old headers */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
101 read_header (old, &hdr, &auxhdr);
7625
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
102
15527
575a17a3c9fb (unexec): Cast result of sbrk.
Richard M. Stallman <rms@gnu.org>
parents: 7740
diff changeset
103 brk_on_dump = (long) sbrk (0);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 /* Decide how large the new and old data areas are */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 old_size = auxhdr.exec_dsize;
484
3165b2697c78 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 118
diff changeset
107 /* I suspect these two statements are separate
3165b2697c78 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 118
diff changeset
108 to avoid a compiler bug in hpux version 8. */
15527
575a17a3c9fb (unexec): Cast result of sbrk.
Richard M. Stallman <rms@gnu.org>
parents: 7740
diff changeset
109 i = (long) sbrk (0);
484
3165b2697c78 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 118
diff changeset
110 new_size = i - auxhdr.exec_dmem;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 /* Copy the old file to the new, up to the data space */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
113 lseek (old, 0, 0);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
114 copy_file (old, new, auxhdr.exec_dfile);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 /* Skip the old data segment and write a new one */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
117 lseek (old, old_size, 1);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
118 save_data_space (new, &hdr, &auxhdr, new_size);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 /* Copy the rest of the file */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
121 copy_rest (old, new);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 /* Update file pointers since we probably changed size of data area */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
124 update_file_ptrs (new, &hdr, &auxhdr, auxhdr.exec_dfile, new_size-old_size);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 /* Save the modified header */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
127 write_header (new, &hdr, &auxhdr);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 /* Close the binary file */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
130 close (old);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
131 close (new);
1742
69e337909652 (unexec): Don't call exit, just return.
Richard M. Stallman <rms@gnu.org>
parents: 484
diff changeset
132 return 0;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 /* Save current data space in the file, update header. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
137 save_data_space (file, hdr, auxhdr, size)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 int file;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 struct header *hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 struct som_exec_auxhdr *auxhdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 int size;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 /* Write the entire data space out to the file */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
144 if (write (file, auxhdr->exec_dmem, size) != size)
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
145 { perror ("Can't save new data space"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 /* Update the header to reflect the new data size */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 auxhdr->exec_dsize = size;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 auxhdr->exec_bsize = 0;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
150 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152 /* Update the values of file pointers when something is inserted. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
154 update_file_ptrs (file, hdr, auxhdr, location, offset)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 int file;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 struct header *hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 struct som_exec_auxhdr *auxhdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
158 unsigned int location;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159 int offset;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 struct subspace_dictionary_record subspace;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 int i;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 /* Increase the overall size of the module */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 hdr->som_length += offset;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 /* Update the various file pointers in the header */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 #define update(ptr) if (ptr > location) ptr = ptr + offset
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
169 update (hdr->aux_header_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
170 update (hdr->space_strings_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
171 update (hdr->init_array_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
172 update (hdr->compiler_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
173 update (hdr->symbol_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
174 update (hdr->fixup_request_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
175 update (hdr->symbol_strings_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
176 update (hdr->unloadable_sp_location);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
177 update (auxhdr->exec_tfile);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
178 update (auxhdr->exec_dfile);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 /* Do for each subspace dictionary entry */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
181 lseek (file, hdr->subspace_location, 0);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182 for (i = 0; i < hdr->subspace_total; i++)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 {
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
184 if (read (file, &subspace, sizeof (subspace)) != sizeof (subspace))
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
185 { perror ("Can't read subspace record"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 /* If subspace has a file location, update it */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 if (subspace.initialization_length > 0
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 && subspace.file_loc_init_value > location)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 subspace.file_loc_init_value += offset;
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
192 lseek (file, -sizeof (subspace), 1);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
193 if (write (file, &subspace, sizeof (subspace)) != sizeof (subspace))
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
194 { perror ("Can't update subspace record"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 /* Do for each initialization pointer record */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 /* (I don't think it applies to executable files, only relocatables) */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200 #undef update
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 /* Read in the header records from an a.out file. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
205 read_header (file, hdr, auxhdr)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 int file;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 struct header *hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 struct som_exec_auxhdr *auxhdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 /* Read the header in */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
212 lseek (file, 0, 0);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
213 if (read (file, hdr, sizeof (*hdr)) != sizeof (*hdr))
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
214 { perror ("Couldn't read header from a.out file"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 if (hdr->a_magic != EXEC_MAGIC && hdr->a_magic != SHARE_MAGIC
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 && hdr->a_magic != DEMAND_MAGIC)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 {
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
219 fprintf (stderr, "a.out file doesn't have legal magic number\n");
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
220 exit (1);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
223 lseek (file, hdr->aux_header_location, 0);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
224 if (read (file, auxhdr, sizeof (*auxhdr)) != sizeof (*auxhdr))
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 {
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
226 perror ("Couldn't read auxiliary header from a.out file");
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
227 exit (1);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 /* Write out the header records into an a.out file. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
233 write_header (file, hdr, auxhdr)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 int file;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 struct header *hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 struct som_exec_auxhdr *auxhdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 /* Update the checksum */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
239 hdr->checksum = calculate_checksum (hdr);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 /* Write the header back into the a.out file */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
242 lseek (file, 0, 0);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
243 if (write (file, hdr, sizeof (*hdr)) != sizeof (*hdr))
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
244 { perror ("Couldn't write header to a.out file"); exit (1); }
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
245 lseek (file, hdr->aux_header_location, 0);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
246 if (write (file, auxhdr, sizeof (*auxhdr)) != sizeof (*auxhdr))
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
247 { perror ("Couldn't write auxiliary header to a.out file"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 /* Calculate the checksum of a SOM header record. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
252 calculate_checksum (hdr)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 struct header *hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 int checksum, i, *ptr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 checksum = 0; ptr = (int *) hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
259 for (i = 0; i < sizeof (*hdr) / sizeof (int) - 1; i++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 checksum ^= ptr[i];
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
262 return (checksum);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 /* Copy size bytes from the old file to the new one. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
267 copy_file (old, new, size)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 int new, old;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 int size;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 int len;
7625
ad2116571bc4 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 7619
diff changeset
272 int buffer[8192]; /* word aligned will be faster */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274 for (; size > 0; size -= len)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 {
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
276 len = min (size, sizeof (buffer));
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
277 if (read (old, buffer, len) != len)
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
278 { perror ("Read failure on a.out file"); exit (1); }
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
279 if (write (new, buffer, len) != len)
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
280 { perror ("Write failure in a.out file"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 /* Copy the rest of the file, up to EOF. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
286 copy_rest (old, new)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 int new, old;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 int buffer[4096];
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 int len;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 /* Copy bytes until end of file or error */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
293 while ((len = read (old, buffer, sizeof (buffer))) > 0)
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
294 if (write (new, buffer, len) != len) break;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 if (len != 0)
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
297 { perror ("Unable to copy the rest of the file"); exit (1); }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300 #ifdef DEBUG
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
301 display_header (hdr, auxhdr)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 struct header *hdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 struct som_exec_auxhdr *auxhdr;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 /* Display the header information (debug) */
7619
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
306 printf ("\n\nFILE HEADER\n");
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
307 printf ("magic number %d \n", hdr->a_magic);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
308 printf ("text loc %.8x size %d \n", auxhdr->exec_tmem, auxhdr->exec_tsize);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
309 printf ("data loc %.8x size %d \n", auxhdr->exec_dmem, auxhdr->exec_dsize);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
310 printf ("entry %x \n", auxhdr->exec_entry);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
311 printf ("Bss segment size %u\n", auxhdr->exec_bsize);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
312 printf ("\n");
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
313 printf ("data file loc %d size %d\n",
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
314 auxhdr->exec_dfile, auxhdr->exec_dsize);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
315 printf ("som_length %d\n", hdr->som_length);
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
316 printf ("unloadable sploc %d size %d\n",
078782db2675 Whitespace fixes.
Richard M. Stallman <rms@gnu.org>
parents: 1742
diff changeset
317 hdr->unloadable_sp_location, hdr->unloadable_sp_size);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 #endif /* DEBUG */