|
|
1.1 root 1: .TH STAB 5 "1 April 1983"
2: .UC 4
3: .SH NAME
4: stab \- symbol table types
5: .SH SYNOPSIS
6: .B "#include <stab.h>"
7: .SH DESCRIPTION
8: .I Stab.h
9: defines some values of the n_type field of the symbol table of a.out files.
10: These are the types for permanent symbols (i.e. not local labels, etc.)
11: used by the old debugger
12: .I sdb
13: and the Berkeley Pascal compiler
14: .IR pc (1).
15: Symbol table entries can be produced by the
16: .I .stabs
17: assembler directive.
18: This allows one to specify a double-quote delimited name, a symbol type,
19: one char and one short of information about the symbol, and an unsigned
20: long (usually an address).
21: To avoid having to produce an explicit label for the address field,
22: the
23: .I .stabd
24: directive can be used to implicitly address the current location.
25: If no name is needed, symbol table entries can be generated using the
26: .I .stabn
27: directive.
28: The loader promises to preserve the order of symbol table entries produced
29: by
30: .I .stab
31: directives.
32: As described in
33: .IR a.out (5),
34: an element of the symbol table
35: consists of the following structure:
36: .PP
37: .nf
38: /*
39: .ti +\w'/'u
40: * Format of a symbol table entry.
41: .ti +\w'/'u
42: */
43: .ta \w'#define\ 'u +\w'unsigned 'u +\w'char\ \ 'u +\w'n_name;\ \ 'u
44: struct nlist {
45: union {
46: char *n_name; /* for use when in-core */
47: long n_strx; /* index into file string table */
48: } n_un;
49: unsigned char n_type; /* type flag */
50: char n_other; /* unused */
51: short n_desc; /* see struct desc, below */
52: unsigned n_value; /* address or offset or line */
53: };
54: .fi
55: .DT
56: .PP
57: The low bits of the n_type field are used to place a symbol into
58: at most one segment, according to
59: the following masks, defined in
60: .RI < a.out.h >.
61: A symbol can be in none of these segments by having none of these segment
62: bits set.
63: .PP
64: .nf
65: /*
66: .ti +\w'/'u
67: * Simple values for n_type.
68: .ti +\w'/'u
69: */
70: .ta \w'#define\ 'u +\w'N_FNAME\ 'u +\w'0x0\ \ \ 'u
71: #define N_UNDF 0x0 /* undefined */
72: #define N_ABS 0x2 /* absolute */
73: #define N_TEXT 0x4 /* text */
74: #define N_DATA 0x6 /* data */
75: #define N_BSS 0x8 /* bss */
76:
77: #define N_EXT 01 /* external bit, or'ed in */
78: .DT
79: .fi
80: .PP
81: The n_value field of a symbol is relocated by the linker,
82: .IR ld (1)
83: as an address within the appropriate segment.
84: N_value fields of symbols not in any segment are unchanged by the linker.
85: In addition, the linker will discard certain symbols, according to rules
86: of its own, unless the n_type field has one of the following bits set:
87: .PP
88: .nf
89: /*
90: .ti +\w'/'u
91: * Other permanent symbol table entries have some of the N_STAB bits set.
92: .ti +\w'/'u
93: * These are given in <stab.h>
94: .ti +\w'/'u
95: */
96: .ta \w'#define\ 'u +\w'N_FNAME\ 'u +\w'0x0\ \ \ 'u
97: #define N_STAB 0xe0 /* if any of these bits set, don't discard */
98:
99: .DT
100: .fi
101: .PP
102: This allows up to 112 (7 \(** 16) symbol types, split between the various
103: segments.
104: Some of these have already been claimed.
105: The old symbolic debugger,
106: .IR sdb ,
107: uses the following n_type values:
108: .PP
109: .nf
110: .ta \w'#define\ 'u +\w'N_FNAME\ 'u +\w'0x0\ \ \ 'u
111: #define N_GSYM 0x20 /* global symbol: name,,0,type,0 */
112: #define N_FNAME 0x22 /* procedure name (f77 kludge): name,,0 */
113: #define N_FUN 0x24 /* procedure: name,,0,linenumber,address */
114: #define N_STSYM 0x26 /* static symbol: name,,0,type,address */
115: #define N_LCSYM 0x28 /* .lcomm symbol: name,,0,type,address */
116: #define N_RSYM 0x40 /* register sym: name,,0,type,register */
117: #define N_SLINE 0x44 /* src line: 0,,0,linenumber,address */
118: #define N_SSYM 0x60 /* structure elt: name,,0,type,struct_offset */
119: #define N_SO 0x64 /* source file name: name,,0,0,address */
120: #define N_LSYM 0x80 /* local sym: name,,0,type,offset */
121: #define N_SOL 0x84 /* #included file name: name,,0,0,address */
122: #define N_PSYM 0xa0 /* parameter: name,,0,type,offset */
123: #define N_ENTRY 0xa4 /* alternate entry: name,linenumber,address */
124: #define N_LBRAC 0xc0 /* left bracket: 0,,0,nesting level,address */
125: #define N_RBRAC 0xe0 /* right bracket: 0,,0,nesting level,address */
126: #define N_BCOMM 0xe2 /* begin common: name,, */
127: #define N_ECOMM 0xe4 /* end common: name,, */
128: #define N_ECOML 0xe8 /* end common (local name): ,,address */
129: #define N_LENG 0xfe /* second stab entry with length information */
130: .fi
131: .PP
132: where the comments give
133: .I sdb
134: conventional use for
135: .IR .stab s
136: and the n_name, n_other, n_desc, and n_value fields
137: of the given n_type.
138: .I Sdb
139: uses the n_desc field to hold a type specifier in the form used
140: by the Portable C Compiler,
141: .IR cc (1),
142: in which a base type is qualified in the following structure:
143: .PP
144: .nf
145: .ta \w'#define\ 'u +\w'short\ \ 'u
146: struct desc {
147: short q6:2,
148: q5:2,
149: q4:2,
150: q3:2,
151: q2:2,
152: q1:2,
153: basic:4;
154: };
155: .DT
156: .fi
157: .PP
158: There are four qualifications, with q1 the most significant and q6 the least
159: significant:
160: .nf
161: 0 none
162: 1 pointer
163: 2 function
164: 3 array
165: .fi
166: The sixteen basic types are assigned as follows:
167: .nf
168: 0 undefined
169: 1 function argument
170: 2 character
171: 3 short
172: 4 int
173: 5 long
174: 6 float
175: 7 double
176: 8 structure
177: 9 union
178: 10 enumeration
179: 11 member of enumeration
180: 12 unsigned character
181: 13 unsigned short
182: 14 unsigned int
183: 15 unsigned long
184: .fi
185: .PP
186: The Berkeley Pascal compiler,
187: .IR pc (1),
188: uses the following n_type value:
189: .PP
190: .nf
191: #define N_PC 0x30 /* global pascal symbol: name,,0,subtype,line */
192: .fi
193: .PP
194: and uses the following subtypes to do type checking across separately
195: compiled files:
196: .nf
197: 1 source file name
198: 2 included file name
199: 3 global label
200: 4 global constant
201: 5 global type
202: 6 global variable
203: 7 global function
204: 8 global procedure
205: 9 external function
206: 10 external procedure
207: 11 library variable
208: 12 library routine
209: .fi
210: .SH "SEE ALSO"
211: as(1), ld(1), dbx(1), a.out(5)
212: .SH BUGS
213: .PP
214: .I Sdb
215: assumes that a symbol of type N_GSYM with name
216: .I name
217: is located at address
218: .IR _\|name .
219: .PP
220: More basic types are needed.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.