124 lines
6.4 KiB
HTML
124 lines
6.4 KiB
HTML
|
<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>
|
||
|
|