aboutsummaryrefslogtreecommitdiff
path: root/gdb/doc/stabs.info-3
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/doc/stabs.info-3')
-rw-r--r--gdb/doc/stabs.info-31390
1 files changed, 0 insertions, 1390 deletions
diff --git a/gdb/doc/stabs.info-3 b/gdb/doc/stabs.info-3
deleted file mode 100644
index c72f5cb..0000000
--- a/gdb/doc/stabs.info-3
+++ /dev/null
@@ -1,1390 +0,0 @@
-This is Info file stabs.info, produced by Makeinfo version 1.68 from
-the input file ./stabs.texinfo.
-
-START-INFO-DIR-ENTRY
-* Stabs: (stabs). The "stabs" debugging information format.
-END-INFO-DIR-ENTRY
-
- This document describes the stabs debugging symbol tables.
-
- Copyright 1992, 93, 94, 95, 97, 1998 Free Software Foundation, Inc.
-Contributed by Cygnus Support. Written by Julia Menapace, Jim Kingdon,
-and David MacKenzie.
-
- Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
- Permission is granted to copy or distribute modified versions of this
-manual under the terms of the GPL (for which purpose this text may be
-regarded as a program in the language TeX).
-
-
-File: stabs.info, Node: Class Instance, Next: Methods, Prev: Simple Classes, Up: Cplusplus
-
-Class Instance
-==============
-
- As shown above, describing even a simple C++ class definition is
-accomplished by massively extending the stab format used in C to
-describe structure types. However, once the class is defined, C stabs
-with no modifications can be used to describe class instances. The
-following source:
-
- main () {
- baseA AbaseA;
- }
-
-yields the following stab describing the class instance. It looks no
-different from a standard C stab describing a local variable.
-
- .stabs "name:type_ref(baseA)", N_LSYM, NIL, NIL, frame_ptr_offset
-
- .stabs "AbaseA:20",128,0,0,-20
-
-
-File: stabs.info, Node: Methods, Next: Method Type Descriptor, Prev: Class Instance, Up: Cplusplus
-
-Method Definition
-=================
-
- The class definition shown above declares Ameth. The C++ source
-below defines Ameth:
-
- int
- baseA::Ameth(int in, char other)
- {
- return in;
- };
-
- This method definition yields three stabs following the code of the
-method. One stab describes the method itself and following two describe
-its parameters. Although there is only one formal argument all methods
-have an implicit argument which is the `this' pointer. The `this'
-pointer is a pointer to the object on which the method was called. Note
-that the method name is mangled to encode the class name and argument
-types. Name mangling is described in the ARM (`The Annotated C++
-Reference Manual', by Ellis and Stroustrup, ISBN 0-201-51459-1);
-`gpcompare.texi' in Cygnus GCC distributions describes the differences
-between GNU mangling and ARM mangling.
-
- .stabs "name:symbol_desriptor(global function)return_type(int)",
- N_FUN, NIL, NIL, code_addr_of_method_start
-
- .stabs "Ameth__5baseAic:F1",36,0,0,_Ameth__5baseAic
-
- Here is the stab for the `this' pointer implicit argument. The name
-of the `this' pointer is always `this'. Type 19, the `this' pointer is
-defined as a pointer to type 20, `baseA', but a stab defining `baseA'
-has not yet been emited. Since the compiler knows it will be emited
-shortly, here it just outputs a cross reference to the undefined
-symbol, by prefixing the symbol name with `xs'.
-
- .stabs "name:sym_desc(register param)type_def(19)=
- type_desc(ptr to)type_ref(baseA)=
- type_desc(cross-reference to)baseA:",N_RSYM,NIL,NIL,register_number
-
- .stabs "this:P19=*20=xsbaseA:",64,0,0,8
-
- The stab for the explicit integer argument looks just like a
-parameter to a C function. The last field of the stab is the offset
-from the argument pointer, which in most systems is the same as the
-frame pointer.
-
- .stabs "name:sym_desc(value parameter)type_ref(int)",
- N_PSYM,NIL,NIL,offset_from_arg_ptr
-
- .stabs "in:p1",160,0,0,72
-
- << The examples that follow are based on A1.C >>
-
-
-File: stabs.info, Node: Method Type Descriptor, Next: Member Type Descriptor, Prev: Methods, Up: Cplusplus
-
-The `#' Type Descriptor
-=======================
-
- This is used to describe a class method. This is a function which
-takes an extra argument as its first argument, for the `this' pointer.
-
- If the `#' is immediately followed by another `#', the second one
-will be followed by the return type and a semicolon. The class and
-argument types are not specified, and must be determined by demangling
-the name of the method if it is available.
-
- Otherwise, the single `#' is followed by the class type, a comma,
-the return type, a comma, and zero or more parameter types separated by
-commas. The list of arguments is terminated by a semicolon. In the
-debugging output generated by gcc, a final argument type of `void'
-indicates a method which does not take a variable number of arguments.
-If the final argument type of `void' does not appear, the method was
-declared with an ellipsis.
-
- Note that although such a type will normally be used to describe
-fields in structures, unions, or classes, for at least some versions of
-the compiler it can also be used in other contexts.
-
-
-File: stabs.info, Node: Member Type Descriptor, Next: Protections, Prev: Method Type Descriptor, Up: Cplusplus
-
-The `@' Type Descriptor
-=======================
-
- The `@' type descriptor is for a member (class and variable) type.
-It is followed by type information for the offset basetype, a comma, and
-type information for the type of the field being pointed to. (FIXME:
-this is acknowledged to be gibberish. Can anyone say what really goes
-here?).
-
- Note that there is a conflict between this and type attributes
-(*note String Field::.); both use type descriptor `@'. Fortunately,
-the `@' type descriptor used in this C++ sense always will be followed
-by a digit, `(', or `-', and type attributes never start with those
-things.
-
-
-File: stabs.info, Node: Protections, Next: Method Modifiers, Prev: Member Type Descriptor, Up: Cplusplus
-
-Protections
-===========
-
- In the simple class definition shown above all member data and
-functions were publicly accessable. The example that follows contrasts
-public, protected and privately accessable fields and shows how these
-protections are encoded in C++ stabs.
-
- If the character following the `FIELD-NAME:' part of the string is
-`/', then the next character is the visibility. `0' means private, `1'
-means protected, and `2' means public. Debuggers should ignore
-visibility characters they do not recognize, and assume a reasonable
-default (such as public) (GDB 4.11 does not, but this should be fixed
-in the next GDB release). If no visibility is specified the field is
-public. The visibility `9' means that the field has been optimized out
-and is public (there is no way to specify an optimized out field with a
-private or protected visibility). Visibility `9' is not supported by
-GDB 4.11; this should be fixed in the next GDB release.
-
- The following C++ source:
-
- class vis {
- private:
- int priv;
- protected:
- char prot;
- public:
- float pub;
- };
-
-generates the following stab:
-
- # 128 is N_LSYM
- .stabs "vis:T19=s12priv:/01,0,32;prot:/12,32,8;pub:12,64,32;;",128,0,0,0
-
- `vis:T19=s12' indicates that type number 19 is a 12 byte structure
-named `vis' The `priv' field has public visibility (`/0'), type int
-(`1'), and offset and size `,0,32;'. The `prot' field has protected
-visibility (`/1'), type char (`2') and offset and size `,32,8;'. The
-`pub' field has type float (`12'), and offset and size `,64,32;'.
-
- Protections for member functions are signified by one digit embeded
-in the field part of the stab describing the method. The digit is 0 if
-private, 1 if protected and 2 if public. Consider the C++ class
-definition below:
-
- class all_methods {
- private:
- int priv_meth(int in){return in;};
- protected:
- char protMeth(char in){return in;};
- public:
- float pubMeth(float in){return in;};
- };
-
- It generates the following stab. The digit in question is to the
-left of an `A' in each case. Notice also that in this case two symbol
-descriptors apply to the class name struct tag and struct type.
-
- .stabs "class_name:sym_desc(struct tag&type)type_def(21)=
- sym_desc(struct)struct_bytes(1)
- meth_name::type_def(22)=sym_desc(method)returning(int);
- :args(int);protection(private)modifier(normal)virtual(no);
- meth_name::type_def(23)=sym_desc(method)returning(char);
- :args(char);protection(protected)modifier(normal)virual(no);
- meth_name::type_def(24)=sym_desc(method)returning(float);
- :args(float);protection(public)modifier(normal)virtual(no);;",
- N_LSYM,NIL,NIL,NIL
-
- .stabs "all_methods:Tt21=s1priv_meth::22=##1;:i;0A.;protMeth::23=##2;:c;1A.;
- pubMeth::24=##12;:f;2A.;;",128,0,0,0
-
-
-File: stabs.info, Node: Method Modifiers, Next: Virtual Methods, Prev: Protections, Up: Cplusplus
-
-Method Modifiers (`const', `volatile', `const volatile')
-========================================================
-
- << based on a6.C >>
-
- In the class example described above all the methods have the normal
-modifier. This method modifier information is located just after the
-protection information for the method. This field has four possible
-character values. Normal methods use `A', const methods use `B',
-volatile methods use `C', and const volatile methods use `D'. Consider
-the class definition below:
-
- class A {
- public:
- int ConstMeth (int arg) const { return arg; };
- char VolatileMeth (char arg) volatile { return arg; };
- float ConstVolMeth (float arg) const volatile {return arg; };
- };
-
- This class is described by the following stab:
-
- .stabs "class(A):sym_desc(struct)type_def(20)=type_desc(struct)struct_bytes(1)
- meth_name(ConstMeth)::type_def(21)sym_desc(method)
- returning(int);:arg(int);protection(public)modifier(const)virtual(no);
- meth_name(VolatileMeth)::type_def(22)=sym_desc(method)
- returning(char);:arg(char);protection(public)modifier(volatile)virt(no)
- meth_name(ConstVolMeth)::type_def(23)=sym_desc(method)
- returning(float);:arg(float);protection(public)modifer(const volatile)
- virtual(no);;", ...
-
- .stabs "A:T20=s1ConstMeth::21=##1;:i;2B.;VolatileMeth::22=##2;:c;2C.;
- ConstVolMeth::23=##12;:f;2D.;;",128,0,0,0
-
-
-File: stabs.info, Node: Virtual Methods, Next: Inheritence, Prev: Method Modifiers, Up: Cplusplus
-
-Virtual Methods
-===============
-
- << The following examples are based on a4.C >>
-
- The presence of virtual methods in a class definition adds additional
-data to the class description. The extra data is appended to the
-description of the virtual method and to the end of the class
-description. Consider the class definition below:
-
- class A {
- public:
- int Adat;
- virtual int A_virt (int arg) { return arg; };
- };
-
- This results in the stab below describing class A. It defines a new
-type (20) which is an 8 byte structure. The first field of the class
-struct is `Adat', an integer, starting at structure offset 0 and
-occupying 32 bits.
-
- The second field in the class struct is not explicitly defined by the
-C++ class definition but is implied by the fact that the class contains
-a virtual method. This field is the vtable pointer. The name of the
-vtable pointer field starts with `$vf' and continues with a type
-reference to the class it is part of. In this example the type
-reference for class A is 20 so the name of its vtable pointer field is
-`$vf20', followed by the usual colon.
-
- Next there is a type definition for the vtable pointer type (21).
-This is in turn defined as a pointer to another new type (22).
-
- Type 22 is the vtable itself, which is defined as an array, indexed
-by a range of integers between 0 and 1, and whose elements are of type
-17. Type 17 was the vtable record type defined by the boilerplate C++
-type definitions, as shown earlier.
-
- The bit offset of the vtable pointer field is 32. The number of bits
-in the field are not specified when the field is a vtable pointer.
-
- Next is the method definition for the virtual member function
-`A_virt'. Its description starts out using the same format as the
-non-virtual member functions described above, except instead of a dot
-after the `A' there is an asterisk, indicating that the function is
-virtual. Since is is virtual some addition information is appended to
-the end of the method description.
-
- The first number represents the vtable index of the method. This is
-a 32 bit unsigned number with the high bit set, followed by a
-semi-colon.
-
- The second number is a type reference to the first base class in the
-inheritence hierarchy defining the virtual member function. In this
-case the class stab describes a base class so the virtual function is
-not overriding any other definition of the method. Therefore the
-reference is to the type number of the class that the stab is
-describing (20).
-
- This is followed by three semi-colons. One marks the end of the
-current sub-section, one marks the end of the method field, and the
-third marks the end of the struct definition.
-
- For classes containing virtual functions the very last section of the
-string part of the stab holds a type reference to the first base class.
-This is preceeded by `~%' and followed by a final semi-colon.
-
- .stabs "class_name(A):type_def(20)=sym_desc(struct)struct_bytes(8)
- field_name(Adat):type_ref(int),bit_offset(0),field_bits(32);
- field_name(A virt func ptr):type_def(21)=type_desc(ptr to)type_def(22)=
- sym_desc(array)index_type_ref(range of int from 0 to 1);
- elem_type_ref(vtbl elem type),
- bit_offset(32);
- meth_name(A_virt)::typedef(23)=sym_desc(method)returning(int);
- :arg_type(int),protection(public)normal(yes)virtual(yes)
- vtable_index(1);class_first_defining(A);;;~%first_base(A);",
- N_LSYM,NIL,NIL,NIL
-
- .stabs "A:t20=s8Adat:1,0,32;$vf20:21=*22=ar1;0;1;17,32;
- A_virt::23=##1;:i;2A*-2147483647;20;;;~%20;",128,0,0,0
-
-
-File: stabs.info, Node: Inheritence, Next: Virtual Base Classes, Prev: Virtual Methods, Up: Cplusplus
-
-Inheritence
-===========
-
- Stabs describing C++ derived classes include additional sections that
-describe the inheritence hierarchy of the class. A derived class stab
-also encodes the number of base classes. For each base class it tells
-if the base class is virtual or not, and if the inheritence is private
-or public. It also gives the offset into the object of the portion of
-the object corresponding to each base class.
-
- This additional information is embeded in the class stab following
-the number of bytes in the struct. First the number of base classes
-appears bracketed by an exclamation point and a comma.
-
- Then for each base type there repeats a series: a virtual character,
-a visibilty character, a number, a comma, another number, and a
-semi-colon.
-
- The virtual character is `1' if the base class is virtual and `0' if
-not. The visibility character is `2' if the derivation is public, `1'
-if it is protected, and `0' if it is private. Debuggers should ignore
-virtual or visibility characters they do not recognize, and assume a
-reasonable default (such as public and non-virtual) (GDB 4.11 does not,
-but this should be fixed in the next GDB release).
-
- The number following the virtual and visibility characters is the
-offset from the start of the object to the part of the object
-pertaining to the base class.
-
- After the comma, the second number is a type_descriptor for the base
-type. Finally a semi-colon ends the series, which repeats for each
-base class.
-
- The source below defines three base classes `A', `B', and `C' and
-the derived class `D'.
-
- class A {
- public:
- int Adat;
- virtual int A_virt (int arg) { return arg; };
- };
-
- class B {
- public:
- int B_dat;
- virtual int B_virt (int arg) {return arg; };
- };
-
- class C {
- public:
- int Cdat;
- virtual int C_virt (int arg) {return arg; };
- };
-
- class D : A, virtual B, public C {
- public:
- int Ddat;
- virtual int A_virt (int arg ) { return arg+1; };
- virtual int B_virt (int arg) { return arg+2; };
- virtual int C_virt (int arg) { return arg+3; };
- virtual int D_virt (int arg) { return arg; };
- };
-
- Class stabs similar to the ones described earlier are generated for
-each base class.
-
- .stabs "A:T20=s8Adat:1,0,32;$vf20:21=*22=ar1;0;1;17,32;
- A_virt::23=##1;:i;2A*-2147483647;20;;;~%20;",128,0,0,0
-
- .stabs "B:Tt25=s8Bdat:1,0,32;$vf25:21,32;B_virt::26=##1;
- :i;2A*-2147483647;25;;;~%25;",128,0,0,0
-
- .stabs "C:Tt28=s8Cdat:1,0,32;$vf28:21,32;C_virt::29=##1;
- :i;2A*-2147483647;28;;;~%28;",128,0,0,0
-
- In the stab describing derived class `D' below, the information about
-the derivation of this class is encoded as follows.
-
- .stabs "derived_class_name:symbol_descriptors(struct tag&type)=
- type_descriptor(struct)struct_bytes(32)!num_bases(3),
- base_virtual(no)inheritence_public(no)base_offset(0),
- base_class_type_ref(A);
- base_virtual(yes)inheritence_public(no)base_offset(NIL),
- base_class_type_ref(B);
- base_virtual(no)inheritence_public(yes)base_offset(64),
- base_class_type_ref(C); ...
-
- .stabs "D:Tt31=s32!3,000,20;100,25;0264,28;$vb25:24,128;Ddat:
- 1,160,32;A_virt::32=##1;:i;2A*-2147483647;20;;B_virt:
- :32:i;2A*-2147483647;25;;C_virt::32:i;2A*-2147483647;
- 28;;D_virt::32:i;2A*-2147483646;31;;;~%20;",128,0,0,0
-
-
-File: stabs.info, Node: Virtual Base Classes, Next: Static Members, Prev: Inheritence, Up: Cplusplus
-
-Virtual Base Classes
-====================
-
- A derived class object consists of a concatination in memory of the
-data areas defined by each base class, starting with the leftmost and
-ending with the rightmost in the list of base classes. The exception
-to this rule is for virtual inheritence. In the example above, class
-`D' inherits virtually from base class `B'. This means that an
-instance of a `D' object will not contain its own `B' part but merely a
-pointer to a `B' part, known as a virtual base pointer.
-
- In a derived class stab, the base offset part of the derivation
-information, described above, shows how the base class parts are
-ordered. The base offset for a virtual base class is always given as 0.
-Notice that the base offset for `B' is given as 0 even though `B' is
-not the first base class. The first base class `A' starts at offset 0.
-
- The field information part of the stab for class `D' describes the
-field which is the pointer to the virtual base class `B'. The vbase
-pointer name is `$vb' followed by a type reference to the virtual base
-class. Since the type id for `B' in this example is 25, the vbase
-pointer name is `$vb25'.
-
- .stabs "D:Tt31=s32!3,000,20;100,25;0264,28;$vb25:24,128;Ddat:1,
- 160,32;A_virt::32=##1;:i;2A*-2147483647;20;;B_virt::32:i;
- 2A*-2147483647;25;;C_virt::32:i;2A*-2147483647;28;;D_virt:
- :32:i;2A*-2147483646;31;;;~%20;",128,0,0,0
-
- Following the name and a semicolon is a type reference describing the
-type of the virtual base class pointer, in this case 24. Type 24 was
-defined earlier as the type of the `B' class `this' pointer. The
-`this' pointer for a class is a pointer to the class type.
-
- .stabs "this:P24=*25=xsB:",64,0,0,8
-
- Finally the field offset part of the vbase pointer field description
-shows that the vbase pointer is the first field in the `D' object,
-before any data fields defined by the class. The layout of a `D' class
-object is a follows, `Adat' at 0, the vtable pointer for `A' at 32,
-`Cdat' at 64, the vtable pointer for C at 96, the virtual base pointer
-for `B' at 128, and `Ddat' at 160.
-
-
-File: stabs.info, Node: Static Members, Prev: Virtual Base Classes, Up: Cplusplus
-
-Static Members
-==============
-
- The data area for a class is a concatenation of the space used by the
-data members of the class. If the class has virtual methods, a vtable
-pointer follows the class data. The field offset part of each field
-description in the class stab shows this ordering.
-
- << How is this reflected in stabs? See Cygnus bug #677 for some
-info. >>
-
-
-File: stabs.info, Node: Stab Types, Next: Symbol Descriptors, Prev: Cplusplus, Up: Top
-
-Table of Stab Types
-*******************
-
- The following are all the possible values for the stab type field,
-for a.out files, in numeric order. This does not apply to XCOFF, but
-it does apply to stabs in sections (*note Stab Sections::.). Stabs in
-ECOFF use these values but add 0x8f300 to distinguish them from non-stab
-symbols.
-
- The symbolic names are defined in the file `include/aout/stabs.def'.
-
-* Menu:
-
-* Non-Stab Symbol Types:: Types from 0 to 0x1f
-* Stab Symbol Types:: Types from 0x20 to 0xff
-
-
-File: stabs.info, Node: Non-Stab Symbol Types, Next: Stab Symbol Types, Up: Stab Types
-
-Non-Stab Symbol Types
-=====================
-
- The following types are used by the linker and assembler, not by stab
-directives. Since this document does not attempt to describe aspects of
-object file format other than the debugging format, no details are
-given.
-
-`0x0 N_UNDF'
- Undefined symbol
-
-`0x2 N_ABS'
- File scope absolute symbol
-
-`0x3 N_ABS | N_EXT'
- External absolute symbol
-
-`0x4 N_TEXT'
- File scope text symbol
-
-`0x5 N_TEXT | N_EXT'
- External text symbol
-
-`0x6 N_DATA'
- File scope data symbol
-
-`0x7 N_DATA | N_EXT'
- External data symbol
-
-`0x8 N_BSS'
- File scope BSS symbol
-
-`0x9 N_BSS | N_EXT'
- External BSS symbol
-
-`0x0c N_FN_SEQ'
- Same as `N_FN', for Sequent compilers
-
-`0x0a N_INDR'
- Symbol is indirected to another symbol
-
-`0x12 N_COMM'
- Common--visible after shared library dynamic link
-
-`0x14 N_SETA'
-`0x15 N_SETA | N_EXT'
- Absolute set element
-
-`0x16 N_SETT'
-`0x17 N_SETT | N_EXT'
- Text segment set element
-
-`0x18 N_SETD'
-`0x19 N_SETD | N_EXT'
- Data segment set element
-
-`0x1a N_SETB'
-`0x1b N_SETB | N_EXT'
- BSS segment set element
-
-`0x1c N_SETV'
-`0x1d N_SETV | N_EXT'
- Pointer to set vector
-
-`0x1e N_WARNING'
- Print a warning message during linking
-
-`0x1f N_FN'
- File name of a `.o' file
-
-
-File: stabs.info, Node: Stab Symbol Types, Prev: Non-Stab Symbol Types, Up: Stab Types
-
-Stab Symbol Types
-=================
-
- The following symbol types indicate that this is a stab. This is the
-full list of stab numbers, including stab types that are used in
-languages other than C.
-
-`0x20 N_GSYM'
- Global symbol; see *Note Global Variables::.
-
-`0x22 N_FNAME'
- Function name (for BSD Fortran); see *Note Procedures::.
-
-`0x24 N_FUN'
- Function name (*note Procedures::.) or text segment variable
- (*note Statics::.).
-
-`0x26 N_STSYM'
- Data segment file-scope variable; see *Note Statics::.
-
-`0x28 N_LCSYM'
- BSS segment file-scope variable; see *Note Statics::.
-
-`0x2a N_MAIN'
- Name of main routine; see *Note Main Program::.
-
-`0x2c N_ROSYM'
- Variable in `.rodata' section; see *Note Statics::.
-
-`0x30 N_PC'
- Global symbol (for Pascal); see *Note N_PC::.
-
-`0x32 N_NSYMS'
- Number of symbols (according to Ultrix V4.0); see *Note N_NSYMS::.
-
-`0x34 N_NOMAP'
- No DST map; see *Note N_NOMAP::.
-
-`0x38 N_OBJ'
- Object file (Solaris2).
-
-`0x3c N_OPT'
- Debugger options (Solaris2).
-
-`0x40 N_RSYM'
- Register variable; see *Note Register Variables::.
-
-`0x42 N_M2C'
- Modula-2 compilation unit; see *Note N_M2C::.
-
-`0x44 N_SLINE'
- Line number in text segment; see *Note Line Numbers::.
-
-`0x46 N_DSLINE'
- Line number in data segment; see *Note Line Numbers::.
-
-`0x48 N_BSLINE'
- Line number in bss segment; see *Note Line Numbers::.
-
-`0x48 N_BROWS'
- Sun source code browser, path to `.cb' file; see *Note N_BROWS::.
-
-`0x4a N_DEFD'
- GNU Modula2 definition module dependency; see *Note N_DEFD::.
-
-`0x4c N_FLINE'
- Function start/body/end line numbers (Solaris2).
-
-`0x50 N_EHDECL'
- GNU C++ exception variable; see *Note N_EHDECL::.
-
-`0x50 N_MOD2'
- Modula2 info "for imc" (according to Ultrix V4.0); see *Note
- N_MOD2::.
-
-`0x54 N_CATCH'
- GNU C++ `catch' clause; see *Note N_CATCH::.
-
-`0x60 N_SSYM'
- Structure of union element; see *Note N_SSYM::.
-
-`0x62 N_ENDM'
- Last stab for module (Solaris2).
-
-`0x64 N_SO'
- Path and name of source file; see *Note Source Files::.
-
-`0x80 N_LSYM'
- Stack variable (*note Stack Variables::.) or type (*note
- Typedefs::.).
-
-`0x82 N_BINCL'
- Beginning of an include file (Sun only); see *Note Include Files::.
-
-`0x84 N_SOL'
- Name of include file; see *Note Include Files::.
-
-`0xa0 N_PSYM'
- Parameter variable; see *Note Parameters::.
-
-`0xa2 N_EINCL'
- End of an include file; see *Note Include Files::.
-
-`0xa4 N_ENTRY'
- Alternate entry point; see *Note Alternate Entry Points::.
-
-`0xc0 N_LBRAC'
- Beginning of a lexical block; see *Note Block Structure::.
-
-`0xc2 N_EXCL'
- Place holder for a deleted include file; see *Note Include Files::.
-
-`0xc4 N_SCOPE'
- Modula2 scope information (Sun linker); see *Note N_SCOPE::.
-
-`0xe0 N_RBRAC'
- End of a lexical block; see *Note Block Structure::.
-
-`0xe2 N_BCOMM'
- Begin named common block; see *Note Common Blocks::.
-
-`0xe4 N_ECOMM'
- End named common block; see *Note Common Blocks::.
-
-`0xe8 N_ECOML'
- Member of a common block; see *Note Common Blocks::.
-
-`0xea N_WITH'
- Pascal `with' statement: type,,0,0,offset (Solaris2).
-
-`0xf0 N_NBTEXT'
- Gould non-base registers; see *Note Gould::.
-
-`0xf2 N_NBDATA'
- Gould non-base registers; see *Note Gould::.
-
-`0xf4 N_NBBSS'
- Gould non-base registers; see *Note Gould::.
-
-`0xf6 N_NBSTS'
- Gould non-base registers; see *Note Gould::.
-
-`0xf8 N_NBLCS'
- Gould non-base registers; see *Note Gould::.
-
-
-File: stabs.info, Node: Symbol Descriptors, Next: Type Descriptors, Prev: Stab Types, Up: Top
-
-Table of Symbol Descriptors
-***************************
-
- The symbol descriptor is the character which follows the colon in
-many stabs, and which tells what kind of stab it is. *Note String
-Field::, for more information about their use.
-
-`DIGIT'
-`('
-`-'
- Variable on the stack; see *Note Stack Variables::.
-
-`:'
- C++ nested symbol; see *Note Nested Symbols::
-
-`a'
- Parameter passed by reference in register; see *Note Reference
- Parameters::.
-
-`b'
- Based variable; see *Note Based Variables::.
-
-`c'
- Constant; see *Note Constants::.
-
-`C'
- Conformant array bound (Pascal, maybe other languages); *Note
- Conformant Arrays::. Name of a caught exception (GNU C++). These
- can be distinguished because the latter uses `N_CATCH' and the
- former uses another symbol type.
-
-`d'
- Floating point register variable; see *Note Register Variables::.
-
-`D'
- Parameter in floating point register; see *Note Register
- Parameters::.
-
-`f'
- File scope function; see *Note Procedures::.
-
-`F'
- Global function; see *Note Procedures::.
-
-`G'
- Global variable; see *Note Global Variables::.
-
-`i'
- *Note Register Parameters::.
-
-`I'
- Internal (nested) procedure; see *Note Nested Procedures::.
-
-`J'
- Internal (nested) function; see *Note Nested Procedures::.
-
-`L'
- Label name (documented by AIX, no further information known).
-
-`m'
- Module; see *Note Procedures::.
-
-`p'
- Argument list parameter; see *Note Parameters::.
-
-`pP'
- *Note Parameters::.
-
-`pF'
- Fortran Function parameter; see *Note Parameters::.
-
-`P'
- Unfortunately, three separate meanings have been independently
- invented for this symbol descriptor. At least the GNU and Sun
- uses can be distinguished by the symbol type. Global Procedure
- (AIX) (symbol type used unknown); see *Note Procedures::.
- Register parameter (GNU) (symbol type `N_PSYM'); see *Note
- Parameters::. Prototype of function referenced by this file (Sun
- `acc') (symbol type `N_FUN').
-
-`Q'
- Static Procedure; see *Note Procedures::.
-
-`R'
- Register parameter; see *Note Register Parameters::.
-
-`r'
- Register variable; see *Note Register Variables::.
-
-`S'
- File scope variable; see *Note Statics::.
-
-`s'
- Local variable (OS9000).
-
-`t'
- Type name; see *Note Typedefs::.
-
-`T'
- Enumeration, structure, or union tag; see *Note Typedefs::.
-
-`v'
- Parameter passed by reference; see *Note Reference Parameters::.
-
-`V'
- Procedure scope static variable; see *Note Statics::.
-
-`x'
- Conformant array; see *Note Conformant Arrays::.
-
-`X'
- Function return variable; see *Note Parameters::.
-
-
-File: stabs.info, Node: Type Descriptors, Next: Expanded Reference, Prev: Symbol Descriptors, Up: Top
-
-Table of Type Descriptors
-*************************
-
- The type descriptor is the character which follows the type number
-and an equals sign. It specifies what kind of type is being defined.
-*Note String Field::, for more information about their use.
-
-`DIGIT'
-`('
- Type reference; see *Note String Field::.
-
-`-'
- Reference to builtin type; see *Note Negative Type Numbers::.
-
-`#'
- Method (C++); see *Note Method Type Descriptor::.
-
-`*'
- Pointer; see *Note Miscellaneous Types::.
-
-`&'
- Reference (C++).
-
-`@'
- Type Attributes (AIX); see *Note String Field::. Member (class
- and variable) type (GNU C++); see *Note Member Type Descriptor::.
-
-`a'
- Array; see *Note Arrays::.
-
-`A'
- Open array; see *Note Arrays::.
-
-`b'
- Pascal space type (AIX); see *Note Miscellaneous Types::. Builtin
- integer type (Sun); see *Note Builtin Type Descriptors::. Const
- and volatile qualfied type (OS9000).
-
-`B'
- Volatile-qualified type; see *Note Miscellaneous Types::.
-
-`c'
- Complex builtin type (AIX); see *Note Builtin Type Descriptors::.
- Const-qualified type (OS9000).
-
-`C'
- COBOL Picture type. See AIX documentation for details.
-
-`d'
- File type; see *Note Miscellaneous Types::.
-
-`D'
- N-dimensional dynamic array; see *Note Arrays::.
-
-`e'
- Enumeration type; see *Note Enumerations::.
-
-`E'
- N-dimensional subarray; see *Note Arrays::.
-
-`f'
- Function type; see *Note Function Types::.
-
-`F'
- Pascal function parameter; see *Note Function Types::
-
-`g'
- Builtin floating point type; see *Note Builtin Type Descriptors::.
-
-`G'
- COBOL Group. See AIX documentation for details.
-
-`i'
- Imported type (AIX); see *Note Cross-References::.
- Volatile-qualified type (OS9000).
-
-`k'
- Const-qualified type; see *Note Miscellaneous Types::.
-
-`K'
- COBOL File Descriptor. See AIX documentation for details.
-
-`M'
- Multiple instance type; see *Note Miscellaneous Types::.
-
-`n'
- String type; see *Note Strings::.
-
-`N'
- Stringptr; see *Note Strings::.
-
-`o'
- Opaque type; see *Note Typedefs::.
-
-`p'
- Procedure; see *Note Function Types::.
-
-`P'
- Packed array; see *Note Arrays::.
-
-`r'
- Range type; see *Note Subranges::.
-
-`R'
- Builtin floating type; see *Note Builtin Type Descriptors:: (Sun).
- Pascal subroutine parameter; see *Note Function Types:: (AIX).
- Detecting this conflict is possible with careful parsing (hint: a
- Pascal subroutine parameter type will always contain a comma, and
- a builtin type descriptor never will).
-
-`s'
- Structure type; see *Note Structures::.
-
-`S'
- Set type; see *Note Miscellaneous Types::.
-
-`u'
- Union; see *Note Unions::.
-
-`v'
- Variant record. This is a Pascal and Modula-2 feature which is
- like a union within a struct in C. See AIX documentation for
- details.
-
-`w'
- Wide character; see *Note Builtin Type Descriptors::.
-
-`x'
- Cross-reference; see *Note Cross-References::.
-
-`Y'
- Used by IBM's xlC C++ compiler (for structures, I think).
-
-`z'
- gstring; see *Note Strings::.
-
-
-File: stabs.info, Node: Expanded Reference, Next: Questions, Prev: Type Descriptors, Up: Top
-
-Expanded Reference by Stab Type
-*******************************
-
- For a full list of stab types, and cross-references to where they are
-described, see *Note Stab Types::. This appendix just covers certain
-stabs which are not yet described in the main body of this document;
-eventually the information will all be in one place.
-
- Format of an entry:
-
- The first line is the symbol type (see `include/aout/stab.def').
-
- The second line describes the language constructs the symbol type
-represents.
-
- The third line is the stab format with the significant stab fields
-named and the rest NIL.
-
- Subsequent lines expand upon the meaning and possible values for each
-significant stab field.
-
- Finally, any further information.
-
-* Menu:
-
-* N_PC:: Pascal global symbol
-* N_NSYMS:: Number of symbols
-* N_NOMAP:: No DST map
-* N_M2C:: Modula-2 compilation unit
-* N_BROWS:: Path to .cb file for Sun source code browser
-* N_DEFD:: GNU Modula2 definition module dependency
-* N_EHDECL:: GNU C++ exception variable
-* N_MOD2:: Modula2 information "for imc"
-* N_CATCH:: GNU C++ "catch" clause
-* N_SSYM:: Structure or union element
-* N_SCOPE:: Modula2 scope information (Sun only)
-* Gould:: non-base register symbols used on Gould systems
-* N_LENG:: Length of preceding entry
-
-
-File: stabs.info, Node: N_PC, Next: N_NSYMS, Up: Expanded Reference
-
-N_PC
-====
-
- - `.stabs': N_PC
- Global symbol (for Pascal).
-
- "name" -> "symbol_name" <<?>>
- value -> supposedly the line number (stab.def is skeptical)
-
- `stabdump.c' says:
-
- global pascal symbol: name,,0,subtype,line
- << subtype? >>
-
-
-File: stabs.info, Node: N_NSYMS, Next: N_NOMAP, Prev: N_PC, Up: Expanded Reference
-
-N_NSYMS
-=======
-
- - `.stabn': N_NSYMS
- Number of symbols (according to Ultrix V4.0).
-
- 0, files,,funcs,lines (stab.def)
-
-
-File: stabs.info, Node: N_NOMAP, Next: N_M2C, Prev: N_NSYMS, Up: Expanded Reference
-
-N_NOMAP
-=======
-
- - `.stabs': N_NOMAP
- No DST map for symbol (according to Ultrix V4.0). I think this
- means a variable has been optimized out.
-
- name, ,0,type,ignored (stab.def)
-
-
-File: stabs.info, Node: N_M2C, Next: N_BROWS, Prev: N_NOMAP, Up: Expanded Reference
-
-N_M2C
-=====
-
- - `.stabs': N_M2C
- Modula-2 compilation unit.
-
- "string" -> "unit_name,unit_time_stamp[,code_time_stamp]"
- desc -> unit_number
- value -> 0 (main unit)
- 1 (any other unit)
-
- See `Dbx and Dbxtool Interfaces', 2nd edition, by Sun, 1988, for
- more information.
-
-
-
-File: stabs.info, Node: N_BROWS, Next: N_DEFD, Prev: N_M2C, Up: Expanded Reference
-
-N_BROWS
-=======
-
- - `.stabs': N_BROWS
- Sun source code browser, path to `.cb' file
-
- <<?>> "path to associated `.cb' file"
-
- Note: N_BROWS has the same value as N_BSLINE.
-
-
-File: stabs.info, Node: N_DEFD, Next: N_EHDECL, Prev: N_BROWS, Up: Expanded Reference
-
-N_DEFD
-======
-
- - `.stabn': N_DEFD
- GNU Modula2 definition module dependency.
-
- GNU Modula-2 definition module dependency. The value is the
- modification time of the definition file. The other field is
- non-zero if it is imported with the GNU M2 keyword `%INITIALIZE'.
- Perhaps `N_M2C' can be used if there are enough empty fields?
-
-
-File: stabs.info, Node: N_EHDECL, Next: N_MOD2, Prev: N_DEFD, Up: Expanded Reference
-
-N_EHDECL
-========
-
- - `.stabs': N_EHDECL
- GNU C++ exception variable <<?>>.
-
- "STRING is variable name"
-
- Note: conflicts with `N_MOD2'.
-
-
-File: stabs.info, Node: N_MOD2, Next: N_CATCH, Prev: N_EHDECL, Up: Expanded Reference
-
-N_MOD2
-======
-
- - `.stab?': N_MOD2
- Modula2 info "for imc" (according to Ultrix V4.0)
-
- Note: conflicts with `N_EHDECL' <<?>>
-
-
-File: stabs.info, Node: N_CATCH, Next: N_SSYM, Prev: N_MOD2, Up: Expanded Reference
-
-N_CATCH
-=======
-
- - `.stabn': N_CATCH
- GNU C++ `catch' clause
-
- GNU C++ `catch' clause. The value is its address. The desc field
- is nonzero if this entry is immediately followed by a `CAUGHT' stab
- saying what exception was caught. Multiple `CAUGHT' stabs means
- that multiple exceptions can be caught here. If desc is 0, it
- means all exceptions are caught here.
-
-
-File: stabs.info, Node: N_SSYM, Next: N_SCOPE, Prev: N_CATCH, Up: Expanded Reference
-
-N_SSYM
-======
-
- - `.stabn': N_SSYM
- Structure or union element.
-
- The value is the offset in the structure.
-
- <<?looking at structs and unions in C I didn't see these>>
-
-
-File: stabs.info, Node: N_SCOPE, Next: Gould, Prev: N_SSYM, Up: Expanded Reference
-
-N_SCOPE
-=======
-
- - `.stab?': N_SCOPE
- Modula2 scope information (Sun linker) <<?>>
-
-
-File: stabs.info, Node: Gould, Next: N_LENG, Prev: N_SCOPE, Up: Expanded Reference
-
-Non-base registers on Gould systems
-===================================
-
- - `.stab?': N_NBTEXT
- - `.stab?': N_NBDATA
- - `.stab?': N_NBBSS
- - `.stab?': N_NBSTS
- - `.stab?': N_NBLCS
- These are used on Gould systems for non-base registers syms.
-
- However, the following values are not the values used by Gould;
- they are the values which GNU has been documenting for these
- values for a long time, without actually checking what Gould uses.
- I include these values only because perhaps some someone actually
- did something with the GNU information (I hope not, why GNU
- knowingly assigned wrong values to these in the header file is a
- complete mystery to me).
-
- 240 0xf0 N_NBTEXT ??
- 242 0xf2 N_NBDATA ??
- 244 0xf4 N_NBBSS ??
- 246 0xf6 N_NBSTS ??
- 248 0xf8 N_NBLCS ??
-
-
-File: stabs.info, Node: N_LENG, Prev: Gould, Up: Expanded Reference
-
-N_LENG
-======
-
- - `.stabn': N_LENG
- Second symbol entry containing a length-value for the preceding
- entry. The value is the length.
-
-
-File: stabs.info, Node: Questions, Next: Stab Sections, Prev: Expanded Reference, Up: Top
-
-Questions and Anomalies
-***********************
-
- * For GNU C stabs defining local and global variables (`N_LSYM' and
- `N_GSYM'), the desc field is supposed to contain the source line
- number on which the variable is defined. In reality the desc
- field is always 0. (This behavior is defined in `dbxout.c' and
- putting a line number in desc is controlled by `#ifdef
- WINNING_GDB', which defaults to false). GDB supposedly uses this
- information if you say `list VAR'. In reality, VAR can be a
- variable defined in the program and GDB says `function VAR not
- defined'.
-
- * In GNU C stabs, there seems to be no way to differentiate tag
- types: structures, unions, and enums (symbol descriptor `T') and
- typedefs (symbol descriptor `t') defined at file scope from types
- defined locally to a procedure or other more local scope. They
- all use the `N_LSYM' stab type. Types defined at procedure scope
- are emited after the `N_RBRAC' of the preceding function and
- before the code of the procedure in which they are defined. This
- is exactly the same as types defined in the source file between
- the two procedure bodies. GDB overcompensates by placing all
- types in block #1, the block for symbols of file scope. This is
- true for default, `-ansi' and `-traditional' compiler options.
- (Bugs gcc/1063, gdb/1066.)
-
- * What ends the procedure scope? Is it the proc block's `N_RBRAC'
- or the next `N_FUN'? (I believe its the first.)
-
-
-File: stabs.info, Node: Stab Sections, Next: Symbol Types Index, Prev: Questions, Up: Top
-
-Using Stabs in Their Own Sections
-*********************************
-
- Many object file formats allow tools to create object files with
-custom sections containing any arbitrary data. For any such object file
-format, stabs can be embedded in special sections. This is how stabs
-are used with ELF and SOM, and aside from ECOFF and XCOFF, is how stabs
-are used with COFF.
-
-* Menu:
-
-* Stab Section Basics:: How to embed stabs in sections
-* ELF Linker Relocation:: Sun ELF hacks
-
-
-File: stabs.info, Node: Stab Section Basics, Next: ELF Linker Relocation, Up: Stab Sections
-
-How to Embed Stabs in Sections
-==============================
-
- The assembler creates two custom sections, a section named `.stab'
-which contains an array of fixed length structures, one struct per stab,
-and a section named `.stabstr' containing all the variable length
-strings that are referenced by stabs in the `.stab' section. The byte
-order of the stabs binary data depends on the object file format. For
-ELF, it matches the byte order of the ELF file itself, as determined
-from the `EI_DATA' field in the `e_ident' member of the ELF header.
-For SOM, it is always big-endian (is this true??? FIXME). For COFF, it
-matches the byte order of the COFF headers. The meaning of the fields
-is the same as for a.out (*note Symbol Table Format::.), except that
-the `n_strx' field is relative to the strings for the current
-compilation unit (which can be found using the synthetic N_UNDF stab
-described below), rather than the entire string table.
-
- The first stab in the `.stab' section for each compilation unit is
-synthetic, generated entirely by the assembler, with no corresponding
-`.stab' directive as input to the assembler. This stab contains the
-following fields:
-
-`n_strx'
- Offset in the `.stabstr' section to the source filename.
-
-`n_type'
- `N_UNDF'.
-
-`n_other'
- Unused field, always zero. This may eventually be used to hold
- overflows from the count in the `n_desc' field.
-
-`n_desc'
- Count of upcoming symbols, i.e., the number of remaining stabs for
- this source file.
-
-`n_value'
- Size of the string table fragment associated with this source
- file, in bytes.
-
- The `.stabstr' section always starts with a null byte (so that string
-offsets of zero reference a null string), followed by random length
-strings, each of which is null byte terminated.
-
- The ELF section header for the `.stab' section has its `sh_link'
-member set to the section number of the `.stabstr' section, and the
-`.stabstr' section has its ELF section header `sh_type' member set to
-`SHT_STRTAB' to mark it as a string table. SOM and COFF have no way of
-linking the sections together or marking them as string tables.
-
- For COFF, the `.stab' and `.stabstr' sections may be simply
-concatenated by the linker. GDB then uses the `n_desc' fields to
-figure out the extent of the original sections. Similarly, the
-`n_value' fields of the header symbols are added together in order to
-get the actual position of the strings in a desired `.stabstr' section.
-Although this design obviates any need for the linker to relocate or
-otherwise manipulate `.stab' and `.stabstr' sections, it also requires
-some care to ensure that the offsets are calculated correctly. For
-instance, if the linker were to pad in between the `.stabstr' sections
-before concatenating, then the offsets to strings in the middle of the
-executable's `.stabstr' section would be wrong.
-
- The GNU linker is able to optimize stabs information by merging
-duplicate strings and removing duplicate header file information (*note
-Include Files::.). When some versions of the GNU linker optimize stabs
-in sections, they remove the leading `N_UNDF' symbol and arranges for
-all the `n_strx' fields to be relative to the start of the `.stabstr'
-section.
-
-
-File: stabs.info, Node: ELF Linker Relocation, Prev: Stab Section Basics, Up: Stab Sections
-
-Having the Linker Relocate Stabs in ELF
-=======================================
-
- This section describes some Sun hacks for Stabs in ELF; it does not
-apply to COFF or SOM.
-
- To keep linking fast, you don't want the linker to have to relocate
-very many stabs. Making sure this is done for `N_SLINE', `N_RBRAC',
-and `N_LBRAC' stabs is the most important thing (see the descriptions
-of those stabs for more information). But Sun's stabs in ELF has taken
-this further, to make all addresses in the `n_value' field (functions
-and static variables) relative to the source file. For the `N_SO'
-symbol itself, Sun simply omits the address. To find the address of
-each section corresponding to a given source file, the compiler puts
-out symbols giving the address of each section for a given source file.
-Since these are ELF (not stab) symbols, the linker relocates them
-correctly without having to touch the stabs section. They are named
-`Bbss.bss' for the bss section, `Ddata.data' for the data section, and
-`Drodata.rodata' for the rodata section. For the text section, there
-is no such symbol (but there should be, see below). For an example of
-how these symbols work, *Note Stab Section Transformations::. GCC does
-not provide these symbols; it instead relies on the stabs getting
-relocated. Thus addresses which would normally be relative to
-`Bbss.bss', etc., are already relocated. The Sun linker provided with
-Solaris 2.2 and earlier relocates stabs using normal ELF relocation
-information, as it would do for any section. Sun has been threatening
-to kludge their linker to not do this (to speed up linking), even
-though the correct way to avoid having the linker do these relocations
-is to have the compiler no longer output relocatable values. Last I
-heard they had been talked out of the linker kludge. See Sun point
-patch 101052-01 and Sun bug 1142109. With the Sun compiler this
-affects `S' symbol descriptor stabs (*note Statics::.) and functions
-(*note Procedures::.). In the latter case, to adopt the clean solution
-(making the value of the stab relative to the start of the compilation
-unit), it would be necessary to invent a `Ttext.text' symbol, analogous
-to the `Bbss.bss', etc., symbols. I recommend this rather than using a
-zero value and getting the address from the ELF symbols.
-
- Finding the correct `Bbss.bss', etc., symbol is difficult, because
-the linker simply concatenates the `.stab' sections from each `.o' file
-without including any information about which part of a `.stab' section
-comes from which `.o' file. The way GDB does this is to look for an
-ELF `STT_FILE' symbol which has the same name as the last component of
-the file name from the `N_SO' symbol in the stabs (for example, if the
-file name is `../../gdb/main.c', it looks for an ELF `STT_FILE' symbol
-named `main.c'). This loses if different files have the same name
-(they could be in different directories, a library could have been
-copied from one system to another, etc.). It would be much cleaner to
-have the `Bbss.bss' symbols in the stabs themselves. Having the linker
-relocate them there is no more work than having the linker relocate ELF
-symbols, and it solves the problem of having to associate the ELF and
-stab symbols. However, no one has yet designed or implemented such a
-scheme.
-