void setcor(void) { int i; if (cormap) { for (i = 0; i < cormap->nsegs; i++) if (cormap->seg[i].inuse) close(cormap->seg[i].fd); } fcor = getfile(corfil, 2, ORDWR); if (fcor <= 0) { if (cormap) free(cormap); cormap = dumbmap(-1); return; } if(pid > 0) { /* provide addressability to executing process */ cormap = attachproc(pid, kflag, fcor, &fhdr); if (!cormap) cormap = dumbmap(-1); } else { cormap = newmap(cormap, 2); if (!cormap) cormap = dumbmap(-1); setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text"); setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data"); } kmsys(); return; }
void setsym(void) { Symbol s; if((fsym = getfile(symfil, 1, wtflag)) < 0) { symmap = dumbmap(-1); return; } if (crackhdr(fsym, &fhdr)) { machbytype(fhdr.type); symmap = loadmap(symmap, fsym, &fhdr); if (symmap == 0) symmap = dumbmap(fsym); if (syminit(fsym, &fhdr) < 0) dprint("%r\n"); if (mach->sbreg && lookup(0, mach->sbreg, &s)) mach->sb = s.value; } else symmap = dumbmap(fsym); }
void main(int argc, char **argv) { int omode; volatile int quiet; char *s; char *name; quiet = 0; name = 0; outputinit(); maxoff = MAXOFF; omode = OREAD; ARGBEGIN{ default: usage(); case 'A': abort(); case 'k': kflag = 1; break; case 'w': omode = ORDWR; break; case 'I': s = ARGF(); if(s == 0) dprint("missing -I argument\n"); else Ipath = s; break; case 'm': name = ARGF(); if(name == 0) dprint("missing -m argument\n"); break; case 'q': quiet = 1; break; }ARGEND attachargs(argc, argv, omode, !quiet); dotmap = dumbmap(-1); /* * show initial state and drop into the execution loop. */ notify(fault); setsym(); if(setjmp(env) == 0){ if (pid || corhdr) setcor(); /* could get error */ if (correg && !quiet) { dprint("%s\n", mach->exc(cormap, correg)); printpc(); } } setjmp(env); if (executing) delbp(); executing = FALSE; for (;;) { flushbuf(); if (errmsg) { dprint(errmsg); printc('\n'); errmsg = 0; exitflg = 0; } if (mkfault) { mkfault=0; printc('\n'); prints(DBNAME); } clrinp(); rdc(); reread(); if (eof) { if (infile == STDIN) done(); iclose(-1, 0); eof = 0; longjmp(env, 1); } exitflg = 0; command(0, 0); reread(); if (rdc() != '\n') error("newline expected"); } }