| 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 | } |