Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
10 | ||
11 | MSG BADNAM; | |
12 | MSG BADMAG; | |
13 | ||
14 | MAP txtmap; | |
15 | MAP datmap; | |
16 | SYMSLAVE *symvec; | |
17 | INT wtflag; | |
18 | INT fcor; | |
19 | INT fsym; | |
20 | L_INT maxfile; | |
21 | L_INT maxstor; | |
22 | L_INT txtsiz; | |
23 | L_INT datsiz; | |
24 | L_INT datbas; | |
25 | L_INT stksiz; | |
26 | STRING errflg; | |
27 | INT magic; | |
28 | L_INT symbas; | |
29 | L_INT symnum; | |
30 | L_INT entrypt; | |
31 | ||
32 | INT argcount; | |
33 | INT signo; | |
34 | POS corhdr[512]; | |
35 | POS *endhdr &corhdr[512]; | |
36 | ||
37 | STRING symfil "a.out"; | |
38 | STRING corfil "core"; | |
39 | ||
40 | #define TXTHDRSIZ (sizeof(txthdr)) | |
41 | ||
42 | setsym() | |
43 | { | |
44 | INT relflg; | |
45 | INT symval, symflg; | |
46 | SYMSLAVE *symptr; | |
47 | SYMPTR symp; | |
48 | TXTHDR txthdr; | |
49 | ||
50 | fsym=getfile(symfil,1); | |
51 | txtmap.ufd=fsym; | |
52 | IF read(fsym, txthdr, TXTHDRSIZ)==TXTHDRSIZ | |
53 | THEN magic=txthdr[0]; | |
54 | IF magic!=0411 ANDF magic!=0410 ANDF magic!=0407 ANDF magic!=0405 | |
55 | THEN magic=0; | |
56 | ELSE symnum=txthdr[4]/SYMTABSIZ; | |
57 | txtsiz=txthdr[1]; | |
58 | datsiz=txthdr[2]; | |
59 | symbas=txtsiz+datsiz; | |
60 | txtmap.b1=0; | |
61 | txtmap.e1=(magic==0407?symbas:txtsiz); | |
62 | txtmap.f1 = TXTHDRSIZ; | |
63 | txtmap.b2=datbas=(magic==0410?round(txtsiz,TXTRNDSIZ):0); | |
64 | txtmap.e2=txtmap.b2+(magic==0407?symbas:datsiz); | |
65 | txtmap.f2 = TXTHDRSIZ+(magic==0407?0:txtmap.e1); | |
66 | entrypt=txthdr[5]; | |
67 | relflg=txthdr[7]; | |
68 | IF relflg!=1 THEN symbas =<< 1; FI | |
69 | symbas += TXTHDRSIZ; | |
70 | ||
71 | /* set up symvec */ | |
72 | symvec=sbrk(shorten((1+symnum))*sizeof (SYMSLAVE)); | |
73 | IF (symptr=symvec)==-1 | |
74 | THEN printf("%s\n",BADNAM); | |
75 | symptr=symvec=sbrk(sizeof (SYMSLAVE)); | |
76 | ELSE symset(); | |
77 | WHILE (symp=symget()) ANDF errflg==0 | |
78 | DO symval=symp->symv; symflg=symp->symf; | |
79 | symptr->valslave=symval; | |
80 | symptr->typslave=SYMTYPE(symflg); | |
81 | symptr++; | |
82 | OD | |
83 | FI | |
84 | symptr->typslave=ESYM; | |
85 | FI | |
86 | FI | |
87 | IF magic==0 THEN txtmap.e1=maxfile; FI | |
88 | } | |
89 | ||
90 | setcor() | |
91 | { | |
92 | fcor=getfile(corfil,2); | |
93 | datmap.ufd=fcor; | |
94 | IF read(fcor, corhdr, ctob(USIZE))==ctob(USIZE) | |
95 | THEN txtsiz = corhdr->u_tsize << 6; | |
96 | datsiz = corhdr->u_dsize << 6; | |
97 | stksiz = corhdr->u_ssize << 6; | |
98 | datmap.b1 = datbas = (magic==0410?round(txtsiz,TXTRNDSIZ):0); | |
99 | datmap.e1=(magic==0407?txtsiz:datmap.b1)+datsiz; | |
100 | datmap.f1 = ctob(USIZE); | |
101 | datmap.b2 = maxstor-stksiz; | |
102 | datmap.e2 = maxstor; | |
103 | datmap.f2 = ctob(USIZE)+(magic==0410?datsiz:datmap.e1); | |
104 | IF magic ANDF magic!=corhdr[0].u_exdata.ux_mag | |
105 | THEN printf("%s\n",BADMAG); | |
106 | FI | |
107 | ELSE datmap.e1 = maxfile; | |
108 | FI | |
109 | } | |
110 | ||
111 | create(f) | |
112 | STRING f; | |
113 | { int fd; | |
114 | IF (fd=creat(f,0644))>=0 | |
115 | THEN close(fd); return(open(f,wtflag)); | |
116 | ELSE return(-1); | |
117 | FI | |
118 | } | |
119 | ||
120 | getfile(filnam,cnt) | |
121 | STRING filnam; | |
122 | { | |
123 | REG INT fsym; | |
124 | ||
125 | IF !eqstr("-",filnam) | |
126 | THEN fsym=open(filnam,wtflag); | |
127 | IF fsym<0 ANDF argcount>cnt | |
128 | THEN IF wtflag | |
129 | THEN fsym=create(filnam); | |
130 | FI | |
131 | IF fsym<0 | |
132 | THEN printf("cannot open `%s'\n", filnam); | |
133 | FI | |
134 | FI | |
135 | ELSE fsym = -1; | |
136 | FI | |
137 | return(fsym); | |
138 | } |