|
|
1.1 ! root 1: /* ! 2: * adb - symbol table routines ! 3: */ ! 4: #include "defs.h" ! 5: #include <stab.h> ! 6: ! 7: /* ! 8: * Lookup a symbol by name. ! 9: */ ! 10: struct nlist * ! 11: lookup(symstr) ! 12: char *symstr; ! 13: { ! 14: register struct nlist *sp; ! 15: ! 16: cursym = 0; ! 17: if (symtab) ! 18: for (sp = symtab; sp < esymtab; sp++) ! 19: /* SHOULD DO SOME OF EQSYM INLINE TO SAVE TIME */ ! 20: if ((sp->n_type&N_STAB)==0 && eqsym(sp->n_un.n_name, symstr, '_')) ! 21: return(cursym = sp); ! 22: return (0); ! 23: } ! 24: ! 25: /* ! 26: * Find the closest symbol to val, and return ! 27: * the difference between val and the symbol found. ! 28: * Leave a pointer to the symbol found as cursym. ! 29: */ ! 30: findsym(val, type) ! 31: register val; ! 32: int type; ! 33: { ! 34: register diff; ! 35: register struct nlist *sp; ! 36: ! 37: cursym = 0; ! 38: diff = MAXINT; ! 39: if (type == NSYM || symtab == 0) ! 40: return (diff); ! 41: for (sp = symtab; sp < esymtab; sp++) { ! 42: if (sp->n_type&N_STAB || (sp->n_type&N_EXT)==0) ! 43: continue; ! 44: if (val - sp->n_value < diff && val >= sp->n_value) { ! 45: diff = val - sp->n_value; ! 46: cursym = sp; ! 47: if (diff == 0) ! 48: break; ! 49: } ! 50: } ! 51: return (diff); ! 52: } ! 53: ! 54: /* ! 55: * Advance cursym to the next local variable. ! 56: * Leave its value in localval as a side effect. ! 57: * Return 0 at end of file. ! 58: */ ! 59: localsym(cframe) ! 60: ADDR cframe; ! 61: { ! 62: register int type; ! 63: register struct nlist *sp; ! 64: ! 65: if (cursym) ! 66: for (sp = cursym; ++sp < esymtab; ) { ! 67: type = sp->n_type; ! 68: if (sp->n_un.n_name[0] =='_' || type == N_FN) ! 69: return (0); ! 70: switch (type) { ! 71: ! 72: case N_TEXT: ! 73: case N_TEXT|N_EXT: ! 74: case N_DATA: ! 75: case N_DATA|N_EXT: ! 76: case N_BSS: ! 77: case N_BSS|N_EXT: ! 78: localval = sp->n_value; ! 79: cursym = sp; ! 80: return (1); ! 81: ! 82: case N_LSYM: ! 83: localval = cframe - sp->n_value; ! 84: cursym = sp; ! 85: return (1); ! 86: ! 87: case N_PSYM: ! 88: case N_ABS: ! 89: localval = cframe + sp->n_value; ! 90: cursym = sp; ! 91: return (1); ! 92: } ! 93: } ! 94: cursym = 0; ! 95: return (0); ! 96: } ! 97: ! 98: /* ! 99: * Print value v and then the string s. ! 100: * If v is not zero, then we look for a nearby symbol ! 101: * and print name+offset if we find a symbol for which ! 102: * offset is small enough. ! 103: * ! 104: * For values which are just into kernel address space ! 105: * that they match exactly or that they be more than maxoff ! 106: * bytes into kernel space. ! 107: */ ! 108: psymoff(v, type, s) ! 109: register v; ! 110: int type; ! 111: char *s; ! 112: { ! 113: register w; ! 114: ! 115: if (v) ! 116: w = findsym(v, type); ! 117: if (v==0 || w >= maxoff) ! 118: printf(LPRMODE, v); ! 119: else { ! 120: printf("%s", cursym->n_un.n_name); ! 121: if (w) ! 122: printf(OFFMODE, w); ! 123: } ! 124: printf(s); ! 125: } ! 126: ! 127: /* ! 128: * Print value v symbolically if it has a reasonable ! 129: * interpretation as name+offset. If not, print nothing. ! 130: * Used in printing out registers $r. ! 131: */ ! 132: valpr(v, idsp) ! 133: { ! 134: register off_t d; ! 135: ! 136: d = findsym(v, idsp); ! 137: if (d >= maxoff) ! 138: return; ! 139: printf("%s", cursym->n_un.n_name); ! 140: if (d) ! 141: printf(OFFMODE, d); ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.