18 static int getfile(char*, int, int);
25 if((fsym = getfile(symfil, 1, wtflag)) < 0) {
29 if (crackhdr(fsym, &fhdr)) {
30 machbytype(fhdr.type);
31 symmap = loadmap(symmap, fsym, &fhdr);
33 symmap = dumbmap(fsym);
34 if (syminit(fsym, &fhdr) < 0)
36 if (mach->sbreg && lookup(0, mach->sbreg, &s))
40 symmap = dumbmap(fsym);
49 for (i = 0; i < cormap->nsegs; i++)
50 if (cormap->seg[i].inuse)
51 close(cormap->seg[i].fd);
54 fcor = getfile(corfil, 2, ORDWR);
61 if(pid > 0) { /* provide addressability to executing process */
62 cormap = attachproc(pid, kflag, fcor, &fhdr);
66 cormap = newmap(cormap, 2);
69 setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text");
70 setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data");
82 extern Machdata i386mach;
85 setmap(dumb, fd, 0, 0xffffffff, 0, "data");
86 if (!mach) /* default machine = 386 */
94 * set up maps for a direct process image (/proc)
107 i = findseg(map, name);
108 if (i < 0) /* not found */
109 error("Invalid map name");
112 if (strcmp(name, "text") == 0)
113 textseg(expv, &fhdr);
114 map->seg[i].b = expv;
116 error("Invalid base address");
118 map->seg[i].e = expv;
120 error("Invalid end address");
122 map->seg[i].f = expv;
124 error("Invalid file offset");
125 if (rdc()=='?' && map == cormap) {
131 } else if (lastc == '/' && map == symmap) {
142 getfile(char *filnam, int cnt, int omode)
148 if (strcmp(filnam, "-") == 0)
150 f = open(filnam, omode|OCEXEC);
151 if(f < 0 && omode == ORDWR){
152 f = open(filnam, OREAD|OCEXEC);
154 dprint("%s open read-only\n", filnam);
156 if (f < 0 && xargc > cnt)
158 f = create(filnam, 1, 0666);
160 dprint("cannot open `%s': %r\n", filnam);
171 i = findseg(symmap, "text");
173 symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask;
174 symmap->seg[i].e = ~0;
176 i = findseg(symmap, "data");
178 symmap->seg[i].b |= mach->kbase;
179 symmap->seg[i].e |= mach->kbase;
191 dprint("used pid$a\n");
194 sym = dirfstat(fsym);
195 sprint(buf, "/proc/%lud/mem", adrval);
198 sprint(buf, "/proc/%lud/text", adrval);
199 fd = open(buf, OREAD);
201 if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil
202 || sym->qid.path != mem->qid.path)
203 dprint("warning: text images may be inconsistent\n");