1
/* created 3/14/89 by Michael Newton */
2
/* %Caltech Submillimeter Observatory */
5
/* newton@csvax.caltech.edu */
7
/* The sun386i is a ss mostly BSD, but
8
uses COFF. There are some bugs, and I was not able to get help
9
through the support number.
10
I _hope_ this code works for you but
11
this code is supplied as is with NO WARRANTIES. */
14
/* We can't include bsd.h or att.h since neither is accurate (true?) */
29
/* We use a COFF derived MEM_SAVE_LOCALS, READ_HEADER, COPY_TO_SAVE */
30
/* All of this is from wfs's code... */
32
#define MEM_SAVE_LOCALS \
33
struct filehdr fileheader;\
35
struct scnhdr sectionheader;\
39
do{ fread(&fileheader, sizeof(fileheader), 1, original); \
40
fread(&header, sizeof(header), 1, original); \
41
data_begin = (char *)header.data_start; \
42
data_end = core_end; \
43
original_data = header.a_data; \
44
header.a_data = data_end - data_begin; \
45
diff = header.a_data - original_data; \
46
header.a_bss = sbrk(0) - core_end; \
47
fileheader.f_symptr += diff; \
48
fwrite(&fileheader, sizeof(fileheader), 1, save);\
49
fwrite(&header, sizeof(header), 1, save); \
50
fread(§ionheader, sizeof(sectionheader), 1, original); \
51
if (sectionheader.s_lnnoptr) \
52
sectionheader.s_lnnoptr += diff; \
53
fwrite(§ionheader, sizeof(sectionheader), 1, save); \
54
fread(§ionheader, sizeof(sectionheader), 1, original); \
55
sectionheader.s_size += diff; \
56
if (sectionheader.s_lnnoptr) \
57
sectionheader.s_lnnoptr += diff; \
58
fwrite(§ionheader, sizeof(sectionheader), 1, save); \
59
fread(§ionheader, sizeof(sectionheader), 1, original); \
60
sectionheader.s_paddr += diff; \
61
sectionheader.s_vaddr += diff; \
62
sectionheader.s_size = header.a_bss; \
63
if (sectionheader.s_lnnoptr) \
64
sectionheader.s_lnnoptr += diff; \
65
fwrite(§ionheader, sizeof(sectionheader), 1, save); \
66
for (n = 4; n <= fileheader.f_nscns; n++) { \
67
fread(§ionheader, sizeof(sectionheader), 1, original); \
68
if (sectionheader.s_scnptr) \
69
sectionheader.s_scnptr += diff; \
70
if (sectionheader.s_lnnoptr) \
71
sectionheader.s_lnnoptr += diff; \
72
fwrite(§ionheader, sizeof(sectionheader), 1, save); \
75
#define COPY_TO_SAVE \
84
#define FILECPY_HEADER filecpy(save, original, header.a_text)
92
/* Include <fcntl.h> rather than <sys/file.h> */
93
/* I'm not sure whether to include this or not -- MON */
94
/* ???? #define HAVE_FCNTL ???? */
96
#define NUMBER_OPEN_FILES _NFILE
98
#define SET_REAL_MAXPAGE real_maxpage = MAXPAGE
101
heap_end = sbrk(0); \
102
if (i = ((int)heap_end & (PAGESIZE - 1))) \
103
sbrk(PAGESIZE - i); \
104
heap_end = core_end = sbrk(0);
107
#define IF_ALLOCATE_ERR \
108
if (core_end != sbrk(0)) \
109
error("Someone allocated my memory!"); \
110
if (core_end != sbrk(PAGESIZE*(n - m)))
115
#define ADDITIONAL_FEATURES \
116
ADD_FEATURE("SUN"); \
119
/* ?? add "SYSTEM-V" to the above???? -- MON */
124
#define DATA_BEGIN (char *)N_DATADDR(header)
126
#define N_RELOFF N_TRELOFF
128
#define RELOC_FILE "rel_coff.c"
130
/* Begin for cmpinclude */
133
/* End for cmpinclude */