stabsN_MAIN with name "main" to identify entry functionN_SO source file. might be preceded by dir ending in / value is code ptr empty string means source doneN_SOL source include file, value = text addr of where this startsN_SLINE start of source line no name desc = line number value = code addr for that lineN_FUN (36) function def 'F' global 'f' local value = addr desc = line number of def return type is number after : nil name marks end of functionconstants c= XXX p. 15N_LSYM (128) local variable :type-number value = offset from fp :ptype means parameter passed in reg but stored as variableN_GSYM (32) global variable addr not given (use external symbol) :typeN_RSYM register valueN_STSYM(38)/N_FUN/N_LCSYM(40) data/text/bss static varibale 'S' file static 'V' procedure static :Stype :VtypeN_PSYM (160) parameter :ptype value=offset from fp desc = line number of decl register params followed by an N_RSYM with same name and :rtype.skip typestype (a,b) means a=file number b=type numberN_BINCL/N_EINCL begin/end includeN_EXCL - same effect as earlier guy=============type crap name:symbol_opt typeinfotypeinfo ::= typenum | typenum = attr* typedeftypenum ::= integer | '(' integer ',' integer ')'attr ::= @ attrtext ;attrtext ::= 'a' integer (alignment) | 'p' integer (pointer class) | 'P' (packed type) | 's' integer (size of type in bits) | 'S' (string instead of array of chars)typedef ::= typeinfo | 'b' ('u' | 's') 'c'? width; offset; nbits; (builtin, signed/unsigned, char/not, width in bytes, offset & nbits of type) | 'w' (aix wide char type, not used) | 'R' fptype; bytes; (fptype 1=32-bit, 2=64-bit, 3=complex, 4=complex16, 5=complex32, 6=long double) | 'g' typeinfo ';' nbits (aix floating, not used) | 'c' typeinfo ';' nbits (aix complex, not used) | -1 int32 | -2 char8 | -3 int16 | -4 int32 (long) | -5 uchar8 | -6 schar8 | -7 uint16 | -8 uint32 | -9 uint32 | -10 ulong32 | -11 void | -12 float | -13 double | -14 long double | -15 int32 | -16 bool32 | -17 short real | -18 real | -19 stringptr | -20 character8 | -21 logical*1 8 | -22 logical*2 16 | -23 logical*4 32 | -24 logical 32 | -25 complex (two single) | -26 complex (two double) | -27 integer*1 8 signed | -28 integer*2 16 signed | -29 integer*4 32 signed | -30 wchar 16 wide char | -31 int64 | -32 uint64 | -33 logical*8 64 | -34 integer*8 64 signed | 'b' typeinfo ';' bytes (ibm, no idea) | 'B' typeinfo (volatile typref) | 'd' typeinfo (file of typeref) | 'k' typeinfo (const typeref) | 'M' typeinfo ';' length (multiple instance type, fortran) | 'S' typeinfo (set, typeref must have small number of values) | '*' typeinfo (pointer to typeref) | 'x' ('s'|'u'|'e') name ':' (struct, union, enum reference. name can have '::' in it) | 'r' typeinfo ';' low ';' high ';' (subrange. typeref can be type being defined for base types!) low and high are bounds if bound is octal power of two, it's a big negative number | ('a'|'P') indextypedef arraytypeinfo (array, index should be range type) indextype is type definition not typeinfo (need not say typenum=) P means packed array | 'A' arraytypeinfo (open array (no index bounds)) | 'D' dims ';' typeinfo (dims-dimensional dynamic array) | 'E' dims ';' typeinfo (subarray of N-dimensional array) | 'n' typeinfo ';' bytes (max length string) | 'z' typeinfo ';' bytes (no idea what difference is from 'n') | 'N' (pascal stringptr) | 'e' (name ':' bigint ',')* ';' (enum listing) | ('s'|'u') bytes (name ':' type ',' bitoffset ',' bitsize ';')* ';' (struct/union defn) tag is given as name in stabs entry, with 'T' symbol | 'f' typeinfo ';' (function returning type) | 'f' rettypeinfo ',' paramcount ';' (typeinfo ',' (0|1) ';')* ';' | 'p' paramcount ';' (typeinfo ',' (0|1) ';')* ';' | 'F' rettypeinfo ',' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';' | 'R' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';' (the 0 or 1 is pass-by-reference vs pass-by-value) (the 0 or 1 is pass-by-reference vs pass-by-value)bound ::= 'A' offset (bound is on stack by ref at offset offset from arg list) | 'T' offset (bound is on stack by val at offset offset from arg list) | 'a' regnum (bound passed by reference in register) | 't' regnum (bound passed by value in register) | 'J' (no bound) | bigintbigint ::= '-'? decimal | 0 octal | -1C++symbol 'Tt' means typename + tag in one stabnames can have ::, as in foo::bar::baz::t1t16 unknown type just like voidt17 vtable record type
stabs
N_MAIN with name "main" to identify entry function
N_SO source file. might be preceded by dir ending in /
value is code ptr
empty string means source done
N_SOL source include file, value = text addr of where this starts
N_SLINE start of source line
no name
desc = line number
value = code addr for that line
N_FUN (36) function def
'F' global 'f' local
value = addr
desc = line number of def
return type is number after :
nil name marks end of function
constants
c= XXX p. 15
N_LSYM (128) local variable
:type-number
value = offset from fp
:ptype means parameter passed in reg but stored as variable
N_GSYM (32) global variable
addr not given (use external symbol)
:type
N_RSYM register value
N_STSYM(38)/N_FUN/N_LCSYM(40) data/text/bss
static varibale 'S' file static 'V' procedure static
:Stype :Vtype
N_PSYM (160) parameter
:ptype
value=offset from fp
desc = line number of decl
register params followed by an N_RSYM with same name and :rtype.
skip types
type (a,b) means a=file number b=type number
N_BINCL/N_EINCL begin/end include
N_EXCL - same effect as earlier guy
=============
type crap
name:symbol_opt typeinfo
typeinfo ::= typenum | typenum = attr* typedef
typenum ::= integer | '(' integer ',' integer ')'
attr ::= @ attrtext ;
attrtext ::= 'a' integer (alignment)
| 'p' integer (pointer class)
| 'P' (packed type)
| 's' integer (size of type in bits)
| 'S' (string instead of array of chars)
typedef ::= typeinfo
| 'b' ('u' | 's') 'c'? width; offset; nbits; (builtin, signed/unsigned, char/not, width in bytes, offset & nbits of type)
| 'w' (aix wide char type, not used)
| 'R' fptype; bytes; (fptype 1=32-bit, 2=64-bit, 3=complex, 4=complex16, 5=complex32, 6=long double)
| 'g' typeinfo ';' nbits (aix floating, not used)
| 'c' typeinfo ';' nbits (aix complex, not used)
| -1 int32
| -2 char8
| -3 int16
| -4 int32 (long)
| -5 uchar8
| -6 schar8
| -7 uint16
| -8 uint32
| -9 uint32
| -10 ulong32
| -11 void
| -12 float
| -13 double
| -14 long double
| -15 int32
| -16 bool32
| -17 short real
| -18 real
| -19 stringptr
| -20 character8
| -21 logical*1 8
| -22 logical*2 16
| -23 logical*4 32
| -24 logical 32
| -25 complex (two single)
| -26 complex (two double)
| -27 integer*1 8 signed
| -28 integer*2 16 signed
| -29 integer*4 32 signed
| -30 wchar 16 wide char
| -31 int64
| -32 uint64
| -33 logical*8 64
| -34 integer*8 64 signed
| 'b' typeinfo ';' bytes (ibm, no idea)
| 'B' typeinfo (volatile typref)
| 'd' typeinfo (file of typeref)
| 'k' typeinfo (const typeref)
| 'M' typeinfo ';' length (multiple instance type, fortran)
| 'S' typeinfo (set, typeref must have small number of values)
| '*' typeinfo (pointer to typeref)
| 'x' ('s'|'u'|'e') name ':' (struct, union, enum reference. name can have '::' in it)
| 'r' typeinfo ';' low ';' high ';' (subrange. typeref can be type being defined for base types!)
low and high are bounds
if bound is octal power of two, it's a big negative number
| ('a'|'P') indextypedef arraytypeinfo (array, index should be range type)
indextype is type definition not typeinfo (need not say typenum=)
P means packed array
| 'A' arraytypeinfo (open array (no index bounds))
| 'D' dims ';' typeinfo (dims-dimensional dynamic array)
| 'E' dims ';' typeinfo (subarray of N-dimensional array)
| 'n' typeinfo ';' bytes (max length string)
| 'z' typeinfo ';' bytes (no idea what difference is from 'n')
| 'N' (pascal stringptr)
| 'e' (name ':' bigint ',')* ';' (enum listing)
| ('s'|'u') bytes (name ':' type ',' bitoffset ',' bitsize ';')* ';' (struct/union defn)
tag is given as name in stabs entry, with 'T' symbol
| 'f' typeinfo ';' (function returning type)
| 'f' rettypeinfo ',' paramcount ';' (typeinfo ',' (0|1) ';')* ';'
| 'p' paramcount ';' (typeinfo ',' (0|1) ';')* ';'
| 'F' rettypeinfo ',' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';'
| 'R' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';'
(the 0 or 1 is pass-by-reference vs pass-by-value)
(the 0 or 1 is pass-by-reference vs pass-by-value)
bound ::=
'A' offset (bound is on stack by ref at offset offset from arg list)
| 'T' offset (bound is on stack by val at offset offset from arg list)
| 'a' regnum (bound passed by reference in register)
| 't' regnum (bound passed by value in register)
| 'J' (no bound)
| bigint
bigint ::= '-'? decimal
| 0 octal
| -1
C++
symbol 'Tt' means typename + tag in one stab
names can have ::, as in foo::bar::baz::t1
t16 unknown type just like void
t17 vtable record type