A function is represented by an @samp{F} symbol descriptor for a global
(extern) function, and @samp{f} for a static (local) function. The
-value is the address of the start of the function (absolute
-for @code{a.out}; relative to the start of the file for Sun's
-stabs-in-ELF). The type information of the stab represents the return
-type of the function; thus @samp{foo:f5} means that foo is a function
-returning type 5. There is no need to try to get the line number of the
-start of the function from the stab for the function; it is in the next
+value is the address of the start of the function. For @code{a.out}, it
+is already relocated. For stabs in ELF, the SunPRO compiler version
+2.0.1 and GCC put out an address which gets relocated by the linker. In
+a future release SunPRO is planning to put out zero, in which case the
+address can be found from the ELF (non-stab) symbol. Because looking
+things up in the ELF symbols would probably be slow, I'm not sure how to
+find which symbol of that name is the right one, and this doesn't
+provide any way to deal with nested functions, it would probably be
+better to make the value of the stab an address relative to the start of
+the file. See @ref{Stabs In ELF} for more information on linker
+relocation of stabs in ELF files.
+
+The type information of the stab represents the return type of the
+function; thus @samp{foo:f5} means that foo is a function returning type
+5. There is no need to try to get the line number of the start of the
+function from the stab for the function; it is in the next
@code{N_SLINE} symbol.
@c FIXME: verify whether the "I suspect" below is true or not.
In ECOFF files, the storage class is used to specify the section, so the
stab type need not indicate the section.
-In ELF files, for Solaris 2.1, symbol descriptor @samp{S} means that the
-address is absolute (ld relocates it) and symbol descriptor @samp{V}
-means that the address is relative to the start of the relevant section
-for that compilation unit. I don't know what it does for @samp{S} stabs
-on Solaris 2.3 (in which ld no longer relocates stabs). For more
-information on ld stab relocation, @xref{Stabs In ELF}.
+In ELF files, for the SunPRO compiler version 2.0.1, symbol descriptor
+@samp{S} means that the address is absolute (the linker relocates it)
+and symbol descriptor @samp{V} means that the address is relative to the
+start of the relevant section for that compilation unit. SunPRO has
+plans to have the linker stop relocating stabs; I suspect that their the
+debugger gets the address from the corresponding ELF (not stab) symbol.
+I'm not sure how to find which symbol of that name is the right one.
+The clean way to do all this would be to have a the value of a symbol
+descriptor @samp{S} symbol be an offset relative to the start of the
+file, just like everything else, but that introduces obvious
+compatibility problems. For more information on linker stab relocation,
+@xref{Stabs In ELF}.
@node Based Variables
@section Fortran Based Variables
.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
@end example
-For larger types, GCC 2.4.5 puts out bounds in octal, with a leading 0.
-In this case a negative bound consists of a number which is a 1 bit
-followed by a bunch of 0 bits, and a positive bound is one in which a
-bunch of bits are 1. All known versions of dbx and GDB version 4 accept
-this, but GDB 3.5 refuses to read the whole file containing such
-symbols. So GCC 2.3.3 did not output the proper size for these types.
-@c FIXME: How about an example?
+For larger types, GCC 2.4.5 puts out bounds in octal, with one or more
+leading zeroes. In this case a negative bound consists of a number
+which is a 1 bit (for the sign bit) followed by a 0 bit for each bit in
+the number (except the sign bit), and a positive bound is one which is a
+1 bit for each bit in the number (except possibly the sign bit). All
+known versions of dbx and GDB version 4 accept this (at least in the
+sense of not refusing to process the file), but GDB 3.5 refuses to read
+the whole file containing such symbols. So GCC 2.3.3 did not output the
+proper size for these types. As an example of octal bounds, the string
+fields of the stabs for 64 bit integer types look like:
+
+@c .stabs directives, etc., omitted to make it fit on the page.
+@example
+long int:t3=r1;001000000000000000000000;000777777777777777777777;
+long unsigned int:t5=r1;000000000000000000000000;001777777777777777777777;
+@end example
If the lower bound of a subrange is 0 and the upper bound is negative,
the type is an unsigned integral type whose size in bytes is the
string table.
To keep linking fast, it is a bad idea to have the linker relocating
-stabs, so (except for Solaris 2.2 and earlier, see below) none of the
-addresses in the @code{n_value} field of the stabs are relocated by the
-linker. Instead they are relative to the source file (or some entity
-smaller than a source file, like a function). To find the address of
-each section corresponding to a given source file, the compiler puts out
+stabs, so (except for a few cases, see below) none of the addresses in
+the @code{n_value} field of the stabs are relocated by the linker.
+Instead they are relative to the source file (or some entity smaller
+than a source file, like a function). 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 can relocate them
-correctly. They are named @code{Bbss.bss} for the bss section,
-@code{Ddata.data} for the data section, and @code{Drodata.rodata} for
-the rodata section. For the text section, there is no such symbol. For
+Since these are ELF (not stab) symbols, the linker relocates them
+correctly without having to touch the stabs section. They are named
+@code{Bbss.bss} for the bss section, @code{Ddata.data} for the data
+section, and @code{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, @xref{ELF Transformations}. GCC
does not provide these symbols; it instead relies on the stabs getting
-relocated, which loses for Solaris 2.3 (see below). Thus address which
-would normally be relative to @code{Bbss.bss}, etc., are absolute. The
-linker provided with Solaris 2.2 and earlier relocates stabs using
-relocation information from a @code{.rela.stab} section, which means
-that the value of an @code{N_FUN} stab in an executable is the actual
-address. I think this is just standard ELF relocations, as it would do
-for any section, rather than a special-purpose stabs hack. For Solaris
-2.3 and later, the linker ignores relocations for the stabs section.
-The value of a @code{N_FUN} stab is zero and the address of a function
-can be obtained from the ELF (non-stab) symbols. Sun, in reference to
-bug 1142109, has verified that this is intentional. Because looking
-things up in the ELF symbols would probably be slow, and this doesn't
-provide any way to deal with nested functions, it would probably be
-better to use a @code{Ttext.text} symbol for stabs-in-elf on non-Solaris
-machines, and make the address in the @code{N_FUN} relative to the
-@code{Ttext.text} symbol. In addition to @code{N_FUN} symbols, whether
-the linker relocates stabs also affects some @code{N_ROSYM},
-@code{N_STSYM}, and @code{N_LCSYM} symbols; see @ref{Statics}.
+relocated, which slows down linking. Thus addresses which would
+normally be relative to @code{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. This affects
+@samp{S} symbol descriptor stabs (@pxref{Statics}) and functions
+(@pxref{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 @code{Ttext.text} symbol,
+analogous to the @code{Bbss.bss}, etc., symbols. I recommend this
+rather than using a zero value and getting the address from the ELF
+symbols.
@node Symbol Types Index
@unnumbered Symbol Types Index