1 #ifndef lint 2 static char sccsid[] = "@(#)setup.c 5.1 (Berkeley) 01/16/89"; 3 #endif 4 5 /* 6 * adb - routines to read a.out and core files at startup 7 */ 8 9 #include "defs.h" 10 #include <sys/file.h> 11 12 static struct exec filhdr; 13 14 off_t lseek(); 15 char *malloc(); 16 17 /* NB. the following works only with letter (alpha) variables */ 18 #define setavar(name, value) (var[(name) - 'a' + 10] = (value)) 19 20 setsym() 21 { 22 register struct nlist *sp; 23 int strsize; 24 char *strtab; 25 off_t loc, dbase; 26 27 txtmap.ufd = symfile.fd = getfile(1); 28 if (read(symfile.fd, (char *)&filhdr, sizeof(filhdr)) != sizeof(filhdr) || 29 N_BADMAG(filhdr)) { 30 bzero((char *)&filhdr, sizeof(filhdr)); 31 txtmap.m1.e = -(addr_t)1; 32 return; 33 } 34 loc = filhdr.a_text + filhdr.a_data; 35 txtmap.m1.f = txtmap.m2.f = N_TXTOFF(filhdr); 36 switch ((int)filhdr.a_magic) { 37 38 case OMAGIC: 39 /* text map 1 is empty; map 2 goes from 0 to loc */ 40 txtmap.m2.b = dbase = 0; 41 txtmap.m2.e = loc; 42 break; 43 44 case ZMAGIC: 45 case NMAGIC: 46 /* text map 1 maps text segment, map 2 maps data */ 47 txtmap.m1.e = filhdr.a_text; 48 txtmap.m2.b = dbase = roundup(filhdr.a_text, CLBYTES); 49 txtmap.m2.e = dbase + filhdr.a_data; 50 txtmap.m2.f += txtmap.m1.e; 51 break; 52 } 53 54 /* save data segment base in variable b */ 55 setavar('b', dbase); 56 57 if (filhdr.a_syms != 0) { 58 loc = N_SYMOFF(filhdr); 59 symtab = (struct nlist *)malloc((u_int)filhdr.a_syms); 60 if (symtab == NULL) 61 goto nospace; 62 esymtab = &symtab[filhdr.a_syms / sizeof(struct nlist)]; 63 (void) lseek(symfile.fd, loc, L_SET); 64 65 #define rd(a, n) \ 66 if (read(symfile.fd, (char *)(a), (int)(n)) != (n)) \ 67 goto readerr 68 69 rd(symtab, filhdr.a_syms); 70 rd(&strsize, sizeof(strsize)); 71 /* 72 * offsets in the string table are relative to the offset 73 * of the number we just read; we adjust for it here. 74 */ 75 strsize -= sizeof(strsize); 76 if ((strtab = malloc((u_int)strsize)) == NULL) 77 goto nospace; 78 rd(strtab, strsize); 79 for (sp = symtab; sp < esymtab; sp++) { 80 if (sp->n_un.n_strx == 0) 81 continue; 82 sp->n_un.n_strx -= sizeof(strsize); 83 if ((u_long)sp->n_un.n_strx >= strsize) { 84 adbprintf("bad string index %D in symtab\n", 85 (expr_t)sp->n_un.n_strx); 86 sp->n_un.n_name = ""; 87 } else 88 sp->n_un.n_name = strtab + sp->n_un.n_strx; 89 } 90 #undef rd 91 } 92 if (INKERNEL(filhdr.a_entry)) { 93 txtmap.m1.b += KERNTEXTOFF; 94 txtmap.m1.e += KERNTEXTOFF; 95 txtmap.m2.b += KERNTEXTOFF; 96 txtmap.m2.e += KERNTEXTOFF; 97 } 98 return; 99 100 readerr: 101 prints("Error reading symbol|string table (old format a.out?)\n"); 102 exit(1); 103 /* NOTREACHED */ 104 105 nospace: 106 prints("Not enough space for symbol|string table\n"); 107 exit(1); 108 /* NOTREACHED */ 109 } 110 111 setcore() 112 { 113 off_t stacksize; 114 115 datmap.m1.e = -(addr_t)1; 116 if ((datmap.ufd = corefile.fd = getfile(2)) < 0) 117 goto ret; 118 if (kernel && INKERNEL(filhdr.a_entry) && getkcore()) { 119 kcore = 1; 120 goto ret; 121 } 122 if (read(corefile.fd, (char *)&u, ctob(UPAGES)) != ctob(UPAGES) || 123 !udot()) { 124 adbprintf("not core file = %s\n", corefile.name); 125 goto ret; 126 } 127 signo = u.u_arg[0]; 128 sigcode = u.u_code; 129 filhdr.a_text = ctob(u.u_tsize); 130 filhdr.a_data = ctob(u.u_dsize); 131 stacksize = ctob(u.u_ssize); 132 switch ((int)filhdr.a_magic) { 133 134 case OMAGIC: 135 datmap.m1.b = 0; 136 datmap.m1.e = filhdr.a_text + filhdr.a_data; 137 datmap.m2.f = ctob(UPAGES) + datmap.m1.e; 138 break; 139 140 case NMAGIC: 141 case ZMAGIC: 142 datmap.m1.b = roundup(filhdr.a_text, CLBYTES); 143 datmap.m1.e = datmap.m1.b + filhdr.a_data; 144 datmap.m2.f = ctob(UPAGES) + filhdr.a_data; 145 break; 146 } 147 /* save (possibly new) data segment base, and save stack size */ 148 setavar('b', datmap.m1.b); 149 setavar('s', stacksize); 150 datmap.m1.f = ctob(UPAGES); 151 datmap.m2.b = KERNBASE - ctob(UPAGES) - stacksize; 152 datmap.m2.e = KERNBASE - ctob(UPAGES); 153 ret: 154 u.u_ar0 = (int *)((caddr_t)&u + ctob(UPAGES)); /* XXX */ 155 setavar('d', filhdr.a_data); 156 setavar('e', filhdr.a_entry); 157 setavar('m', filhdr.a_magic); 158 setavar('t', filhdr.a_text); 159 } 160