|
|
1.1 ! root 1: /* ! 2: * set up the symbol table ! 3: * cheap hack version: let nm do the work ! 4: */ ! 5: ! 6: #include "defs.h" ! 7: #include <a.out.h> ! 8: #include "sym.h" ! 9: #include <stdio.h> ! 10: ! 11: #define NMCMD "PATH=/bin:/usr/bin: nm -p %s" ! 12: #define NMFMT "%lx %s %s" /* value type name */ ! 13: ! 14: #define NSYMS 20 ! 15: ! 16: extern char *symfil; ! 17: ! 18: syminit(h) ! 19: struct exec *h; ! 20: { ! 21: FILE *fp; ! 22: register struct sym *p; ! 23: struct sym *syms; ! 24: char buf[ARB]; ! 25: long val; ! 26: char type[10]; ! 27: char name[ARB]; ! 28: char *malloc(); ! 29: FILE *popen(); ! 30: ! 31: symtab = NULL; ! 32: if (h->a_syms == 0) ! 33: return; /* stripped */ ! 34: syms = NULL; ! 35: sprintf(buf, NMCMD, symfil); ! 36: if ((fp = popen(buf, "r")) == NULL) ! 37: return; ! 38: while (fgets(buf, ARB, fp)) { ! 39: if (sscanf(buf, NMFMT, &val, type, name) != 3) ! 40: continue; ! 41: if (type[0] != 'A' && type[0] != 'D' && type[0] != 'B' && type[0] != 'T') ! 42: continue; ! 43: if (syms == NULL || p >= syms + NSYMS) { ! 44: if ((syms = (struct sym *)malloc(NSYMS * sizeof(struct sym))) == NULL) { ! 45: printf("out of mem for syms"); ! 46: break; ! 47: } ! 48: p = syms; ! 49: } ! 50: if ((p->y_name = malloc(strlen(name) + 1)) == NULL) { ! 51: printf("out of mem for syms"); ! 52: break; ! 53: } ! 54: strcpy(p->y_name, name); ! 55: p->y_value = val; ! 56: switch (type[0]) { ! 57: case 'A': ! 58: p->y_type = S_ABS; ! 59: break; ! 60: ! 61: case 'B': ! 62: case 'D': ! 63: p->y_type = S_DATA; ! 64: break; ! 65: ! 66: ! 67: case 'T': ! 68: p->y_type = S_TEXT; ! 69: break; ! 70: } ! 71: p->y_next = symtab; ! 72: symtab = p; ! 73: p++; ! 74: } ! 75: while (fgets(buf, ARB, fp)) ! 76: ; ! 77: pclose(fp); ! 78: } ! 79: ! 80: /* ! 81: * is symbol table entry s == name n? ! 82: * this may depend on awful symbol conventions ! 83: * e.g. _ ! 84: */ ! 85: int ! 86: eqsym(s, n) ! 87: register struct sym *s; ! 88: char *n; ! 89: { ! 90: ! 91: if (strcmp(s->y_name, n) == 0) ! 92: return (1); ! 93: if (s->y_name[0] == '_' && strcmp(&s->y_name[1], n) == 0) ! 94: return (1); ! 95: return (0); ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.