122 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			6.2 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.7">
 | 
						|
<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 Binutils)
 | 
						|
version 2.19.
 | 
						|
 | 
						|
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000,
 | 
						|
2001, 2002, 2003, 2004, 2005, 2006, 2007 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.1
 | 
						|
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; } 
 | 
						|
--></style>
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
<div class="node">
 | 
						|
<p>
 | 
						|
<a name="Output-Section-Keywords"></a>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><br>
 | 
						|
</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-394"></a>
 | 
						|
<a name="index-input-filename-symbols-395"></a>
 | 
						|
<a name="index-filename-symbols-396"></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-397"></a><a name="index-C_002b_002b-constructors_002c-arranging-in-link-398"></a><a name="index-constructors_002c-arranging-in-link-399"></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 <span class="samp">SORT_BY_NAME(CONSTRUCTORS)</span> instead.  When using the
 | 
						|
<code>.ctors</code> and <code>.dtors</code> sections, use <span class="samp">*(SORT_BY_NAME(.ctors))</span> and
 | 
						|
<span class="samp">*(SORT_BY_NAME(.dtors))</span> instead of just <span class="samp">*(.ctors)</span> and
 | 
						|
<span class="samp">*(.dtors)</span>.
 | 
						|
 | 
						|
     <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>
 | 
						|
 |