123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /*
- * init routines
- */
- #include "defs.h"
- #include "fns.h"
- char *symfil;
- char *corfil;
- Map *symmap;
- Map *cormap;
- Map *dotmap;
- int fsym, fcor;
- static Fhdr fhdr;
- static int getfile(char*, int, int);
- 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
- 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;
- }
- Map *
- dumbmap(int fd)
- {
- Map *dumb;
- extern Mach mi386;
- extern Machdata i386mach;
- dumb = newmap(0, 1);
- setmap(dumb, fd, 0, 0xffffffff, 0, "data");
- if (!mach) /* default machine = 386 */
- mach = &mi386;
- if (!machdata)
- machdata = &i386mach;
- return dumb;
- }
- /*
- * set up maps for a direct process image (/proc)
- */
- void
- cmdmap(Map *map)
- {
- int i;
- char name[MAXSYM];
- extern char lastc;
- rdc();
- readsym(name);
- i = findseg(map, name);
- if (i < 0) /* not found */
- error("Invalid map name");
- if (expr(0)) {
- if (strcmp(name, "text") == 0)
- textseg(expv, &fhdr);
- map->seg[i].b = expv;
- } else
- error("Invalid base address");
- if (expr(0))
- map->seg[i].e = expv;
- else
- error("Invalid end address");
- if (expr(0))
- map->seg[i].f = expv;
- else
- error("Invalid file offset");
- if (rdc()=='?' && map == cormap) {
- if (fcor)
- close(fcor);
- fcor=fsym;
- corfil=symfil;
- cormap = symmap;
- } else if (lastc == '/' && map == symmap) {
- if (fsym)
- close(fsym);
- fsym=fcor;
- symfil=corfil;
- symmap=cormap;
- } else
- reread();
- }
- static int
- getfile(char *filnam, int cnt, int omode)
- {
- int f;
- if (filnam == 0)
- return -1;
- if (strcmp(filnam, "-") == 0)
- return 0;
- f = open(filnam, omode|OCEXEC);
- if(f < 0 && omode == ORDWR){
- f = open(filnam, OREAD|OCEXEC);
- if(f >= 0)
- dprint("%s open read-only\n", filnam);
- }
- if (f < 0 && xargc > cnt)
- if (wtflag)
- f = create(filnam, 1, 0666);
- if (f < 0) {
- dprint("cannot open `%s': %r\n", filnam);
- return -1;
- }
- return f;
- }
- void
- kmsys(void)
- {
- int i;
- i = findseg(symmap, "text");
- if (i >= 0) {
- symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask;
- symmap->seg[i].e = ~0;
- }
- i = findseg(symmap, "data");
- if (i >= 0) {
- symmap->seg[i].b |= mach->kbase;
- symmap->seg[i].e |= mach->kbase;
- }
- }
- void
- attachprocess(void)
- {
- char buf[100];
- Dir *sym, *mem;
- int fd;
- if (!adrflg) {
- dprint("used pid$a\n");
- return;
- }
- sym = dirfstat(fsym);
- sprint(buf, "/proc/%lud/mem", adrval);
- corfil = buf;
- setcor();
- sprint(buf, "/proc/%lud/text", adrval);
- fd = open(buf, OREAD);
- mem = nil;
- if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil
- || sym->qid.path != mem->qid.path)
- dprint("warning: text images may be inconsistent\n");
- free(sym);
- free(mem);
- if (fd >= 0)
- close(fd);
- }
|