blob: d7904c4a69d83eb8165b14274b86d21c8b6f9259 [file] [log] [blame]
<html lang="en">
<head>
<title>Statics - STABS</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="STABS">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Variables.html#Variables" title="Variables">
<link rel="prev" href="Common-Blocks.html#Common-Blocks" title="Common Blocks">
<link rel="next" href="Based-Variables.html#Based-Variables" title="Based Variables">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1992-2019 Free Software Foundation, Inc.
Contributed by Cygnus Support. Written by Julia Menapace, Jim Kingdon,
and David MacKenzie.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<div class="node">
<a name="Statics"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Based-Variables.html#Based-Variables">Based Variables</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Common-Blocks.html#Common-Blocks">Common Blocks</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Variables.html#Variables">Variables</a>
<hr>
</div>
<h3 class="section">4.5 Static Variables</h3>
<p>Initialized static variables are represented by the &lsquo;<samp><span class="samp">S</span></samp>&rsquo; and
&lsquo;<samp><span class="samp">V</span></samp>&rsquo; symbol descriptors. &lsquo;<samp><span class="samp">S</span></samp>&rsquo; means file scope static, and
&lsquo;<samp><span class="samp">V</span></samp>&rsquo; means procedure scope static. One exception: in XCOFF, IBM's
xlc compiler always uses &lsquo;<samp><span class="samp">V</span></samp>&rsquo;, and whether it is file scope or not
is distinguished by whether the stab is located within a function.
<!-- This is probably not worth mentioning; it is only true on the sparc -->
<!-- for `double' variables which although declared const are actually in -->
<!-- the data segment (the text segment can't guarantee 8 byte alignment). -->
<!-- (although GCC -->
<!-- 2.4.5 has a bug in that it uses @code{N_FUN}, so neither dbx nor GDB can -->
<!-- find the variables) -->
<p><a name="index-N_005fSTSYM-37"></a><a name="index-N_005fLCSYM-38"></a><a name="index-N_005fFUN_002c-for-variables-39"></a><a name="index-N_005fROSYM-40"></a>In a.out files, <code>N_STSYM</code> means the data section, <code>N_FUN</code>
means the text section, and <code>N_LCSYM</code> means the bss section. For
those systems with a read-only data section separate from the text
section (Solaris), <code>N_ROSYM</code> means the read-only data section.
<p>For example, the source lines:
<pre class="example"> static const int var_const = 5;
static int var_init = 2;
static int var_noinit;
</pre>
<p class="noindent">yield the following stabs:
<pre class="example"> .stabs "var_const:S1",36,0,0,_var_const # <span class="roman">36 is N_FUN</span>
...
.stabs "var_init:S1",38,0,0,_var_init # <span class="roman">38 is N_STSYM</span>
...
.stabs "var_noinit:S1",40,0,0,_var_noinit # <span class="roman">40 is N_LCSYM</span>
</pre>
<p><a name="index-C_005fSTSYM-41"></a><a name="index-C_005fBSTAT-42"></a><a name="index-C_005fESTAT-43"></a>In XCOFF files, the stab type need not indicate the section;
<code>C_STSYM</code> can be used for all statics. Also, each static variable
is enclosed in a static block. A <code>C_BSTAT</code> (emitted with a
&lsquo;<samp><span class="samp">.bs</span></samp>&rsquo; assembler directive) symbol begins the static block; its
value is the symbol number of the csect symbol whose value is the
address of the static block, its section is the section of the variables
in that static block, and its name is &lsquo;<samp><span class="samp">.bs</span></samp>&rsquo;. A <code>C_ESTAT</code>
(emitted with a &lsquo;<samp><span class="samp">.es</span></samp>&rsquo; assembler directive) symbol ends the static
block; its name is &lsquo;<samp><span class="samp">.es</span></samp>&rsquo; and its value and section are ignored.
<p>In ECOFF files, the storage class is used to specify the section, so the
stab type need not indicate the section.
<p>In ELF files, for the SunPRO compiler version 2.0.1, symbol descriptor
&lsquo;<samp><span class="samp">S</span></samp>&rsquo; means that the address is absolute (the linker relocates it)
and symbol descriptor &lsquo;<samp><span class="samp">V</span></samp>&rsquo; 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 the value of a symbol
descriptor &lsquo;<samp><span class="samp">S</span></samp>&rsquo; 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,
See <a href="ELF-Linker-Relocation.html#ELF-Linker-Relocation">ELF Linker Relocation</a>.
</body></html>