]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgcc/crtstuff.c
Add PR sanitizer/78267 patch to libsanitizer/LOCAL_PATCHES
[thirdparty/gcc.git] / libgcc / crtstuff.c
CommitLineData
dc17e9e9
RS
1/* Specialized bits of code needed to support construction and
2 destruction of file-scope objects in C++ code.
818ab71a 3 Copyright (C) 1991-2016 Free Software Foundation, Inc.
d0f8fcea 4 Contributed by Ron Guilmette (rfg@monkeys.com).
dc17e9e9 5
1322177d 6This file is part of GCC.
dc17e9e9 7
1322177d
LB
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
748086b7 10Software Foundation; either version 3, or (at your option) any later
1322177d 11version.
dc17e9e9 12
1322177d
LB
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
dc17e9e9 17
748086b7
JJ
18Under Section 7 of GPL version 3, you are granted additional
19permissions described in the GCC Runtime Library Exception, version
203.1, as published by the Free Software Foundation.
21
22You should have received a copy of the GNU General Public License and
23a copy of the GCC Runtime Library Exception along with this program;
24see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25<http://www.gnu.org/licenses/>. */
dc17e9e9 26
7857f134 27/* This file is a bit like libgcc2.c in that it is compiled
dc17e9e9
RS
28 multiple times and yields multiple .o files.
29
30 This file is useful on target machines where the object file format
31 supports multiple "user-defined" sections (e.g. COFF, ELF, ROSE). On
32 such systems, this file allows us to avoid running collect (or any
33 other such slow and painful kludge). Additionally, if the target
34 system supports a .init section, this file allows us to support the
35 linking of C++ code with a non-C++ main program.
36
37 Note that if INIT_SECTION_ASM_OP is defined in the tm.h file, then
38 this file *will* make use of the .init section. If that symbol is
39 not defined however, then the .init section will not be used.
40
37ce5b86
CH
41 Currently, only ELF and COFF are supported. It is likely however that
42 ROSE could also be supported, if someone was willing to do the work to
43 make whatever (small?) adaptations are needed. (Some work may be
44 needed on the ROSE assembler and linker also.)
dc17e9e9
RS
45
46 This file must be compiled with gcc. */
47
56d6849d
NS
48/* Target machine header files require this define. */
49#define IN_LIBGCC2
50
9d48ad93
NS
51/* FIXME: Including auto-host is incorrect, but until we have
52 identified the set of defines that need to go into auto-target.h,
53 this will have to do. */
54#include "auto-host.h"
c6f9ea3b 55#undef caddr_t
3bea02d1
JM
56#undef pid_t
57#undef rlim_t
58#undef ssize_t
3bea02d1 59#undef vfork
eaf4e618 60#include "tconfig.h"
2e39bdbe 61#include "tsystem.h"
4977bab6
ZW
62#include "coretypes.h"
63#include "tm.h"
852b75ed 64#include "libgcc_tm.h"
52a11cbf 65#include "unwind-dw2-fde.h"
dc17e9e9 66
cea3bd3e
RH
67#ifndef FORCE_CODE_SECTION_ALIGN
68# define FORCE_CODE_SECTION_ALIGN
69#endif
70
036cfb36 71#ifndef CRT_CALL_STATIC_FUNCTION
cea3bd3e
RH
72# define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
73static void __attribute__((__used__)) \
74call_ ## FUNC (void) \
75{ \
76 asm (SECTION_OP); \
77 FUNC (); \
78 FORCE_CODE_SECTION_ALIGN \
53d68b9f 79 asm (__LIBGCC_TEXT_SECTION_ASM_OP__); \
cea3bd3e 80}
036cfb36
AO
81#endif
82
dbed5a9b
JM
83#if defined(TARGET_DL_ITERATE_PHDR) && \
84 (defined(__DragonFly__) || defined(__FreeBSD__))
85#define BSD_DL_ITERATE_PHDR_AVAILABLE
86#endif
87
2208d2ac
LR
88#if defined(OBJECT_FORMAT_ELF) \
89 && !defined(OBJECT_FORMAT_FLAT) \
90 && defined(HAVE_LD_EH_FRAME_HDR) \
91 && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
dbed5a9b 92 && defined(BSD_DL_ITERATE_PHDR_AVAILABLE)
2208d2ac
LR
93#include <link.h>
94# define USE_PT_GNU_EH_FRAME
95#endif
96
6961669f
RO
97#if defined(OBJECT_FORMAT_ELF) \
98 && !defined(OBJECT_FORMAT_FLAT) \
99 && defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR) \
100 && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
101 && defined(__sun__) && defined(__svr4__)
102#include <link.h>
103# define USE_PT_GNU_EH_FRAME
104#endif
105
abe92a04
RS
106#if defined(OBJECT_FORMAT_ELF) \
107 && !defined(OBJECT_FORMAT_FLAT) \
108 && defined(HAVE_LD_EH_FRAME_HDR) \
72c7c913 109 && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
275b60d6
JJ
110 && defined(__GLIBC__) && __GLIBC__ >= 2
111#include <link.h>
212db394
JZ
112/* uClibc pretends to be glibc 2.2 and DT_CONFIG is defined in its link.h.
113 But it doesn't use PT_GNU_EH_FRAME ELF segment currently. */
114# if !defined(__UCLIBC__) \
115 && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
275b60d6
JJ
116 || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
117# define USE_PT_GNU_EH_FRAME
118# endif
119#endif
d2468141
JM
120
121#if defined(OBJECT_FORMAT_ELF) \
122 && !defined(OBJECT_FORMAT_FLAT) \
123 && defined(HAVE_LD_EH_FRAME_HDR) \
124 && !defined(CRTSTUFFT_O) \
125 && defined(inhibit_libc) \
126 && (defined(__GLIBC__) || defined(__gnu_linux__) || defined(__GNU__))
127/* On systems using glibc, an inhibit_libc build of libgcc is only
128 part of a bootstrap process. Build the same crt*.o as would be
129 built with headers present, so that it is not necessary to build
130 glibc more than once for the bootstrap to converge. */
131# define USE_PT_GNU_EH_FRAME
132#endif
133
598a1586
HPN
134#ifdef USE_EH_FRAME_REGISTRY_ALWAYS
135# ifndef __LIBGCC_EH_FRAME_SECTION_NAME__
136# error "Can't use explicit exception-frame-registration without __LIBGCC_EH_FRAME_SECTION_NAME__"
137# endif
138#endif
139#if defined(__LIBGCC_EH_FRAME_SECTION_NAME__) && (!defined(USE_PT_GNU_EH_FRAME) || defined(USE_EH_FRAME_REGISTRY_ALWAYS))
275b60d6
JJ
140# define USE_EH_FRAME_REGISTRY
141#endif
53d68b9f
JM
142#if defined(__LIBGCC_EH_FRAME_SECTION_NAME__) \
143 && __LIBGCC_EH_TABLES_CAN_BE_READ_ONLY__
96d0f4dc
JJ
144# define EH_FRAME_SECTION_CONST const
145#else
146# define EH_FRAME_SECTION_CONST
147#endif
275b60d6 148
3fc95619
UD
149#if !defined(DTOR_LIST_END) && defined(OBJECT_FORMAT_ELF) \
150 && defined(HAVE_GAS_HIDDEN) && !defined(FINI_ARRAY_SECTION_ASM_OP)
151# define HIDDEN_DTOR_LIST_END
152#endif
153
b0dc7e4c
RH
154#if !defined(USE_TM_CLONE_REGISTRY) && defined(OBJECT_FORMAT_ELF)
155# define USE_TM_CLONE_REGISTRY 1
156#endif
157
8f08ea1e 158/* We do not want to add the weak attribute to the declarations of these
52a11cbf
RH
159 routines in unwind-dw2-fde.h because that will cause the definition of
160 these symbols to be weak as well.
8f08ea1e
L
161
162 This exposes a core issue, how to handle creating weak references vs
163 how to create weak definitions. Either we have to have the definition
164 of TARGET_WEAK_ATTRIBUTE be conditional in the shared header files or
165 have a second declaration if we want a function's references to be weak,
166 but not its definition.
167
168 Making TARGET_WEAK_ATTRIBUTE conditional seems like a good solution until
454ff5cb 169 one thinks about scaling to larger problems -- i.e., the condition under
8f08ea1e
L
170 which TARGET_WEAK_ATTRIBUTE is active will eventually get far too
171 complicated.
172
173 So, we take an approach similar to #pragma weak -- we have a second
174 declaration for functions that we want to have weak references.
175
176 Neither way is particularly good. */
b8698a0f 177
8f08ea1e
L
178/* References to __register_frame_info and __deregister_frame_info should
179 be weak in this file if at all possible. */
a30794da 180extern void __register_frame_info (const void *, struct object *)
8f08ea1e 181 TARGET_ATTRIBUTE_WEAK;
a30794da 182extern void __register_frame_info_bases (const void *, struct object *,
1066e2b5
RH
183 void *, void *)
184 TARGET_ATTRIBUTE_WEAK;
a30794da 185extern void *__deregister_frame_info (const void *)
8f08ea1e 186 TARGET_ATTRIBUTE_WEAK;
a30794da 187extern void *__deregister_frame_info_bases (const void *)
101fa48c 188 TARGET_ATTRIBUTE_WEAK;
525996eb 189extern void __do_global_ctors_1 (void);
8f08ea1e 190
213f974a
RH
191/* Likewise for _Jv_RegisterClasses. */
192extern void _Jv_RegisterClasses (void *) TARGET_ATTRIBUTE_WEAK;
193
b0dc7e4c
RH
194/* Likewise for transactional memory clone tables. */
195extern void _ITM_registerTMCloneTable (void *, size_t) TARGET_ATTRIBUTE_WEAK;
196extern void _ITM_deregisterTMCloneTable (void *) TARGET_ATTRIBUTE_WEAK;
197
68d69835
JM
198#ifdef OBJECT_FORMAT_ELF
199
200/* Declare a pointer to void function type. */
201typedef void (*func_ptr) (void);
202#define STATIC static
203
204#else /* OBJECT_FORMAT_ELF */
205
dc17e9e9
RS
206#include "gbl-ctors.h"
207
68d69835
JM
208#define STATIC
209
210#endif /* OBJECT_FORMAT_ELF */
dc17e9e9
RS
211
212#ifdef CRT_BEGIN
213
213f974a
RH
214/* NOTE: In order to be able to support SVR4 shared libraries, we arrange
215 to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
216 __DTOR_END__ } per root executable and also one set of these symbols
217 per shared library. So in any given whole process image, we may have
218 multiple definitions of each of these symbols. In order to prevent
219 these definitions from conflicting with one another, and in order to
220 ensure that the proper lists are used for the initialization/finalization
221 of each individual shared library (respectively), we give these symbols
222 only internal (i.e. `static') linkage, and we also make it a point to
223 refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
224 symbol in crtbegin.o, where they are defined. */
225
9ce7ad7f
L
226/* No need for .ctors/.dtors section if linker can place them in
227 .init_array/.fini_array section. */
228#ifndef USE_INITFINI_ARRAY
213f974a
RH
229/* The -1 is a flag to __do_global_[cd]tors indicating that this table
230 does not start with a count of elements. */
231#ifdef CTOR_LIST_BEGIN
232CTOR_LIST_BEGIN;
53d68b9f 233#elif defined(__LIBGCC_CTORS_SECTION_ASM_OP__)
213f974a
RH
234/* Hack: force cc1 to switch to .data section early, so that assembling
235 __CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
e4fa83d3 236static func_ptr force_to_data[1] __attribute__ ((__used__)) = { };
53d68b9f 237asm (__LIBGCC_CTORS_SECTION_ASM_OP__);
213f974a 238STATIC func_ptr __CTOR_LIST__[1]
e4fa83d3 239 __attribute__ ((__used__, aligned(sizeof(func_ptr))))
213f974a
RH
240 = { (func_ptr) (-1) };
241#else
242STATIC func_ptr __CTOR_LIST__[1]
e4fa83d3 243 __attribute__ ((__used__, section(".ctors"), aligned(sizeof(func_ptr))))
213f974a
RH
244 = { (func_ptr) (-1) };
245#endif /* __CTOR_LIST__ alternatives */
246
247#ifdef DTOR_LIST_BEGIN
248DTOR_LIST_BEGIN;
53d68b9f
JM
249#elif defined(__LIBGCC_DTORS_SECTION_ASM_OP__)
250asm (__LIBGCC_DTORS_SECTION_ASM_OP__);
213f974a
RH
251STATIC func_ptr __DTOR_LIST__[1]
252 __attribute__ ((aligned(sizeof(func_ptr))))
253 = { (func_ptr) (-1) };
254#else
255STATIC func_ptr __DTOR_LIST__[1]
256 __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
257 = { (func_ptr) (-1) };
258#endif /* __DTOR_LIST__ alternatives */
9ce7ad7f 259#endif /* USE_INITFINI_ARRAY */
213f974a 260
618939de 261#ifdef USE_EH_FRAME_REGISTRY
213f974a
RH
262/* Stick a label at the beginning of the frame unwind info so we can register
263 and deregister it with the exception handling library code. */
96d0f4dc 264STATIC EH_FRAME_SECTION_CONST char __EH_FRAME_BEGIN__[]
53d68b9f 265 __attribute__((section(__LIBGCC_EH_FRAME_SECTION_NAME__), aligned(4)))
213f974a 266 = { };
618939de 267#endif /* USE_EH_FRAME_REGISTRY */
213f974a 268
b0dc7e4c
RH
269#if USE_TM_CLONE_REGISTRY
270STATIC func_ptr __TMC_LIST__[]
7546aa9d 271 __attribute__((used, section(".tm_clone_table"), aligned(sizeof(void*))))
b0dc7e4c 272 = { };
7546aa9d 273# ifdef HAVE_GAS_HIDDEN
b0dc7e4c 274extern func_ptr __TMC_END__[] __attribute__((__visibility__ ("hidden")));
7546aa9d
RH
275# endif
276
277static inline void
278deregister_tm_clones (void)
279{
280 void (*fn) (void *);
281
282#ifdef HAVE_GAS_HIDDEN
283 if (__TMC_END__ - __TMC_LIST__ == 0)
284 return;
285#else
286 if (__TMC_LIST__[0] == NULL)
287 return;
288#endif
289
290 fn = _ITM_deregisterTMCloneTable;
291 __asm ("" : "+r" (fn));
292 if (fn)
293 fn (__TMC_LIST__);
294}
295
296static inline void
297register_tm_clones (void)
298{
299 void (*fn) (void *, size_t);
300 size_t size;
301
302#ifdef HAVE_GAS_HIDDEN
303 size = (__TMC_END__ - __TMC_LIST__) / 2;
304#else
305 for (size = 0; __TMC_LIST__[size * 2] != NULL; size++)
306 continue;
307#endif
308 if (size == 0)
309 return;
310
311 fn = _ITM_registerTMCloneTable;
312 __asm ("" : "+r" (fn));
313 if (fn)
314 fn (__TMC_LIST__, size);
315}
b0dc7e4c
RH
316#endif /* USE_TM_CLONE_REGISTRY */
317
53d68b9f
JM
318#if defined(__LIBGCC_INIT_SECTION_ASM_OP__) \
319 || defined(__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__)
29d2c7a5 320
68d69835
JM
321#ifdef OBJECT_FORMAT_ELF
322
fc693822 323/* Declare the __dso_handle variable. It should have a unique value
6a9c5260
UD
324 in every shared-object; in a main program its value is zero. The
325 object should in any case be protected. This means the instance
326 in one DSO or the main program is not used in another object. The
327 dynamic linker takes care of this. */
328
a0cfeb0f
DD
329#ifdef TARGET_LIBGCC_SDATA_SECTION
330extern void *__dso_handle __attribute__ ((__section__ (TARGET_LIBGCC_SDATA_SECTION)));
331#endif
6a9c5260 332#ifdef HAVE_GAS_HIDDEN
47bd70b5 333extern void *__dso_handle __attribute__ ((__visibility__ ("hidden")));
6a9c5260 334#endif
fc693822
MM
335#ifdef CRTSTUFFS_O
336void *__dso_handle = &__dso_handle;
337#else
338void *__dso_handle = 0;
339#endif
340
341/* The __cxa_finalize function may not be available so we use only a
342 weak declaration. */
343extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
344
68d69835 345/* Run all the global destructors on exit from the program. */
b8698a0f 346
68d69835
JM
347/* Some systems place the number of pointers in the first word of the
348 table. On SVR4 however, that word is -1. In all cases, the table is
349 null-terminated. On SVR4, we start from the beginning of the list and
350 invoke each per-compilation-unit destructor routine in order
351 until we find that null.
352
353 Note that this function MUST be static. There will be one of these
354 functions in each root executable and one in each shared library, but
355 although they all have the same code, each one is unique in that it
356 refers to one particular associated `__DTOR_LIST__' which belongs to the
b40b9d93
MS
357 same particular root executable or shared library file.
358
359 On some systems, this routine is run more than once from the .fini,
360 when exit is called recursively, so we arrange to remember where in
361 the list we left off processing, and we resume at that point,
362 should we be re-invoked. */
68d69835 363
cea3bd3e 364static void __attribute__((used))
3cc22c31 365__do_global_dtors_aux (void)
68d69835 366{
7abc66b1 367 static _Bool completed;
5041a61c 368
1066e2b5 369 if (__builtin_expect (completed, 0))
5041a61c
JL
370 return;
371
2a14e214
MM
372#ifdef CRTSTUFFS_O
373 if (__cxa_finalize)
fc693822 374 __cxa_finalize (__dso_handle);
2a14e214 375#endif
fc693822 376
7abc66b1
JB
377#ifdef FINI_ARRAY_SECTION_ASM_OP
378 /* If we are using .fini_array then destructors will be run via that
379 mechanism. */
3fc95619
UD
380#elif defined(HIDDEN_DTOR_LIST_END)
381 {
382 /* Safer version that makes sure only .dtors function pointers are
383 called even if the static variable is maliciously changed. */
384 extern func_ptr __DTOR_END__[] __attribute__((visibility ("hidden")));
385 static size_t dtor_idx;
386 const size_t max_idx = __DTOR_END__ - __DTOR_LIST__ - 1;
2405e0ea 387 func_ptr *dtor_list;
3fc95619 388
2405e0ea 389 __asm ("" : "=g" (dtor_list) : "0" (__DTOR_LIST__));
3fc95619 390 while (dtor_idx < max_idx)
2405e0ea 391 dtor_list[++dtor_idx] ();
3fc95619 392 }
7abc66b1 393#else /* !defined (FINI_ARRAY_SECTION_ASM_OP) */
3fc95619
UD
394 {
395 static func_ptr *p = __DTOR_LIST__ + 1;
396 func_ptr f;
397
398 while ((f = *p))
399 {
400 p++;
401 f ();
402 }
403 }
7abc66b1 404#endif /* !defined(FINI_ARRAY_SECTION_ASM_OP) */
0021b564 405
b0dc7e4c 406#if USE_TM_CLONE_REGISTRY
7546aa9d 407 deregister_tm_clones ();
b0dc7e4c
RH
408#endif /* USE_TM_CLONE_REGISTRY */
409
275b60d6 410#ifdef USE_EH_FRAME_REGISTRY
f691dc3b 411#ifdef CRT_GET_RFIB_DATA
101fa48c
RH
412 /* If we used the new __register_frame_info_bases interface,
413 make sure that we deregister from the same place. */
414 if (__deregister_frame_info_bases)
415 __deregister_frame_info_bases (__EH_FRAME_BEGIN__);
416#else
8f08ea1e
L
417 if (__deregister_frame_info)
418 __deregister_frame_info (__EH_FRAME_BEGIN__);
0021b564 419#endif
101fa48c
RH
420#endif
421
5041a61c 422 completed = 1;
68d69835
JM
423}
424
425/* Stick a call to __do_global_dtors_aux into the .fini section. */
7abc66b1 426#ifdef FINI_SECTION_ASM_OP
cea3bd3e 427CRT_CALL_STATIC_FUNCTION (FINI_SECTION_ASM_OP, __do_global_dtors_aux)
6d83cb32 428#elif defined (FINI_ARRAY_SECTION_ASM_OP)
7abc66b1 429static func_ptr __do_global_dtors_aux_fini_array_entry[]
806fc6aa 430 __attribute__ ((__used__, section(".fini_array"), aligned(sizeof(func_ptr))))
7abc66b1 431 = { __do_global_dtors_aux };
6d83cb32
DR
432#else /* !FINI_SECTION_ASM_OP && !FINI_ARRAY_SECTION_ASM_OP */
433static void __attribute__((used))
434__do_global_dtors_aux_1 (void)
435{
436 atexit (__do_global_dtors_aux);
437}
53d68b9f
JM
438CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__,
439 __do_global_dtors_aux_1)
6d83cb32 440#endif
68d69835 441
b0dc7e4c 442#if defined(USE_EH_FRAME_REGISTRY) \
b0dc7e4c 443 || defined(USE_TM_CLONE_REGISTRY)
6d8ccdbb
JL
444/* Stick a call to __register_frame_info into the .init section. For some
445 reason calls with no arguments work more reliably in .init, so stick the
446 call in another function. */
0021b564 447
cea3bd3e 448static void __attribute__((used))
3cc22c31 449frame_dummy (void)
0021b564 450{
275b60d6 451#ifdef USE_EH_FRAME_REGISTRY
956d6950 452 static struct object object;
f691dc3b 453#ifdef CRT_GET_RFIB_DATA
1066e2b5 454 void *tbase, *dbase;
1066e2b5 455 tbase = 0;
1066e2b5 456 CRT_GET_RFIB_DATA (dbase);
1066e2b5
RH
457 if (__register_frame_info_bases)
458 __register_frame_info_bases (__EH_FRAME_BEGIN__, &object, tbase, dbase);
459#else
8f08ea1e
L
460 if (__register_frame_info)
461 __register_frame_info (__EH_FRAME_BEGIN__, &object);
f691dc3b 462#endif /* CRT_GET_RFIB_DATA */
4505024e 463#endif /* USE_EH_FRAME_REGISTRY */
b0dc7e4c 464
b0dc7e4c 465#if USE_TM_CLONE_REGISTRY
7546aa9d 466 register_tm_clones ();
b0dc7e4c 467#endif /* USE_TM_CLONE_REGISTRY */
0021b564
JM
468}
469
53d68b9f
JM
470#ifdef __LIBGCC_INIT_SECTION_ASM_OP__
471CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__, frame_dummy)
472#else /* defined(__LIBGCC_INIT_SECTION_ASM_OP__) */
7abc66b1 473static func_ptr __frame_dummy_init_array_entry[]
806fc6aa 474 __attribute__ ((__used__, section(".init_array"), aligned(sizeof(func_ptr))))
7abc66b1 475 = { frame_dummy };
53d68b9f 476#endif /* !defined(__LIBGCC_INIT_SECTION_ASM_OP__) */
5a79befb 477#endif /* USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY */
0021b564 478
68d69835
JM
479#else /* OBJECT_FORMAT_ELF */
480
b335c2cc 481/* The function __do_global_ctors_aux is compiled twice (once in crtbegin.o
b71a4aa9 482 and once in crtend.o). It must be declared static to avoid a link
b335c2cc
TW
483 error. Here, we define __do_global_ctors as an externally callable
484 function. It is externally callable so that __main can invoke it when
485 INVOKE__main is defined. This has the additional effect of forcing cc1
486 to switch to the .text section. */
0f41302f 487
d1e51320 488static void __do_global_ctors_aux (void);
3cc22c31
JL
489void
490__do_global_ctors (void)
329d2160 491{
29d2c7a5
RH
492#ifdef INVOKE__main
493 /* If __main won't actually call __do_global_ctors then it doesn't matter
494 what's inside the function. The inside of __do_global_ctors_aux is
495 called automatically in that case. And the Alliant fx2800 linker
496 crashes on this reference. So prevent the crash. */
329d2160
RS
497 __do_global_ctors_aux ();
498#endif
499}
dc17e9e9 500
53d68b9f 501asm (__LIBGCC_INIT_SECTION_ASM_OP__); /* cc1 doesn't know that we are switching! */
dc17e9e9
RS
502
503/* A routine to invoke all of the global constructors upon entry to the
504 program. We put this into the .init section (for systems that have
505 such a thing) so that we can properly perform the construction of
6d2f8887 506 file-scope static-storage C++ objects within shared libraries. */
dc17e9e9 507
cea3bd3e 508static void __attribute__((used))
3cc22c31 509__do_global_ctors_aux (void) /* prologue goes in .init section */
dc17e9e9 510{
cea3bd3e 511 FORCE_CODE_SECTION_ALIGN /* explicit align before switch to .text */
53d68b9f 512 asm (__LIBGCC_TEXT_SECTION_ASM_OP__); /* don't put epilogue and body in .init */
dc17e9e9 513 DO_GLOBAL_CTORS_BODY;
451fbdf2 514 atexit (__do_global_dtors);
dc17e9e9
RS
515}
516
68d69835 517#endif /* OBJECT_FORMAT_ELF */
fe1fd353 518
53d68b9f 519#elif defined(HAS_INIT_SECTION) /* ! __LIBGCC_INIT_SECTION_ASM_OP__ */
fe1fd353 520
af8e5a0e
RO
521extern void __do_global_dtors (void);
522
fe1fd353
JM
523/* This case is used by the Irix 6 port, which supports named sections but
524 not an SVR4-style .fini section. __do_global_dtors can be non-static
0021b564
JM
525 in this case because we protect it with -hidden_symbol. */
526
fe1fd353 527void
3cc22c31 528__do_global_dtors (void)
fe1fd353 529{
1066e2b5
RH
530 func_ptr *p, f;
531 for (p = __DTOR_LIST__ + 1; (f = *p); p++)
532 f ();
0021b564 533
b0dc7e4c 534#if USE_TM_CLONE_REGISTRY
7546aa9d 535 deregister_tm_clones ();
b0dc7e4c
RH
536#endif /* USE_TM_CLONE_REGISTRY */
537
275b60d6 538#ifdef USE_EH_FRAME_REGISTRY
8f08ea1e
L
539 if (__deregister_frame_info)
540 __deregister_frame_info (__EH_FRAME_BEGIN__);
0021b564 541#endif
fe1fd353 542}
35a42f5f 543
b0dc7e4c 544#if defined(USE_EH_FRAME_REGISTRY) \
b0dc7e4c 545 || defined(USE_TM_CLONE_REGISTRY)
29d2c7a5
RH
546/* A helper function for __do_global_ctors, which is in crtend.o. Here
547 in crtbegin.o, we can reference a couple of symbols not visible there.
548 Plus, since we're before libgcc.a, we have no problems referencing
549 functions from there. */
35a42f5f 550void
29d2c7a5 551__do_global_ctors_1(void)
35a42f5f 552{
275b60d6 553#ifdef USE_EH_FRAME_REGISTRY
35a42f5f 554 static struct object object;
8f08ea1e
L
555 if (__register_frame_info)
556 __register_frame_info (__EH_FRAME_BEGIN__, &object);
b335c2cc 557#endif
b0dc7e4c 558
b0dc7e4c 559#if USE_TM_CLONE_REGISTRY
7546aa9d 560 register_tm_clones ();
b0dc7e4c 561#endif /* USE_TM_CLONE_REGISTRY */
213f974a 562}
5a79befb 563#endif /* USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY */
6351543d 564
53d68b9f 565#else /* ! __LIBGCC_INIT_SECTION_ASM_OP__ && ! HAS_INIT_SECTION */
29d2c7a5
RH
566#error "What are you doing with crtstuff.c, then?"
567#endif
568
569#elif defined(CRT_END) /* ! CRT_BEGIN */
570
9ce7ad7f
L
571/* No need for .ctors/.dtors section if linker can place them in
572 .init_array/.fini_array section. */
573#ifndef USE_INITFINI_ARRAY
29d2c7a5
RH
574/* Put a word containing zero at the end of each of our two lists of function
575 addresses. Note that the words defined here go into the .ctors and .dtors
576 sections of the crtend.o file, and since that file is always linked in
577 last, these words naturally end up at the very ends of the two lists
578 contained in these two sections. */
579
580#ifdef CTOR_LIST_END
581CTOR_LIST_END;
53d68b9f 582#elif defined(__LIBGCC_CTORS_SECTION_ASM_OP__)
29d2c7a5
RH
583/* Hack: force cc1 to switch to .data section early, so that assembling
584 __CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
e4fa83d3 585static func_ptr force_to_data[1] __attribute__ ((__used__)) = { };
53d68b9f 586asm (__LIBGCC_CTORS_SECTION_ASM_OP__);
29d2c7a5
RH
587STATIC func_ptr __CTOR_END__[1]
588 __attribute__((aligned(sizeof(func_ptr))))
589 = { (func_ptr) 0 };
590#else
591STATIC func_ptr __CTOR_END__[1]
592 __attribute__((section(".ctors"), aligned(sizeof(func_ptr))))
593 = { (func_ptr) 0 };
594#endif
595
596#ifdef DTOR_LIST_END
597DTOR_LIST_END;
3fc95619 598#elif defined(HIDDEN_DTOR_LIST_END)
53d68b9f
JM
599#ifdef __LIBGCC_DTORS_SECTION_ASM_OP__
600asm (__LIBGCC_DTORS_SECTION_ASM_OP__);
3fc95619
UD
601#endif
602func_ptr __DTOR_END__[1]
b8053194 603 __attribute__ ((used,
53d68b9f 604#ifndef __LIBGCC_DTORS_SECTION_ASM_OP__
3fc95619
UD
605 section(".dtors"),
606#endif
607 aligned(sizeof(func_ptr)), visibility ("hidden")))
608 = { (func_ptr) 0 };
53d68b9f
JM
609#elif defined(__LIBGCC_DTORS_SECTION_ASM_OP__)
610asm (__LIBGCC_DTORS_SECTION_ASM_OP__);
29d2c7a5 611STATIC func_ptr __DTOR_END__[1]
b8053194 612 __attribute__ ((used, aligned(sizeof(func_ptr))))
29d2c7a5
RH
613 = { (func_ptr) 0 };
614#else
615STATIC func_ptr __DTOR_END__[1]
b8053194 616 __attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
29d2c7a5
RH
617 = { (func_ptr) 0 };
618#endif
9ce7ad7f 619#endif /* USE_INITFINI_ARRAY */
dc17e9e9 620
53d68b9f 621#ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
29d2c7a5
RH
622/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
623 this would be the 'length' field in a real FDE. */
61f03aba
RH
624# if __INT_MAX__ == 2147483647
625typedef int int32;
626# elif __LONG_MAX__ == 2147483647
627typedef long int32;
628# elif __SHRT_MAX__ == 2147483647
629typedef short int32;
630# else
631# error "Missing a 4 byte integer"
632# endif
633STATIC EH_FRAME_SECTION_CONST int32 __FRAME_END__[]
53d68b9f 634 __attribute__ ((used, section(__LIBGCC_EH_FRAME_SECTION_NAME__),
61f03aba 635 aligned(sizeof(int32))))
29d2c7a5 636 = { 0 };
53d68b9f 637#endif /* __LIBGCC_EH_FRAME_SECTION_NAME__ */
29d2c7a5 638
b0dc7e4c 639#if USE_TM_CLONE_REGISTRY
7546aa9d
RH
640# ifndef HAVE_GAS_HIDDEN
641static
642# endif
b0dc7e4c 643func_ptr __TMC_END__[]
7546aa9d
RH
644 __attribute__((used, section(".tm_clone_table"), aligned(sizeof(void *))))
645# ifdef HAVE_GAS_HIDDEN
646 __attribute__((__visibility__ ("hidden"))) = { };
647# else
648 = { 0, 0 };
649# endif
b0dc7e4c
RH
650#endif /* USE_TM_CLONE_REGISTRY */
651
53d68b9f 652#ifdef __LIBGCC_INIT_ARRAY_SECTION_ASM_OP__
7abc66b1
JB
653
654/* If we are using .init_array, there is nothing to do. */
655
53d68b9f 656#elif defined(__LIBGCC_INIT_SECTION_ASM_OP__)
dc17e9e9 657
68d69835 658#ifdef OBJECT_FORMAT_ELF
cea3bd3e 659static void __attribute__((used))
3cc22c31 660__do_global_ctors_aux (void)
68d69835
JM
661{
662 func_ptr *p;
663 for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
664 (*p) ();
665}
666
667/* Stick a call to __do_global_ctors_aux into the .init section. */
53d68b9f 668CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__, __do_global_ctors_aux)
68d69835
JM
669#else /* OBJECT_FORMAT_ELF */
670
671/* Stick the real initialization code, followed by a normal sort of
672 function epilogue at the very end of the .init section for this
673 entire root executable file or for this entire shared library file.
674
675 Note that we use some tricks here to get *just* the body and just
676 a function epilogue (but no function prologue) into the .init
9faa82d8 677 section of the crtend.o file. Specifically, we switch to the .text
68d69835
JM
678 section, start to define a function, and then we switch to the .init
679 section just before the body code.
680
681 Earlier on, we put the corresponding function prologue into the .init
682 section of the crtbegin.o file (which will be linked in first).
683
684 Note that we want to invoke all constructors for C++ file-scope static-
685 storage objects AFTER any other possible initialization actions which
686 may be performed by the code in the .init section contributions made by
687 other libraries, etc. That's because those other initializations may
688 include setup operations for very primitive things (e.g. initializing
689 the state of the floating-point coprocessor, etc.) which should be done
0f41302f 690 before we start to execute any of the user's code. */
dc17e9e9
RS
691
692static void
3cc22c31 693__do_global_ctors_aux (void) /* prologue goes in .text section */
dc17e9e9 694{
53d68b9f 695 asm (__LIBGCC_INIT_SECTION_ASM_OP__);
dc17e9e9 696 DO_GLOBAL_CTORS_BODY;
451fbdf2 697 atexit (__do_global_dtors);
e5e809f4
JL
698} /* epilogue and body go in .init section */
699
cea3bd3e 700FORCE_CODE_SECTION_ALIGN
53d68b9f 701asm (__LIBGCC_TEXT_SECTION_ASM_OP__);
dc17e9e9 702
68d69835
JM
703#endif /* OBJECT_FORMAT_ELF */
704
53d68b9f 705#elif defined(HAS_INIT_SECTION) /* ! __LIBGCC_INIT_SECTION_ASM_OP__ */
fe1fd353 706
af8e5a0e
RO
707extern void __do_global_ctors (void);
708
fe1fd353
JM
709/* This case is used by the Irix 6 port, which supports named sections but
710 not an SVR4-style .init section. __do_global_ctors can be non-static
0021b564 711 in this case because we protect it with -hidden_symbol. */
fe1fd353 712void
3cc22c31 713__do_global_ctors (void)
fe1fd353
JM
714{
715 func_ptr *p;
b0dc7e4c 716#if defined(USE_EH_FRAME_REGISTRY) \
b0dc7e4c 717 || defined(USE_TM_CLONE_REGISTRY)
29d2c7a5 718 __do_global_ctors_1();
0021b564 719#endif
fe1fd353
JM
720 for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
721 (*p) ();
722}
68d69835 723
53d68b9f 724#else /* ! __LIBGCC_INIT_SECTION_ASM_OP__ && ! HAS_INIT_SECTION */
29d2c7a5 725#error "What are you doing with crtstuff.c, then?"
b335c2cc 726#endif
dc17e9e9 727
29d2c7a5
RH
728#else /* ! CRT_BEGIN && ! CRT_END */
729#error "One of CRT_BEGIN or CRT_END must be defined."
b335c2cc 730#endif