annotate src/unexencap.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents 376386a54a3c
children 04bc9d2f42c7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Waiting for papers! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 /* Synched up with: FSF 19.31. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 /*
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 * Do an unexec() for coff encapsulation. Uses the approach I took
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 * for AKCL, so don't be surprised if it doesn't look too much like
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 * the other unexec() routines. Assumes NO_REMAP. Should be easy to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 * adapt to the emacs style unexec() if that is desired, but this works
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 * just fine for me with GCC/GAS/GLD under System V. - Jordan
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 #include <sys/types.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 #include <sys/fcntl.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 #include <sys/file.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 #include <stdio.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 #include "/usr/gnu/lib/gcc/gcc-include/a.out.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 filecpy(to, from, n)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 FILE *to, *from;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 int n;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 char buffer[BUFSIZ];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 for (;;)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 if (n > BUFSIZ) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 fread(buffer, BUFSIZ, 1, from);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 fwrite(buffer, BUFSIZ, 1, to);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 n -= BUFSIZ;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 } else if (n > 0) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 fread(buffer, 1, n, from);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 fwrite(buffer, 1, n, to);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 } else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 /* ****************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 * unexec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 * driving logic.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 * ****************************************************************/
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 unexec (new_name, a_name, data_start, bss_start, entry_address)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 char *new_name, *a_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 unsigned data_start, bss_start, entry_address;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 struct coffheader header1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 struct coffscn *tp, *dp, *bp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 struct exec header;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 int stsize;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 char *original_file = a_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 char *save_file = new_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 char *data_begin, *data_end;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 int original_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 FILE *original, *save;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 int n;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 char *p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 extern char *sbrk();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 fclose(stdin);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 original = fopen(original_file, "r");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 if (stdin != original || original->_file != 0) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 fprintf(stderr, "unexec: Can't open the original file.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 exit(1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 setbuf(original, stdin_buf);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 fclose(stdout);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 unlink(save_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 n = open (save_file, O_CREAT|O_WRONLY, 0777);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 if (n != 1 || (save = fdopen(n, "w")) != stdout) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 fprintf(stderr, "unexec: Can't open the save file.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 exit(1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 setbuf(save, stdout_buf);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 fread(&header1, sizeof(header1), 1, original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 tp = &header1.scns[0];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 dp = &header1.scns[1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 bp = &header1.scns[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 fread(&header, sizeof(header), 1, original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 data_begin=(char *)N_DATADDR(header);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 data_end = sbrk(0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 original_data = header.a_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 header.a_data = data_end - data_begin;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 header.a_bss = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 dp->s_size = header.a_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 bp->s_paddr = dp->s_vaddr + dp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 bp->s_vaddr = bp->s_paddr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 bp->s_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 header1.tsize = tp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 header1.dsize = dp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 header1.bsize = bp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 fwrite(&header1, sizeof(header1), 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 fwrite(&header, sizeof(header), 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 filecpy(save, original, header.a_text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 for (n = header.a_data, p = data_begin; ; n -= BUFSIZ, p += BUFSIZ)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 if (n > BUFSIZ)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 fwrite(p, BUFSIZ, 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 else if (n > 0) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 fwrite(p, 1, n, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 } else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 fseek(original, original_data, 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 fread(&stsize, sizeof(stsize), 1, original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 fwrite(&stsize, sizeof(stsize), 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 filecpy(save, original, stsize - sizeof(stsize));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 fclose(original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 fclose(save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 }