Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

187 linhas
10KB

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1992-2020 Free Software Foundation, Inc.
  4. Contributed by Cygnus Support. Written by Julia Menapace, Jim Kingdon,
  5. and David MacKenzie.
  6. Permission is granted to copy, distribute and/or modify this document
  7. under the terms of the GNU Free Documentation License, Version 1.3 or
  8. any later version published by the Free Software Foundation; with no
  9. Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
  10. Texts. A copy of the license is included in the section entitled "GNU
  11. Free Documentation License". -->
  12. <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
  13. <head>
  14. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  15. <title>Procedures (STABS)</title>
  16. <meta name="description" content="Procedures (STABS)">
  17. <meta name="keywords" content="Procedures (STABS)">
  18. <meta name="resource-type" content="document">
  19. <meta name="distribution" content="global">
  20. <meta name="Generator" content="makeinfo">
  21. <link href="index.html#Top" rel="start" title="Top">
  22. <link href="Symbol-Types-Index.html#Symbol-Types-Index" rel="index" title="Symbol Types Index">
  23. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  24. <link href="Program-Structure.html#Program-Structure" rel="up" title="Program Structure">
  25. <link href="Nested-Procedures.html#Nested-Procedures" rel="next" title="Nested Procedures">
  26. <link href="Line-Numbers.html#Line-Numbers" rel="prev" title="Line Numbers">
  27. <style type="text/css">
  28. <!--
  29. a.summary-letter {text-decoration: none}
  30. blockquote.indentedblock {margin-right: 0em}
  31. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  32. blockquote.smallquotation {font-size: smaller}
  33. div.display {margin-left: 3.2em}
  34. div.example {margin-left: 3.2em}
  35. div.lisp {margin-left: 3.2em}
  36. div.smalldisplay {margin-left: 3.2em}
  37. div.smallexample {margin-left: 3.2em}
  38. div.smalllisp {margin-left: 3.2em}
  39. kbd {font-style: oblique}
  40. pre.display {font-family: inherit}
  41. pre.format {font-family: inherit}
  42. pre.menu-comment {font-family: serif}
  43. pre.menu-preformatted {font-family: serif}
  44. pre.smalldisplay {font-family: inherit; font-size: smaller}
  45. pre.smallexample {font-size: smaller}
  46. pre.smallformat {font-family: inherit; font-size: smaller}
  47. pre.smalllisp {font-size: smaller}
  48. span.nolinebreak {white-space: nowrap}
  49. span.roman {font-family: initial; font-weight: normal}
  50. span.sansserif {font-family: sans-serif; font-weight: normal}
  51. ul.no-bullet {list-style: none}
  52. -->
  53. </style>
  54. </head>
  55. <body lang="en">
  56. <a name="Procedures"></a>
  57. <div class="header">
  58. <p>
  59. Next: <a href="Nested-Procedures.html#Nested-Procedures" accesskey="n" rel="next">Nested Procedures</a>, Previous: <a href="Line-Numbers.html#Line-Numbers" accesskey="p" rel="prev">Line Numbers</a>, Up: <a href="Program-Structure.html#Program-Structure" accesskey="u" rel="up">Program Structure</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Types-Index.html#Symbol-Types-Index" title="Index" rel="index">Index</a>]</p>
  60. </div>
  61. <hr>
  62. <a name="Procedures-1"></a>
  63. <h3 class="section">2.5 Procedures</h3>
  64. <a name="index-N_005fFUN_002c-for-functions"></a>
  65. <a name="index-N_005fFNAME"></a>
  66. <a name="index-N_005fSTSYM_002c-for-functions-_0028Sun-acc_0029"></a>
  67. <a name="index-N_005fGSYM_002c-for-functions-_0028Sun-acc_0029"></a>
  68. <p>All of the following stabs normally use the <code>N_FUN</code> symbol type.
  69. However, Sun&rsquo;s <code>acc</code> compiler on SunOS4 uses <code>N_GSYM</code> and
  70. <code>N_STSYM</code>, which means that the value of the stab for the function
  71. is useless and the debugger must get the address of the function from
  72. the non-stab symbols instead. On systems where non-stab symbols have
  73. leading underscores, the stabs will lack underscores and the debugger
  74. needs to know about the leading underscore to match up the stab and the
  75. non-stab symbol. BSD Fortran is said to use <code>N_FNAME</code> with the
  76. same restriction; the value of the symbol is not useful (I&rsquo;m not sure it
  77. really does use this, because GDB doesn&rsquo;t handle this and no one has
  78. complained).
  79. </p>
  80. <a name="index-C_005fFUN"></a>
  81. <p>A function is represented by an &lsquo;<samp>F</samp>&rsquo; symbol descriptor for a global
  82. (extern) function, and &lsquo;<samp>f</samp>&rsquo; for a static (local) function. For
  83. a.out, the value of the symbol is the address of the start of the
  84. function; it is already relocated. For stabs in ELF, the SunPRO
  85. compiler version 2.0.1 and GCC put out an address which gets relocated
  86. by the linker. In a future release SunPRO is planning to put out zero,
  87. in which case the address can be found from the ELF (non-stab) symbol.
  88. Because looking things up in the ELF symbols would probably be slow, I&rsquo;m
  89. not sure how to find which symbol of that name is the right one, and
  90. this doesn&rsquo;t provide any way to deal with nested functions, it would
  91. probably be better to make the value of the stab an address relative to
  92. the start of the file, or just absolute. See <a href="ELF-Linker-Relocation.html#ELF-Linker-Relocation">ELF Linker Relocation</a> for more information on linker relocation of stabs in ELF
  93. files. For XCOFF, the stab uses the <code>C_FUN</code> storage class and the
  94. value of the stab is meaningless; the address of the function can be
  95. found from the csect symbol (XTY_LD/XMC_PR).
  96. </p>
  97. <p>The type information of the stab represents the return type of the
  98. function; thus &lsquo;<samp>foo:f5</samp>&rsquo; means that foo is a function returning type
  99. 5. There is no need to try to get the line number of the start of the
  100. function from the stab for the function; it is in the next
  101. <code>N_SLINE</code> symbol.
  102. </p>
  103. <p>Some compilers (such as Sun&rsquo;s Solaris compiler) support an extension for
  104. specifying the types of the arguments. I suspect this extension is not
  105. used for old (non-prototyped) function definitions in C. If the
  106. extension is in use, the type information of the stab for the function
  107. is followed by type information for each argument, with each argument
  108. preceded by &lsquo;<samp>;</samp>&rsquo;. An argument type of 0 means that additional
  109. arguments are being passed, whose types and number may vary (&lsquo;<samp>...</samp>&rsquo;
  110. in ANSI C). GDB has tolerated this extension (parsed the syntax, if not
  111. necessarily used the information) since at least version 4.8; I don&rsquo;t
  112. know whether all versions of dbx tolerate it. The argument types given
  113. here are not redundant with the symbols for the formal parameters
  114. (see <a href="Parameters.html#Parameters">Parameters</a>); they are the types of the arguments as they are
  115. passed, before any conversions might take place. For example, if a C
  116. function which is declared without a prototype takes a <code>float</code>
  117. argument, the value is passed as a <code>double</code> but then converted to a
  118. <code>float</code>. Debuggers need to use the types given in the arguments
  119. when printing values, but when calling the function they need to use the
  120. types given in the symbol defining the function.
  121. </p>
  122. <p>If the return type and types of arguments of a function which is defined
  123. in another source file are specified (i.e., a function prototype in ANSI
  124. C), traditionally compilers emit no stab; the only way for the debugger
  125. to find the information is if the source file where the function is
  126. defined was also compiled with debugging symbols. As an extension the
  127. Solaris compiler uses symbol descriptor &lsquo;<samp>P</samp>&rsquo; followed by the return
  128. type of the function, followed by the arguments, each preceded by
  129. &lsquo;<samp>;</samp>&rsquo;, as in a stab with symbol descriptor &lsquo;<samp>f</samp>&rsquo; or &lsquo;<samp>F</samp>&rsquo;.
  130. This use of symbol descriptor &lsquo;<samp>P</samp>&rsquo; can be distinguished from its use
  131. for register parameters (see <a href="Register-Parameters.html#Register-Parameters">Register Parameters</a>) by the fact that it has
  132. symbol type <code>N_FUN</code>.
  133. </p>
  134. <p>The AIX documentation also defines symbol descriptor &lsquo;<samp>J</samp>&rsquo; as an
  135. internal function. I assume this means a function nested within another
  136. function. It also says symbol descriptor &lsquo;<samp>m</samp>&rsquo; is a module in
  137. Modula-2 or extended Pascal.
  138. </p>
  139. <p>Procedures (functions which do not return values) are represented as
  140. functions returning the <code>void</code> type in C. I don&rsquo;t see why this couldn&rsquo;t
  141. be used for all languages (inventing a <code>void</code> type for this purpose if
  142. necessary), but the AIX documentation defines &lsquo;<samp>I</samp>&rsquo;, &lsquo;<samp>P</samp>&rsquo;, and
  143. &lsquo;<samp>Q</samp>&rsquo; for internal, global, and static procedures, respectively.
  144. These symbol descriptors are unusual in that they are not followed by
  145. type information.
  146. </p>
  147. <p>The following example shows a stab for a function <code>main</code> which
  148. returns type number <code>1</code>. The <code>_main</code> specified for the value
  149. is a reference to an assembler label which is used to fill in the start
  150. address of the function.
  151. </p>
  152. <div class="example">
  153. <pre class="example">.stabs &quot;main:F1&quot;,36,0,0,_main # <span class="roman">36 is N_FUN</span>
  154. </pre></div>
  155. <p>The stab representing a procedure is located immediately following the
  156. code of the procedure. This stab is in turn directly followed by a
  157. group of other stabs describing elements of the procedure. These other
  158. stabs describe the procedure&rsquo;s parameters, its block local variables, and
  159. its block structure.
  160. </p>
  161. <p>If functions can appear in different sections, then the debugger may not
  162. be able to find the end of a function. Recent versions of GCC will mark
  163. the end of a function with an <code>N_FUN</code> symbol with an empty string
  164. for the name. The value is the address of the end of the current
  165. function. Without such a symbol, there is no indication of the address
  166. of the end of a function, and you must assume that it ended at the
  167. starting address of the next function or at the end of the text section
  168. for the program.
  169. </p>
  170. <hr>
  171. <div class="header">
  172. <p>
  173. Next: <a href="Nested-Procedures.html#Nested-Procedures" accesskey="n" rel="next">Nested Procedures</a>, Previous: <a href="Line-Numbers.html#Line-Numbers" accesskey="p" rel="prev">Line Numbers</a>, Up: <a href="Program-Structure.html#Program-Structure" accesskey="u" rel="up">Program Structure</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Types-Index.html#Symbol-Types-Index" title="Index" rel="index">Index</a>]</p>
  174. </div>
  175. </body>
  176. </html>