|
|
1.1 root 1: #include <stdio.h>
2: #include <a.out.h>
3: #include <time.h>
4: #define DESCNAMES
5: #define DESCSYMBS
6: #include "stab.h"
7:
8: int strdebug;
9:
10: static char *typnam[128];
11: static int init;
12:
13: prtsym(stream,sym)
14: FILE *stream; register struct nlist *sym;
15: {
16: int jtype, jext; char tqual[8]; struct tm *ctm, *localtime();
17: register i; register unsigned w;
18: if (!init) {
19: typnam[N_UNDF/2] = "UNDF";
20: typnam[N_ABS/2] = "ABS";
21: typnam[N_TEXT/2] = "TEXT";
22: typnam[N_DATA/2] = "DATA";
23: typnam[N_BSS/2] = "BSS";
24:
25: typnam[N_SO/2] = "SO";
26: typnam[N_ESO/2] = "ESO";
27: typnam[N_SOL/2] = "SOL";
28: typnam[N_SLINE/2] = "SLINE";
29: typnam[N_BFUN/2] = "BFUN";
30: typnam[N_ENTRY/2] = "ENTRY";
31: typnam[N_RFUN/2] = "RFUN";
32: typnam[N_LBRAC/2] = "LBRAC";
33: typnam[N_RBRAC/2] = "RBRAC";
34: typnam[N_EFUN/2] = "EFUN";
35: typnam[N_STSYM/2] = "STSYM";
36: typnam[N_LCSYM/2] = "LCSYM";
37: typnam[N_ECOML/2] = "ECOML";
38: typnam[N_GSYM/2] = "GSYM";
39: typnam[N_STFUN/2] = "STFUN";
40: typnam[N_RSYM/2] = "RSYM";
41: typnam[N_LSYM/2] = "LSYM";
42: typnam[N_PSYM/2] = "PSYM";
43: typnam[N_BSTR/2] = "BSTR";
44: typnam[N_ESTR/2] = "ESTR";
45: typnam[N_SSYM/2] = "SSYM";
46: typnam[N_SFLD/2] = "SFLD";
47: typnam[N_BCOMM/2] = "BCOMM";
48: typnam[N_ECOMM/2] = "ECOMM";
49: typnam[N_FNAME/2] = "FNAME";
50: typnam[N_LENG/2] = "LENG";
51: typnam[N_NARGS/2] = "NARGS";
52: typnam[N_TYID/2] = "TYID";
53: typnam[N_DIM/2] = "DIM";
54: typnam[N_VER/2] = "VER";
55: init++;
56: }
57: jtype = sym->n_type/2;
58: jext = sym->n_type&N_EXT;
59: fputs(sym->n_un.n_name, stream); putc('\t', stream);
60: if (strlen(sym->n_un.n_name) < 8) putc('\t', stream);
61: fputs(typnam[jtype], stream);
62: if (jext) putc('\'', stream); putc('\t', stream);
63:
64: switch (sym->n_type&(~N_EXT)) {
65: case N_UNDF: /* undefined */
66: case N_ABS: /* absolute */
67: case N_TEXT: /* text */
68: case N_DATA: /* data */
69: case N_BSS: /* bss */
70:
71: case N_SO: /* source file name: name,,address */
72: case N_SOL: /* #line source filename: name,,address */
73: case N_SLINE: /* src line: ,linenumber,address */
74: case N_RFUN: /* return from function: ,,0,linenumber,address */
75: case N_ESO: /* end source file: name,,0,0,address */
76: case N_ENTRY: /* alternate entry: name,linenumber,address */
77: case N_BFUN: /* procedure: name,lineno,address */
78: case N_EFUN: /* end of function: name,lineno,address */
79: case N_LBRAC: /* left bracket: ,nesting level,address */
80: case N_RBRAC: /* right bracket: ,nesting level,address */
81: case N_ECOML: /* end common (local name): ,,address */
82: case N_BCOMM: /* begin common: name,, */
83: case N_ECOMM: /* end common: name,, */
84: case N_FNAME: /* procedure name (f77 kludge): name,,0 */
85: case N_NARGS: /* number of args in the function call */
86: fprintf(stream,"\t%5d\t%08x",
87: sym->n_desc,sym->n_value);
88: break;
89:
90: case N_LENG: /* additional entry with length: ,,length */
91: case N_TYID: /* struct, union, or enum name */
92: case N_DIM: /* dimension for arrays, etc */
93: fprintf(stream,"\t%5d\t%8d",
94: sym->n_desc,sym->n_value);
95: break;
96:
97: case N_BSTR: /* begin structure: name,, */
98: case N_ESTR: /* end structure: name,, */
99: case N_STSYM: /* static symbol: name,type,address */
100: case N_LCSYM: /* .lcomm symbol: name,type,address */
101: case N_GSYM: /* global sym: name,type,0 */
102: case N_STFUN: /* static function: name,type,0 */
103: case N_RSYM: /* register sym: name,register,offset */
104: case N_LSYM: /* local sym: name,type,offset */
105: case N_PSYM: /* parameter: name,type,offset */
106: case N_SSYM: /* structure elt: name,type,struct_offset */
107: i = 0; w = sym->n_desc >> (BTSHIFT-TSHIFT);
108: while (tqual[i++] = qualchars[(w >>= TSHIFT)&MTMASK]);
109: while (i++ < 7) putc(' ', stream);
110: printf("%s%s\t%08x",
111: tqual,basenames[BTYPE(sym->n_desc)],
112: sym->n_value);
113: break;
114:
115: case N_SFLD: /* structure field: name,,0,type,struct_offset */
116: printf(" %s<%d>\t%08x",
117: basenames[BTYPE(sym->n_desc)], sym->n_desc >> BTSHIFT,
118: sym->n_value);
119: break;
120:
121: case N_VER: /* symbol table version */
122: ctm = localtime(&sym->n_value);
123: fprintf(stream,"%2d.%02d.%02x %2d.%02d.%02d.%02d:%02d",
124: ((sym->n_desc>>12)&0x0f)+80,
125: (sym->n_desc>>8)&0x0f, sym->n_desc&0xff,
126: ctm->tm_year, ctm->tm_mon+1, ctm->tm_mday,
127: ctm->tm_hour,ctm->tm_min);
128: break;
129:
130: default:
131: fprintf(stream,"%02x %02x\t%04x\t%08x",
132: sym->n_type,sym->n_other,sym->n_desc,sym->n_value);
133: break;
134: }
135: if (strdebug && sym->n_un.n_name)
136: fprintf(stream,"\t%8x",sym->n_un.n_name);
137: putc('\n', stream);
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.