1 2 /* 3 * init routines 4 */ 5 #include "defs.h" 6 #include "fns.h" 7 8 char *symfil; 9 char *corfil; 10 11 Map *symmap; 12 Map *cormap; 13 Map *dotmap; 14 15 int fsym, fcor; 16 static Fhdr fhdr; 17 18 static int getfile(char*, int, int); 19 20 void 21 setsym(void) 22 { 23 Symbol s; 24 25 if((fsym = getfile(symfil, 1, wtflag)) < 0) { 26 symmap = dumbmap(-1); 27 return; 28 } 29 if (crackhdr(fsym, &fhdr)) { 30 machbytype(fhdr.type); 31 symmap = loadmap(symmap, fsym, &fhdr); 32 if (symmap == 0) 33 symmap = dumbmap(fsym); 34 if (syminit(fsym, &fhdr) < 0) 35 dprint("%r\n"); 36 if (mach->sbreg && lookup(0, mach->sbreg, &s)) 37 mach->sb = s.value; 38 } 39 else 40 symmap = dumbmap(fsym); 41 } 42 43 void 44 setcor(void) 45 { 46 int i; 47 48 if (cormap) { 49 for (i = 0; i < cormap->nsegs; i++) 50 if (cormap->seg[i].inuse) 51 close(cormap->seg[i].fd); 52 } 53 54 fcor = getfile(corfil, 2, ORDWR); 55 if (fcor <= 0) { 56 if (cormap) 57 free(cormap); 58 cormap = dumbmap(-1); 59 return; 60 } 61 if(pid > 0) { /* provide addressability to executing process */ 62 cormap = attachproc(pid, kflag, fcor, &fhdr); 63 if (!cormap) 64 cormap = dumbmap(-1); 65 } else { 66 cormap = newmap(cormap, 2); 67 if (!cormap) 68 cormap = dumbmap(-1); 69 setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text"); 70 setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data"); 71 } 72 kmsys(); 73 return; 74 } 75 76 Map * 77 dumbmap(int fd) 78 { 79 Map *dumb; 80 81 extern Mach mi386; 82 extern Machdata i386mach; 83 84 dumb = newmap(0, 1); 85 setmap(dumb, fd, 0, 0xffffffff, 0, "data"); 86 if (!mach) /* default machine = 386 */ 87 mach = &mi386; 88 if (!machdata) 89 machdata = &i386mach; 90 return dumb; 91 } 92 93 /* 94 * set up maps for a direct process image (/proc) 95 */ 96 97 void 98 cmdmap(Map *map) 99 { 100 int i; 101 char name[MAXSYM]; 102 103 extern char lastc; 104 105 rdc(); 106 readsym(name); 107 i = findseg(map, name); 108 if (i < 0) /* not found */ 109 error("Invalid map name"); 110 111 if (expr(0)) { 112 if (strcmp(name, "text") == 0) 113 textseg(expv, &fhdr); 114 map->seg[i].b = expv; 115 } else 116 error("Invalid base address"); 117 if (expr(0)) 118 map->seg[i].e = expv; 119 else 120 error("Invalid end address"); 121 if (expr(0)) 122 map->seg[i].f = expv; 123 else 124 error("Invalid file offset"); 125 if (rdc()=='?' && map == cormap) { 126 if (fcor) 127 close(fcor); 128 fcor=fsym; 129 corfil=symfil; 130 cormap = symmap; 131 } else if (lastc == '/' && map == symmap) { 132 if (fsym) 133 close(fsym); 134 fsym=fcor; 135 symfil=corfil; 136 symmap=cormap; 137 } else 138 reread(); 139 } 140 141 static int 142 getfile(char *filnam, int cnt, int omode) 143 { 144 int f; 145 146 if (filnam == 0) 147 return -1; 148 if (strcmp(filnam, "-") == 0) 149 return 0; 150 f = open(filnam, omode|OCEXEC); 151 if(f < 0 && omode == ORDWR){ 152 f = open(filnam, OREAD|OCEXEC); 153 if(f >= 0) 154 dprint("%s open read-only\n", filnam); 155 } 156 if (f < 0 && xargc > cnt) 157 if (wtflag) 158 f = create(filnam, 1, 0666); 159 if (f < 0) { 160 dprint("cannot open `%s': %r\n", filnam); 161 return -1; 162 } 163 return f; 164 } 165 166 void 167 kmsys(void) 168 { 169 int i; 170 171 i = findseg(symmap, "text"); 172 if (i >= 0) { 173 symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask; 174 symmap->seg[i].e = ~0; 175 } 176 i = findseg(symmap, "data"); 177 if (i >= 0) { 178 symmap->seg[i].b |= mach->kbase; 179 symmap->seg[i].e |= mach->kbase; 180 } 181 } 182 183 void 184 attachprocess(void) 185 { 186 char buf[100]; 187 Dir *sym, *mem; 188 int fd; 189 190 if (!adrflg) { 191 dprint("used pid$a\n"); 192 return; 193 } 194 sym = dirfstat(fsym); 195 sprint(buf, "/proc/%lud/mem", adrval); 196 corfil = buf; 197 setcor(); 198 sprint(buf, "/proc/%lud/text", adrval); 199 fd = open(buf, OREAD); 200 mem = nil; 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"); 204 free(sym); 205 free(mem); 206 if (fd >= 0) 207 close(fd); 208 } 209