| <html lang="en"> |
| <head> |
| <title>Output Section Keywords - Untitled</title> |
| <meta http-equiv="Content-Type" content="text/html"> |
| <meta name="description" content="Untitled"> |
| <meta name="generator" content="makeinfo 4.13"> |
| <link title="Top" rel="start" href="index.html#Top"> |
| <link rel="up" href="SECTIONS.html#SECTIONS" title="SECTIONS"> |
| <link rel="prev" href="Output-Section-Data.html#Output-Section-Data" title="Output Section Data"> |
| <link rel="next" href="Output-Section-Discarding.html#Output-Section-Discarding" title="Output Section Discarding"> |
| <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> |
| <!-- |
| This file documents the GNU linker LD |
| (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) |
| version 2.33.1. |
| |
| Copyright (C) 1991-2019 Free Software Foundation, Inc. |
| |
| 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="Output-Section-Keywords"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Output-Section-Discarding.html#Output-Section-Discarding">Output Section Discarding</a>, |
| Previous: <a rel="previous" accesskey="p" href="Output-Section-Data.html#Output-Section-Data">Output Section Data</a>, |
| Up: <a rel="up" accesskey="u" href="SECTIONS.html#SECTIONS">SECTIONS</a> |
| <hr> |
| </div> |
| |
| <h4 class="subsection">3.6.6 Output Section Keywords</h4> |
| |
| <p>There are a couple of keywords which can appear as output section |
| commands. |
| |
| |
| <a name="index-CREATE_005fOBJECT_005fSYMBOLS-486"></a> |
| <a name="index-input-filename-symbols-487"></a> |
| <a name="index-filename-symbols-488"></a> |
| <dl><dt><code>CREATE_OBJECT_SYMBOLS</code><dd>The command tells the linker to create a symbol for each input file. |
| The name of each symbol will be the name of the corresponding input |
| file. The section of each symbol will be the output section in which |
| the <code>CREATE_OBJECT_SYMBOLS</code> command appears. |
| |
| <p>This is conventional for the a.out object file format. It is not |
| normally used for any other object file format. |
| |
| <p><a name="index-CONSTRUCTORS-489"></a><a name="index-C_002b_002b-constructors_002c-arranging-in-link-490"></a><a name="index-constructors_002c-arranging-in-link-491"></a><br><dt><code>CONSTRUCTORS</code><dd>When linking using the a.out object file format, the linker uses an |
| unusual set construct to support C++ global constructors and |
| destructors. When linking object file formats which do not support |
| arbitrary sections, such as ECOFF and XCOFF, the linker will |
| automatically recognize C++ global constructors and destructors by name. |
| For these object file formats, the <code>CONSTRUCTORS</code> command tells the |
| linker to place constructor information in the output section where the |
| <code>CONSTRUCTORS</code> command appears. The <code>CONSTRUCTORS</code> command is |
| ignored for other object file formats. |
| |
| <p>The symbol <code>__CTOR_LIST__</code><!-- /@w --> marks the start of the global |
| constructors, and the symbol <code>__CTOR_END__</code><!-- /@w --> marks the end. |
| Similarly, <code>__DTOR_LIST__</code><!-- /@w --> and <code>__DTOR_END__</code><!-- /@w --> mark |
| the start and end of the global destructors. The |
| first word in the list is the number of entries, followed by the address |
| of each constructor or destructor, followed by a zero word. The |
| compiler must arrange to actually run the code. For these object file |
| formats <span class="sc">gnu</span> C++ normally calls constructors from a subroutine |
| <code>__main</code>; a call to <code>__main</code> is automatically inserted into |
| the startup code for <code>main</code>. <span class="sc">gnu</span> C++ normally runs |
| destructors either by using <code>atexit</code>, or directly from the function |
| <code>exit</code>. |
| |
| <p>For object file formats such as <code>COFF</code> or <code>ELF</code> which support |
| arbitrary section names, <span class="sc">gnu</span> C++ will normally arrange to put the |
| addresses of global constructors and destructors into the <code>.ctors</code> |
| and <code>.dtors</code> sections. Placing the following sequence into your |
| linker script will build the sort of table which the <span class="sc">gnu</span> C++ |
| runtime code expects to see. |
| |
| <pre class="smallexample"> __CTOR_LIST__ = .; |
| LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) |
| *(.ctors) |
| LONG(0) |
| __CTOR_END__ = .; |
| __DTOR_LIST__ = .; |
| LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) |
| *(.dtors) |
| LONG(0) |
| __DTOR_END__ = .; |
| </pre> |
| <p>If you are using the <span class="sc">gnu</span> C++ support for initialization priority, |
| which provides some control over the order in which global constructors |
| are run, you must sort the constructors at link time to ensure that they |
| are executed in the correct order. When using the <code>CONSTRUCTORS</code> |
| command, use ‘<samp><span class="samp">SORT_BY_NAME(CONSTRUCTORS)</span></samp>’ instead. When using the |
| <code>.ctors</code> and <code>.dtors</code> sections, use ‘<samp><span class="samp">*(SORT_BY_NAME(.ctors))</span></samp>’ and |
| ‘<samp><span class="samp">*(SORT_BY_NAME(.dtors))</span></samp>’ instead of just ‘<samp><span class="samp">*(.ctors)</span></samp>’ and |
| ‘<samp><span class="samp">*(.dtors)</span></samp>’. |
| |
| <p>Normally the compiler and linker will handle these issues automatically, |
| and you will not need to concern yourself with them. However, you may |
| need to consider this if you are using C++ and writing your own linker |
| scripts. |
| |
| </dl> |
| |
| </body></html> |
| |