|
|
1.1 ! root 1: static char sccsid[] = "%Z%%M% %I% %G%"; ! 2: /* ! 3: * adb - routines to read a.out+core at startup ! 4: */ ! 5: #include "defs.h" ! 6: #include <stat.h> ! 7: ! 8: off_t datbas; /* offset of the base of the data segment */ ! 9: off_t stksiz; /* stack size in the core image */ ! 10: ! 11: char *symfil = "a.out"; ! 12: char *corfil = "core"; ! 13: ! 14: setsym() ! 15: { ! 16: off_t loc; ! 17: struct exec hdr; ! 18: register struct nlist *sp; ! 19: int ssiz; ! 20: char *strtab; ! 21: ! 22: fsym = getfile(symfil, 1); ! 23: txtmap.ufd = fsym; ! 24: if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr || ! 25: N_BADMAG(hdr)) { ! 26: txtmap.e1 = MAXFILE; ! 27: return; ! 28: } ! 29: filhdr = hdr; ! 30: loc = filhdr.a_text+filhdr.a_data; ! 31: txtmap.f1 = txtmap.f2 = N_TXTOFF(filhdr); ! 32: txtmap.b1 = 0; ! 33: switch (filhdr.a_magic) { ! 34: ! 35: case OMAGIC: ! 36: txtmap.e1 = loc; ! 37: txtmap.b2 = datbas = 0; ! 38: txtmap.e2 = loc; ! 39: break; ! 40: ! 41: case ZMAGIC: ! 42: case NMAGIC: ! 43: txtmap.e1 = filhdr.a_text; ! 44: txtmap.b2 = datbas = round(filhdr.a_text, PAGSIZ); ! 45: txtmap.e2 = datbas + filhdr.a_data; ! 46: txtmap.f2 += txtmap.e1; ! 47: } ! 48: loc = N_SYMOFF(filhdr); ! 49: symtab = (struct nlist *) malloc(filhdr.a_syms); ! 50: esymtab = &symtab[filhdr.a_syms / sizeof (struct nlist)]; ! 51: if (symtab == NULL) ! 52: goto nospac; ! 53: lseek(fsym, loc, 0); ! 54: if (filhdr.a_syms == 0) ! 55: goto nosymt; ! 56: /* SHOULD SQUISH OUT STABS HERE!!! */ ! 57: if (read(fsym, symtab, filhdr.a_syms) != filhdr.a_syms) ! 58: goto readerr; ! 59: if (read(fsym, &ssiz, sizeof (ssiz)) != sizeof (ssiz)) ! 60: goto oldfmt; ! 61: strtab = (char *) malloc(ssiz); ! 62: if (strtab == 0) ! 63: goto nospac; ! 64: *(int *)strtab = ssiz; ! 65: ssiz -= sizeof (ssiz); ! 66: if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz) ! 67: goto readerr; ! 68: for (sp = symtab; sp < esymtab; sp++) ! 69: if (sp->n_strx) ! 70: /* SHOULD PERFORM RANGE CHECK HERE */ ! 71: sp->n_un.n_name = strtab + sp->n_un.n_strx; ! 72: nosymt: ! 73: if (INKERNEL(filhdr.a_entry)) { ! 74: txtmap.b1 += KERNOFF; ! 75: txtmap.e1 += KERNOFF; ! 76: txtmap.b2 += KERNOFF; ! 77: txtmap.e2 += KERNOFF; ! 78: } ! 79: return; ! 80: readerr: ! 81: printf("Error reading symbol|string table\n"); ! 82: exit(1); ! 83: nospac: ! 84: printf("Not enough space for symbol|string table\n"); ! 85: exit(1); ! 86: oldfmt: ! 87: printf("Old format a.out - no string table\n"); ! 88: exit(1); ! 89: } ! 90: ! 91: setcor() ! 92: { ! 93: ! 94: if (fcor != -1 && INKERNEL(filhdr.a_magic)) { ! 95: struct stat stb; ! 96: ! 97: fstat(fcor, &stb); ! 98: if ((stb.st_mode&S_IFMT) == S_IFREG) { ! 99: datmap.b1 += KERNOFF; ! 100: datmap.e1 += KERNOFF; ! 101: } ! 102: return; ! 103: } ! 104: fcor = datmap.ufd = getfile(corfil,2); ! 105: if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) || ! 106: !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) { ! 107: datmap.e1 = MAXFILE; ! 108: return; ! 109: } ! 110: signo = u.u_arg[0]; ! 111: filhdr.a_text = ctob(u.u_tsize); ! 112: filhdr.a_data = ctob(u.u_dsize); ! 113: stksiz = ctob(u.u_ssize); ! 114: switch (filhdr.a_magic) { ! 115: ! 116: case OMAGIC: ! 117: datmap.b1 = 0; ! 118: datmap.e1 = filhdr.a_text+filhdr.a_data; ! 119: datmap.f2 = ctob(UPAGES) + datmap.e1; ! 120: break; ! 121: ! 122: case NMAGIC: ! 123: case ZMAGIC: ! 124: datmap.b1 = round(filhdr.a_text, PAGSIZ); ! 125: datmap.e1 = datmap.b1 + filhdr.a_data; ! 126: datmap.f2 = ctob(UPAGES) + filhdr.a_data; ! 127: break; ! 128: } ! 129: datbas = datmap.b1; ! 130: datmap.f1 = ctob(UPAGES); ! 131: datmap.b2 = MAXSTOR - stksiz; ! 132: datmap.e2 = MAXSTOR; ! 133: if (filhdr.a_magic && u.u_exdata.ux_mag && ! 134: filhdr.a_magic != u.u_exdata.ux_mag) ! 135: printf("corefile not from this program"); ! 136: } ! 137: ! 138: create(f) ! 139: char *f; ! 140: { ! 141: register int fd; ! 142: ! 143: fd = creat(f, 0644); ! 144: if (fd < 0) ! 145: return (-1); ! 146: close(fd); ! 147: return (open(f, wtflag)); ! 148: } ! 149: ! 150: getfile(filnam, cnt) ! 151: char *filnam; ! 152: { ! 153: register int fsym; ! 154: ! 155: if (eqstr(filnam, "-")) ! 156: return (-1); ! 157: fsym = open(filnam, wtflag); ! 158: if (fsym < 0 && xargc > cnt) { ! 159: if (wtflag) ! 160: fsym = create(filnam); ! 161: if (fsym < 0) ! 162: printf("cannot open `%s'\n", filnam); ! 163: } ! 164: return (fsym); ! 165: } ! 166: ! 167: setvar() ! 168: { ! 169: ! 170: var[varchk('b')] = datbas; ! 171: var[varchk('d')] = filhdr.a_data; ! 172: var[varchk('e')] = filhdr.a_entry; ! 173: var[varchk('m')] = filhdr.a_magic; ! 174: var[varchk('s')] = stksiz; ! 175: var[varchk('t')] = filhdr.a_text; ! 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.