STAB(5) BSD Programmer's Manual STAB(5)
s
\bst
\bta
\bab
\bb - symbol table types
S
\bSY
\bYN
\bNO
\bOP
\bPS
\bSI
\bIS
\bS
#
\b#i
\bin
\bnc
\bcl
\blu
\bud
\bde
\be <
\b<s
\bst
\bta
\bab
\bb.
\b.h
\bh>
\b>
D
\bDE
\bES
\bSC
\bCR
\bRI
\bIP
\bPT
\bTI
\bIO
\bON
\bN
The file <_
\bs_
\bt_
\ba_
\bb_
\b._
\bh> defines some of the symbol table _
\bn_
\b__
\bt_
\by_
\bp_
\be field values
for a.out files. These are the types for permanent symbols (i.e. not lo-
cal labels, etc.) used by the old debugger _
\bs_
\bd_
\bb and the Berkeley Pascal
compiler pc(1). Symbol table entries can be produced by the _
\b._
\bs_
\bt_
\ba_
\bb_
\bs as-
sembler directive. This allows one to specify a double-quote delimited
name, a symbol type, one char and one short of information about the sym-
bol, and an unsigned long (usually an address). To avoid having to pro-
duce an explicit label for the address field, the _
\b._
\bs_
\bt_
\ba_
\bb_
\bd directive can be
used to implicitly address the current location. If no name is needed,
symbol table entries can be generated using the _
\b._
\bs_
\bt_
\ba_
\bb_
\bn directive. The
loader promises to preserve the order of symbol table entries produced by
_
\b._
\bs_
\bt_
\ba_
\bb directives. As described in a.out(5), an element of the symbol
table consists of the following structure:
* Format of a symbol table entry.
char *n_name; /* for use when in-core */
long n_strx; /* index into file string table */
unsigned char n_type; /* type flag */
char n_other; /* unused */
short n_desc; /* see struct desc, below */
unsigned n_value; /* address or offset or line */
The low bits of the _
\bn_
\b__
\bt_
\by_
\bp_
\be field are used to place a symbol into at most
one segment, according to the following masks, defined in <_
\ba_
\b._
\bo_
\bu_
\bt_
\b._
\bh>. A
symbol can be in none of these segments by having none of these segment
* Simple values for n_type.
#define N_UNDF 0x0 /* undefined */
#define N_ABS 0x2 /* absolute */
#define N_TEXT 0x4 /* text */
#define N_DATA 0x6 /* data */
#define N_BSS 0x8 /* bss */
#define N_EXT 01 /* external bit, or'ed in */
The _
\bn_
\b__
\bv_
\ba_
\bl_
\bu_
\be field of a symbol is relocated by the linker, ld(1) as an ad-
dress within the appropriate segment. _
\bN_
\b__
\bv_
\ba_
\bl_
\bu_
\be fields of symbols not in
any segment are unchanged by the linker. In addition, the linker will
discard certain symbols, according to rules of its own, unless the _
\bn_
\b__
\bt_
\by_
\bp_
\be
field has one of the following bits set:
* Other permanent symbol table entries have some of the N_STAB bits set.
* These are given in <stab.h>
#define N_STAB 0xe0 /* if any of these bits set, don't discard */
This allows up to 112 (7 * 16) symbol types, split between the various
segments. Some of these have already been claimed. The old symbolic de-
bugger, _
\bs_
\bd_
\bb, uses the following n_type values:
#define N_GSYM 0x20 /* global symbol: name,,0,type,0 */
#define N_FNAME 0x22 /* procedure name (f77 kludge): name,,0 */
#define N_FUN 0x24 /* procedure: name,,0,linenumber,address */
#define N_STSYM 0x26 /* static symbol: name,,0,type,address */
#define N_LCSYM 0x28 /* .lcomm symbol: name,,0,type,address */
#define N_RSYM 0x40 /* register sym: name,,0,type,register */
#define N_SLINE 0x44 /* src line: 0,,0,linenumber,address */
#define N_SSYM 0x60 /* structure elt: name,,0,type,struct_offset */
#define N_SO 0x64 /* source file name: name,,0,0,address */
#define N_LSYM 0x80 /* local sym: name,,0,type,offset */
#define N_SOL 0x84 /* #included file name: name,,0,0,address */
#define N_PSYM 0xa0 /* parameter: name,,0,type,offset */
#define N_ENTRY 0xa4 /* alternate entry: name,linenumber,address */
#define N_LBRAC 0xc0 /* left bracket: 0,,0,nesting level,address */
#define N_RBRAC 0xe0 /* right bracket: 0,,0,nesting level,address */
#define N_BCOMM 0xe2 /* begin common: name,, */
#define N_ECOMM 0xe4 /* end common: name,, */
#define N_ECOML 0xe8 /* end common (local name): ,,address */
#define N_LENG 0xfe /* second stab entry with length information */
where the comments give _
\bs_
\bd_
\bb conventional use for _
\b._
\bs_
\bt_
\ba_
\bb _
\bs and the _
\bn_
\b__
\bn_
\ba_
\bm_
\be,
_
\bn_
\b__
\bo_
\bt_
\bh_
\be_
\br, _
\bn_
\b__
\bd_
\be_
\bs_
\bc, and _
\bn_
\b__
\bv_
\ba_
\bl_
\bu_
\be fields of the given _
\bn_
\b__
\bt_
\by_
\bp_
\be. _
\bS_
\bd_
\bb uses the
_
\bn_
\b__
\bd_
\be_
\bs_
\bc field to hold a type specifier in the form used by the Portable C
Compiler, cc(1); see the header file _
\bp_
\bc_
\bc_
\b._
\bh for details on the format of
The Berkeley Pascal compiler, pc(1), uses the following _
\bn_
\b__
\bt_
\by_
\bp_
\be value:
#define N_PC 0x30 /* global pascal symbol: name,,0,subtype,line */
and uses the following subtypes to do type checking across separately
S
\bSE
\bEE
\bE A
\bAL
\bLS
\bSO
\bO
as(1), ld(1), dbx(1), a.out(5)
More basic types are needed.
H
\bHI
\bIS
\bST
\bTO
\bOR
\bRY
\bY
The s
\bst
\bta
\bab
\bb file appeared in 4.0BSD.
4th Berkeley Distribution June 5, 1993 2