hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 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 the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".
 
(a) The FSF's Front-Cover Text is:
 
A GNU Manual
 
(b) The FSF's Back-Cover Text is:
 
You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Compiler Collection (GCC) Internals: Macros for Initialization</title>
 
<meta name="description" content="GNU Compiler Collection (GCC) Internals: Macros for Initialization">
<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Macros for Initialization">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Assembler-Format.html#Assembler-Format" rel="up" title="Assembler Format">
<link href="Instruction-Output.html#Instruction-Output" rel="next" title="Instruction Output">
<link href="Initialization.html#Initialization" rel="prev" title="Initialization">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Macros-for-Initialization"></a>
<div class="header">
<p>
Next: <a href="Instruction-Output.html#Instruction-Output" accesskey="n" rel="next">Instruction Output</a>, Previous: <a href="Initialization.html#Initialization" accesskey="p" rel="prev">Initialization</a>, Up: <a href="Assembler-Format.html#Assembler-Format" accesskey="u" rel="up">Assembler Format</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Macros-Controlling-Initialization-Routines"></a>
<h4 class="subsection">17.20.6 Macros Controlling Initialization Routines</h4>
 
<p>Here are the macros that control how the compiler handles initialization
and termination functions:
</p>
<dl>
<dt><a name="index-INIT_005fSECTION_005fASM_005fOP-1"></a>Macro: <strong>INIT_SECTION_ASM_OP</strong></dt>
<dd><p>If defined, a C string constant, including spacing, for the assembler
operation to identify the following data as initialization code.  If not
defined, GCC will assume such a section does not exist.  When you are
using special sections for initialization and termination functions, this
macro also controls how <samp>crtstuff.c</samp> and <samp>libgcc2.c</samp> arrange to
run the initialization functions.
</p></dd></dl>
 
<dl>
<dt><a name="index-HAS_005fINIT_005fSECTION"></a>Macro: <strong>HAS_INIT_SECTION</strong></dt>
<dd><p>If defined, <code>main</code> will not call <code>__main</code> as described above.
This macro should be defined for systems that control start-up code
on a symbol-by-symbol basis, such as OSF/1, and should not
be defined explicitly for systems that support <code>INIT_SECTION_ASM_OP</code>.
</p></dd></dl>
 
<dl>
<dt><a name="index-LD_005fINIT_005fSWITCH"></a>Macro: <strong>LD_INIT_SWITCH</strong></dt>
<dd><p>If defined, a C string constant for a switch that tells the linker that
the following symbol is an initialization routine.
</p></dd></dl>
 
<dl>
<dt><a name="index-LD_005fFINI_005fSWITCH"></a>Macro: <strong>LD_FINI_SWITCH</strong></dt>
<dd><p>If defined, a C string constant for a switch that tells the linker that
the following symbol is a finalization routine.
</p></dd></dl>
 
<dl>
<dt><a name="index-COLLECT_005fSHARED_005fINIT_005fFUNC"></a>Macro: <strong>COLLECT_SHARED_INIT_FUNC</strong> <em>(<var>stream</var>, <var>func</var>)</em></dt>
<dd><p>If defined, a C statement that will write a function that can be
automatically called when a shared library is loaded.  The function
should call <var>func</var>, which takes no arguments.  If not defined, and
the object format requires an explicit initialization function, then a
function called <code>_GLOBAL__DI</code> will be generated.
</p>
<p>This function and the following one are used by collect2 when linking a
shared library that needs constructors or destructors, or has DWARF2
exception tables embedded in the code.
</p></dd></dl>
 
<dl>
<dt><a name="index-COLLECT_005fSHARED_005fFINI_005fFUNC"></a>Macro: <strong>COLLECT_SHARED_FINI_FUNC</strong> <em>(<var>stream</var>, <var>func</var>)</em></dt>
<dd><p>If defined, a C statement that will write a function that can be
automatically called when a shared library is unloaded.  The function
should call <var>func</var>, which takes no arguments.  If not defined, and
the object format requires an explicit finalization function, then a
function called <code>_GLOBAL__DD</code> will be generated.
</p></dd></dl>
 
<dl>
<dt><a name="index-INVOKE_005f_005fmain"></a>Macro: <strong>INVOKE__main</strong></dt>
<dd><p>If defined, <code>main</code> will call <code>__main</code> despite the presence of
<code>INIT_SECTION_ASM_OP</code>.  This macro should be defined for systems
where the init section is not actually run automatically, but is still
useful for collecting the lists of constructors and destructors.
</p></dd></dl>
 
<dl>
<dt><a name="index-SUPPORTS_005fINIT_005fPRIORITY"></a>Macro: <strong>SUPPORTS_INIT_PRIORITY</strong></dt>
<dd><p>If nonzero, the C++ <code>init_priority</code> attribute is supported and the
compiler should emit instructions to control the order of initialization
of objects.  If zero, the compiler will issue an error message upon
encountering an <code>init_priority</code> attribute.
</p></dd></dl>
 
<dl>
<dt><a name="index-TARGET_005fHAVE_005fCTORS_005fDTORS"></a>Target Hook: <em>bool</em> <strong>TARGET_HAVE_CTORS_DTORS</strong></dt>
<dd><p>This value is true if the target supports some &ldquo;native&rdquo; method of
collecting constructors and destructors to be run at startup and exit.
It is false if we must use <code>collect2</code>.
</p></dd></dl>
 
<dl>
<dt><a name="index-TARGET_005fASM_005fCONSTRUCTOR"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_CONSTRUCTOR</strong> <em>(rtx <var>symbol</var>, int <var>priority</var>)</em></dt>
<dd><p>If defined, a function that outputs assembler code to arrange to call
the function referenced by <var>symbol</var> at initialization time.
</p>
<p>Assume that <var>symbol</var> is a <code>SYMBOL_REF</code> for a function taking
no arguments and with no return value.  If the target supports initialization
priorities, <var>priority</var> is a value between 0 and <code>MAX_INIT_PRIORITY</code>;
otherwise it must be <code>DEFAULT_INIT_PRIORITY</code>.
</p>
<p>If this macro is not defined by the target, a suitable default will
be chosen if (1) the target supports arbitrary section names, (2) the
target defines <code>CTORS_SECTION_ASM_OP</code>, or (3) <code>USE_COLLECT2</code>
is not defined.
</p></dd></dl>
 
<dl>
<dt><a name="index-TARGET_005fASM_005fDESTRUCTOR"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_DESTRUCTOR</strong> <em>(rtx <var>symbol</var>, int <var>priority</var>)</em></dt>
<dd><p>This is like <code>TARGET_ASM_CONSTRUCTOR</code> but used for termination
functions rather than initialization functions.
</p></dd></dl>
 
<p>If <code>TARGET_HAVE_CTORS_DTORS</code> is true, the initialization routine
generated for the generated object file will have static linkage.
</p>
<p>If your system uses <code>collect2</code> as the means of processing
constructors, then that program normally uses <code>nm</code> to scan
an object file for constructor functions to be called.
</p>
<p>On certain kinds of systems, you can define this macro to make
<code>collect2</code> work faster (and, in some cases, make it work at all):
</p>
<dl>
<dt><a name="index-OBJECT_005fFORMAT_005fCOFF"></a>Macro: <strong>OBJECT_FORMAT_COFF</strong></dt>
<dd><p>Define this macro if the system uses COFF (Common Object File Format)
object files, so that <code>collect2</code> can assume this format and scan
object files directly for dynamic constructor/destructor functions.
</p>
<p>This macro is effective only in a native compiler; <code>collect2</code> as
part of a cross compiler always uses <code>nm</code> for the target machine.
</p></dd></dl>
 
<dl>
<dt><a name="index-REAL_005fNM_005fFILE_005fNAME"></a>Macro: <strong>REAL_NM_FILE_NAME</strong></dt>
<dd><p>Define this macro as a C string constant containing the file name to use
to execute <code>nm</code>.  The default is to search the path normally for
<code>nm</code>.
</p></dd></dl>
 
<dl>
<dt><a name="index-NM_005fFLAGS"></a>Macro: <strong>NM_FLAGS</strong></dt>
<dd><p><code>collect2</code> calls <code>nm</code> to scan object files for static
constructors and destructors and LTO info.  By default, <samp>-n</samp> is
passed.  Define <code>NM_FLAGS</code> to a C string constant if other options
are needed to get the same output format as GNU <code>nm -n</code>
produces.
</p></dd></dl>
 
<p>If your system supports shared libraries and has a program to list the
dynamic dependencies of a given library or executable, you can define
these macros to enable support for running initialization and
termination functions in shared libraries:
</p>
<dl>
<dt><a name="index-LDD_005fSUFFIX"></a>Macro: <strong>LDD_SUFFIX</strong></dt>
<dd><p>Define this macro to a C string constant containing the name of the program
which lists dynamic dependencies, like <code>ldd</code> under SunOS 4.
</p></dd></dl>
 
<dl>
<dt><a name="index-PARSE_005fLDD_005fOUTPUT"></a>Macro: <strong>PARSE_LDD_OUTPUT</strong> <em>(<var>ptr</var>)</em></dt>
<dd><p>Define this macro to be C code that extracts filenames from the output
of the program denoted by <code>LDD_SUFFIX</code>.  <var>ptr</var> is a variable
of type <code>char *</code> that points to the beginning of a line of output
from <code>LDD_SUFFIX</code>.  If the line lists a dynamic dependency, the
code must advance <var>ptr</var> to the beginning of the filename on that
line.  Otherwise, it must set <var>ptr</var> to <code>NULL</code>.
</p></dd></dl>
 
<dl>
<dt><a name="index-SHLIB_005fSUFFIX"></a>Macro: <strong>SHLIB_SUFFIX</strong></dt>
<dd><p>Define this macro to a C string constant containing the default shared
library extension of the target (e.g., &lsquo;<samp>&quot;.so&quot;</samp>&rsquo;).  <code>collect2</code>
strips version information after this suffix when generating global
constructor and destructor names.  This define is only needed on targets
that use <code>collect2</code> to process constructors and destructors.
</p></dd></dl>
 
<hr>
<div class="header">
<p>
Next: <a href="Instruction-Output.html#Instruction-Output" accesskey="n" rel="next">Instruction Output</a>, Previous: <a href="Initialization.html#Initialization" accesskey="p" rel="prev">Initialization</a>, Up: <a href="Assembler-Format.html#Assembler-Format" accesskey="u" rel="up">Assembler Format</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>