OSDN Git Service

ce2c9561e64e287f961e8dc813f914f6ab475279
[pf3gnuchains/gcc-fork.git] / gcc / crtstuff.c
1 /* Specialized bits of code needed to support construction and
2    destruction of file-scope objects in C++ code.
3    Copyright (C) 1991, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
4    Contributed by Ron Guilmette (rfg@monkeys.com).
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING.  If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23 /* As a special exception, if you link this library with files
24    compiled with GCC to produce an executable, this does not cause
25    the resulting executable to be covered by the GNU General Public License.
26    This exception does not however invalidate any other reasons why
27    the executable file might be covered by the GNU General Public License.  */
28
29 /* This file is a bit like libgcc1.c/libgcc2.c in that it is compiled
30    multiple times and yields multiple .o files.
31
32    This file is useful on target machines where the object file format
33    supports multiple "user-defined" sections (e.g. COFF, ELF, ROSE).  On
34    such systems, this file allows us to avoid running collect (or any
35    other such slow and painful kludge).  Additionally, if the target
36    system supports a .init section, this file allows us to support the
37    linking of C++ code with a non-C++ main program.
38
39    Note that if INIT_SECTION_ASM_OP is defined in the tm.h file, then
40    this file *will* make use of the .init section.  If that symbol is
41    not defined however, then the .init section will not be used.
42
43    Currently, only ELF and COFF are supported.  It is likely however that
44    ROSE could also be supported, if someone was willing to do the work to
45    make whatever (small?) adaptations are needed.  (Some work may be
46    needed on the ROSE assembler and linker also.)
47
48    This file must be compiled with gcc.  */
49
50 /* It is incorrect to include config.h here, because this file is being
51    compiled for the target, and hence definitions concerning only the host
52    do not apply.  */
53
54 #include "tm.h"
55 #include "defaults.h"
56 #include <stddef.h>
57 #include "frame.h"
58
59 #ifndef OBJECT_FORMAT_MACHO
60
61 /* Provide default definitions for the pseudo-ops used to switch to the
62    .ctors and .dtors sections.
63  
64    Note that we want to give these sections the SHF_WRITE attribute
65    because these sections will actually contain data (i.e. tables of
66    addresses of functions in the current root executable or shared library
67    file) and, in the case of a shared library, the relocatable addresses
68    will have to be properly resolved/relocated (and then written into) by
69    the dynamic linker when it actually attaches the given shared library
70    to the executing process.  (Note that on SVR4, you may wish to use the
71    `-z text' option to the ELF linker, when building a shared library, as
72    an additional check that you are doing everything right.  But if you do
73    use the `-z text' option when building a shared library, you will get
74    errors unless the .ctors and .dtors sections are marked as writable
75    via the SHF_WRITE attribute.)  */
76
77 #ifndef CTORS_SECTION_ASM_OP
78 #define CTORS_SECTION_ASM_OP    ".section\t.ctors,\"aw\""
79 #endif
80 #ifndef DTORS_SECTION_ASM_OP
81 #define DTORS_SECTION_ASM_OP    ".section\t.dtors,\"aw\""
82 #endif
83 #if !defined (EH_FRAME_SECTION_ASM_OP) && defined (DWARF2_UNWIND_INFO) && defined(ASM_OUTPUT_SECTION_NAME)
84 #define EH_FRAME_SECTION_ASM_OP ".section\t.eh_frame,\"aw\""
85 #endif
86
87 #ifdef OBJECT_FORMAT_ELF
88
89 /*  Declare a pointer to void function type.  */
90 typedef void (*func_ptr) (void);
91 #define STATIC static
92
93 #else  /* OBJECT_FORMAT_ELF */
94
95 #include "gbl-ctors.h"
96
97 #ifndef ON_EXIT
98 #define ON_EXIT(a, b)
99 #endif
100 #define STATIC
101
102 #endif /* OBJECT_FORMAT_ELF */
103
104 #ifdef CRT_BEGIN
105
106 #ifdef INIT_SECTION_ASM_OP
107
108 #ifdef OBJECT_FORMAT_ELF
109
110 /* Run all the global destructors on exit from the program.  */
111  
112 /* Some systems place the number of pointers in the first word of the
113    table.  On SVR4 however, that word is -1.  In all cases, the table is
114    null-terminated.  On SVR4, we start from the beginning of the list and
115    invoke each per-compilation-unit destructor routine in order
116    until we find that null.
117
118    Note that this function MUST be static.  There will be one of these
119    functions in each root executable and one in each shared library, but
120    although they all have the same code, each one is unique in that it
121    refers to one particular associated `__DTOR_LIST__' which belongs to the
122    same particular root executable or shared library file.
123
124    On some systems, this routine is run more than once from the .fini,
125    when exit is called recursively, so we arrange to remember where in
126    the list we left off processing, and we resume at that point,
127    should we be re-invoked.  */
128
129 static char __EH_FRAME_BEGIN__[];
130 static func_ptr __DTOR_LIST__[];
131 static void
132 __do_global_dtors_aux ()
133 {
134   static func_ptr *p = __DTOR_LIST__ + 1;
135   static int completed = 0;
136
137   if (completed)
138     return;
139
140   while (*p)
141     {
142       p++;
143       (*(p-1)) ();
144     }
145
146 #ifdef EH_FRAME_SECTION_ASM_OP
147   __deregister_frame_info (__EH_FRAME_BEGIN__);
148 #endif
149   completed = 1;
150 }
151
152
153 /* Stick a call to __do_global_dtors_aux into the .fini section.  */
154
155 static void __attribute__ ((__unused__))
156 fini_dummy ()
157 {
158   asm (FINI_SECTION_ASM_OP);
159   __do_global_dtors_aux ();
160 #ifdef FORCE_FINI_SECTION_ALIGN
161   FORCE_FINI_SECTION_ALIGN;
162 #endif
163   asm (TEXT_SECTION_ASM_OP);
164 }
165
166 #ifdef EH_FRAME_SECTION_ASM_OP
167 /* Stick a call to __register_frame_info into the .init section.  For some
168    reason calls with no arguments work more reliably in .init, so stick the
169    call in another function.  */
170
171 static void
172 frame_dummy ()
173 {
174   static struct object object;
175   __register_frame_info (__EH_FRAME_BEGIN__, &object);
176 }
177
178 static void __attribute__ ((__unused__))
179 init_dummy ()
180 {
181   asm (INIT_SECTION_ASM_OP);
182   frame_dummy ();
183 #ifdef FORCE_INIT_SECTION_ALIGN
184   FORCE_INIT_SECTION_ALIGN;
185 #endif
186   asm (TEXT_SECTION_ASM_OP);
187 }
188 #endif /* EH_FRAME_SECTION_ASM_OP */
189
190 #else  /* OBJECT_FORMAT_ELF */
191
192 /* The function __do_global_ctors_aux is compiled twice (once in crtbegin.o
193    and once in crtend.o).  It must be declared static to avoid a link
194    error.  Here, we define __do_global_ctors as an externally callable
195    function.  It is externally callable so that __main can invoke it when
196    INVOKE__main is defined.  This has the additional effect of forcing cc1
197    to switch to the .text section.  */
198
199 static void __do_global_ctors_aux ();
200 void __do_global_ctors ()
201 {
202 #ifdef INVOKE__main  /* If __main won't actually call __do_global_ctors
203                         then it doesn't matter what's inside the function.
204                         The inside of __do_global_ctors_aux is called
205                         automatically in that case.
206                         And the Alliant fx2800 linker crashes
207                         on this reference.  So prevent the crash.  */
208   __do_global_ctors_aux ();
209 #endif
210 }
211
212 asm (INIT_SECTION_ASM_OP);      /* cc1 doesn't know that we are switching! */
213
214 /* On some svr4 systems, the initial .init section preamble code provided in
215    crti.o may do something, such as bump the stack, which we have to 
216    undo before we reach the function prologue code for __do_global_ctors 
217    (directly below).  For such systems, define the macro INIT_SECTION_PREAMBLE
218    to expand into the code needed to undo the actions of the crti.o file.  */
219
220 #ifdef INIT_SECTION_PREAMBLE
221   INIT_SECTION_PREAMBLE;
222 #endif
223
224 /* A routine to invoke all of the global constructors upon entry to the
225    program.  We put this into the .init section (for systems that have
226    such a thing) so that we can properly perform the construction of
227    file-scope static-storage C++ objects within shared libraries.   */
228
229 static void
230 __do_global_ctors_aux ()        /* prologue goes in .init section */
231 {
232 #ifdef FORCE_INIT_SECTION_ALIGN
233   FORCE_INIT_SECTION_ALIGN;     /* Explicit align before switch to .text */
234 #endif
235   asm (TEXT_SECTION_ASM_OP);    /* don't put epilogue and body in .init */
236   DO_GLOBAL_CTORS_BODY;
237   ON_EXIT (__do_global_dtors, 0);
238 }
239
240 #endif /* OBJECT_FORMAT_ELF */
241
242 #else /* defined(INIT_SECTION_ASM_OP) */
243
244 #ifdef HAS_INIT_SECTION
245 /* This case is used by the Irix 6 port, which supports named sections but
246    not an SVR4-style .fini section.  __do_global_dtors can be non-static
247    in this case because we protect it with -hidden_symbol.  */
248
249 static char __EH_FRAME_BEGIN__[];
250 static func_ptr __DTOR_LIST__[];
251 void
252 __do_global_dtors ()
253 {
254   func_ptr *p;
255   for (p = __DTOR_LIST__ + 1; *p; p++)
256     (*p) ();
257
258 #ifdef EH_FRAME_SECTION_ASM_OP
259   __deregister_frame_info (__EH_FRAME_BEGIN__);
260 #endif
261 }
262
263 #ifdef EH_FRAME_SECTION_ASM_OP
264 /* Define a function here to call __register_frame.  crtend.o is linked in
265    after libgcc.a, and hence can't call libgcc.a functions directly.  That
266    can lead to unresolved function references.  */
267 void
268 __frame_dummy ()
269 {
270   static struct object object;
271   __register_frame_info (__EH_FRAME_BEGIN__, &object);
272 }
273 #endif
274 #endif
275
276 #endif /* defined(INIT_SECTION_ASM_OP) */
277
278 /* Force cc1 to switch to .data section.  */
279 static func_ptr force_to_data[0] __attribute__ ((__unused__)) = { };
280
281 /* NOTE:  In order to be able to support SVR4 shared libraries, we arrange
282    to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
283    __DTOR_END__ } per root executable and also one set of these symbols
284    per shared library.  So in any given whole process image, we may have
285    multiple definitions of each of these symbols.  In order to prevent
286    these definitions from conflicting with one another, and in order to
287    ensure that the proper lists are used for the initialization/finalization
288    of each individual shared library (respectively), we give these symbols
289    only internal (i.e. `static') linkage, and we also make it a point to
290    refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
291    symbol in crtbegin.o, where they are defined.  */
292
293 /* The -1 is a flag to __do_global_[cd]tors
294    indicating that this table does not start with a count of elements.  */
295 #ifdef CTOR_LIST_BEGIN
296 CTOR_LIST_BEGIN;
297 #else
298 asm (CTORS_SECTION_ASM_OP);     /* cc1 doesn't know that we are switching! */
299 STATIC func_ptr __CTOR_LIST__[1] __attribute__ ((__unused__))
300   = { (func_ptr) (-1) };
301 #endif
302
303 #ifdef DTOR_LIST_BEGIN
304 DTOR_LIST_BEGIN;
305 #else
306 asm (DTORS_SECTION_ASM_OP);     /* cc1 doesn't know that we are switching! */
307 STATIC func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) };
308 #endif
309
310 #ifdef EH_FRAME_SECTION_ASM_OP
311 /* Stick a label at the beginning of the frame unwind info so we can register
312    and deregister it with the exception handling library code.  */
313
314 asm (EH_FRAME_SECTION_ASM_OP);
315 #ifdef INIT_SECTION_ASM_OP
316 STATIC
317 #endif
318 char __EH_FRAME_BEGIN__[] = { };
319 #endif /* EH_FRAME_SECTION_ASM_OP */
320
321 #endif /* defined(CRT_BEGIN) */
322
323 #ifdef CRT_END
324
325 #ifdef INIT_SECTION_ASM_OP
326
327 #ifdef OBJECT_FORMAT_ELF
328
329 static func_ptr __CTOR_END__[];
330 static void
331 __do_global_ctors_aux ()
332 {
333   func_ptr *p;
334   for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
335     (*p) ();
336 }
337
338 /* Stick a call to __do_global_ctors_aux into the .init section.  */
339
340 static void __attribute__ ((__unused__))
341 init_dummy ()
342 {
343   asm (INIT_SECTION_ASM_OP);
344   __do_global_ctors_aux ();
345 #ifdef FORCE_INIT_SECTION_ALIGN
346   FORCE_INIT_SECTION_ALIGN;
347 #endif
348   asm (TEXT_SECTION_ASM_OP);
349
350 /* This is a kludge. The i386 GNU/Linux dynamic linker needs ___brk_addr,
351    __environ and atexit (). We have to make sure they are in the .dynsym
352    section. We accomplish it by making a dummy call here. This
353    code is never reached.  */
354  
355 #if defined(__linux__) && defined(__PIC__) && defined(__i386__)
356   {
357     extern void *___brk_addr;
358     extern char **__environ;
359
360     ___brk_addr = __environ;
361     atexit ();
362   }
363 #endif
364 }
365
366 #else  /* OBJECT_FORMAT_ELF */
367
368 /* Stick the real initialization code, followed by a normal sort of
369    function epilogue at the very end of the .init section for this
370    entire root executable file or for this entire shared library file.
371
372    Note that we use some tricks here to get *just* the body and just
373    a function epilogue (but no function prologue) into the .init
374    section of the crtend.o file.  Specifically, we switch to the .text
375    section, start to define a function, and then we switch to the .init
376    section just before the body code.
377
378    Earlier on, we put the corresponding function prologue into the .init
379    section of the crtbegin.o file (which will be linked in first).
380
381    Note that we want to invoke all constructors for C++ file-scope static-
382    storage objects AFTER any other possible initialization actions which
383    may be performed by the code in the .init section contributions made by
384    other libraries, etc.  That's because those other initializations may
385    include setup operations for very primitive things (e.g. initializing
386    the state of the floating-point coprocessor, etc.) which should be done
387    before we start to execute any of the user's code.  */
388
389 static void
390 __do_global_ctors_aux ()        /* prologue goes in .text section */
391 {
392   asm (INIT_SECTION_ASM_OP);
393   DO_GLOBAL_CTORS_BODY;
394   ON_EXIT (__do_global_dtors, 0);
395 }                               /* epilogue and body go in .init section */
396
397 #ifdef FORCE_INIT_SECTION_ALIGN
398 FORCE_INIT_SECTION_ALIGN;
399 #endif
400
401 asm (TEXT_SECTION_ASM_OP);
402
403 #endif /* OBJECT_FORMAT_ELF */
404
405 #else /* defined(INIT_SECTION_ASM_OP) */
406
407 #ifdef HAS_INIT_SECTION
408 /* This case is used by the Irix 6 port, which supports named sections but
409    not an SVR4-style .init section.  __do_global_ctors can be non-static
410    in this case because we protect it with -hidden_symbol.  */
411 static func_ptr __CTOR_END__[];
412 #ifdef EH_FRAME_SECTION_ASM_OP
413 extern void __frame_dummy (void);
414 #endif
415 void
416 __do_global_ctors ()
417 {
418   func_ptr *p;
419 #ifdef EH_FRAME_SECTION_ASM_OP
420   __frame_dummy ();
421 #endif
422   for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
423     (*p) ();
424 }
425 #endif
426
427 #endif /* defined(INIT_SECTION_ASM_OP) */
428
429 /* Force cc1 to switch to .data section.  */
430 static func_ptr force_to_data[0] __attribute__ ((__unused__)) = { };
431
432 /* Put a word containing zero at the end of each of our two lists of function
433    addresses.  Note that the words defined here go into the .ctors and .dtors
434    sections of the crtend.o file, and since that file is always linked in
435    last, these words naturally end up at the very ends of the two lists
436    contained in these two sections.  */
437
438 #ifdef CTOR_LIST_END
439 CTOR_LIST_END;
440 #else
441 asm (CTORS_SECTION_ASM_OP);     /* cc1 doesn't know that we are switching! */
442 STATIC func_ptr __CTOR_END__[1] = { (func_ptr) 0 };
443 #endif
444
445 #ifdef DTOR_LIST_END
446 DTOR_LIST_END;
447 #else
448 asm (DTORS_SECTION_ASM_OP);     /* cc1 doesn't know that we are switching! */
449 STATIC func_ptr __DTOR_END__[1] __attribute__ ((__unused__))
450   = { (func_ptr) 0 };
451 #endif
452
453 #ifdef EH_FRAME_SECTION_ASM_OP
454 /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
455    this would be the 'length' field in a real FDE.  */
456
457 typedef unsigned int ui32 __attribute__ ((mode (SI)));
458 asm (EH_FRAME_SECTION_ASM_OP);
459 STATIC ui32 __FRAME_END__[] __attribute__ ((__unused__)) = { 0 };
460 #endif /* EH_FRAME_SECTION */
461
462 #endif /* defined(CRT_END) */
463
464 #else  /* OBJECT_FORMAT_MACHO */
465
466 /* For Mach-O format executables, we assume that the system's runtime is
467    smart enough to handle constructors and destructors, but doesn't have
468    an init section (if it can't even handle constructors/destructors
469    you should be using INVOKE__main, not crtstuff). All we need to do
470    is install/deinstall the frame information for exceptions. We do this
471    by putting a constructor in crtbegin.o and a destructor in crtend.o.
472
473    crtend.o also puts in the terminating zero in the frame information
474    segment. */
475
476 /* The crtstuff for other object formats use the symbol __EH_FRAME_BEGIN__
477    to figure out the start of the exception frame, but here we use
478    getsectbynamefromheader to find this value. Either method would work,
479    but this method avoids creating any global symbols, which seems
480    cleaner. */
481
482 #include <mach-o/ldsyms.h>
483 extern const struct section *
484   getsectbynamefromheader (const struct mach_header *,
485                            const char *, const char *);
486
487 #ifdef CRT_BEGIN
488
489 static void __reg_frame_ctor () __attribute__ ((constructor));
490
491 static void
492 __reg_frame_ctor ()
493 {
494   static struct object object;
495   const struct section *eh_frame;
496
497   eh_frame = getsectbynamefromheader (&_mh_execute_header,
498                                       "__TEXT", "__eh_frame");
499   __register_frame_info ((void *) eh_frame->addr, &object);
500 }
501
502 #endif /* CRT_BEGIN */
503
504 #ifdef CRT_END
505
506 static void __dereg_frame_dtor () __attribute__ ((destructor));
507
508 static
509 void __dereg_frame_dtor ()
510 {
511   const struct section *eh_frame;
512
513   eh_frame = getsectbynamefromheader (&_mh_execute_header,
514                                       "__TEXT", "__eh_frame");
515   __deregister_frame_info ((void *) eh_frame->addr);
516 }
517
518 /* Terminate the frame section with a final zero. */
519
520 /* Force cc1 to switch to .data section.  */
521 static void * force_to_data[0] __attribute__ ((__unused__)) = { };
522
523 typedef unsigned int ui32 __attribute__ ((mode (SI)));
524 asm (EH_FRAME_SECTION_ASM_OP);
525 static ui32 __FRAME_END__[] __attribute__ ((__unused__)) = { 0 };
526
527 #endif /* CRT_END */
528
529 #endif /* OBJECT_FORMAT_MACHO */
530