1 /* $NetBSD: c++rt0.c,v 1.3 2005/12/24 21:54:01 perry Exp $ */
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * Run-time module for GNU C++ compiled shared libraries.
35 * The linker constructs the following arrays of pointers to global
36 * constructors and destructors. The first element contains the
37 * number of pointers in each.
38 * The tables are also null-terminated.
44 * We make the __{C,D}TOR_LIST__ symbols appear as type `SETD' and
45 * include a dummy local function in the set. This keeps references
46 * to these symbols local to the shared object this module is linked to.
48 static void dummy
__P((void)) { return; }
50 /* Note: this is "a.out" dependent. */
51 __asm(".stabs \"___CTOR_LIST__\",22,0,0,_dummy");
52 __asm(".stabs \"___DTOR_LIST__\",22,0,0,_dummy");
54 #ifdef __arm32__ /* XXX ARM32_BROKEN_RELOCATIONS */
55 #define ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
56 #endif /* XXX ARM32_BROKEN_RELOCATIONS */
58 void (*__CTOR_LIST__
[0]) __P((void));
59 void (*__DTOR_LIST__
[0]) __P((void));
61 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
62 static void __dtors
__P((long)); /* XXX ARM32_BROKEN_RELOCATIONS */
63 static void __ctors
__P((long)); /* XXX ARM32_BROKEN_RELOCATIONS */
64 #else /* XXX ARM32_BROKEN_RELOCATIONS */
65 static void __dtors
__P((void));
66 static void __ctors
__P((void));
70 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
71 __dtors(base
) /* XXX ARM32_BROKEN_RELOCATIONS */
72 long base
; /* XXX ARM32_BROKEN_RELOCATIONS */
73 #else /* XXX ARM32_BROKEN_RELOCATIONS */
77 unsigned long i
= (unsigned long) __DTOR_LIST__
[0];
78 void (**p
)(void) = __DTOR_LIST__
+ i
;
81 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
82 (*(void (*)(void))((char *)(*p
--) + base
))(); /* XXX ... */
83 #else /* XXX ARM32_BROKEN_RELOCATIONS */
89 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
90 __ctors(base
) /* XXX ARM32_BROKEN_RELOCATIONS */
91 long base
; /* XXX ARM32_BROKEN_RELOCATIONS */
92 #else /* XXX ARM32_BROKEN_RELOCATIONS */
96 unsigned long i
= (unsigned long) __CTOR_LIST__
[0];
97 void (**p
)(void) = __CTOR_LIST__
+ 1;
100 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
101 (*(void (*)(void))((char *)(*p
++) + base
))(); /* XXX ... */
102 #else /* XXX ARM32_BROKEN_RELOCATIONS */
107 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
108 extern void __init
__P((long)) __asm(".init"); /* XXX ARM32_BROKEN_RELOCATIONS */
109 extern void __fini
__P((long)) __asm(".fini"); /* XXX ARM32_BROKEN_RELOCATIONS */
110 #else /* XXX ARM32_BROKEN_RELOCATIONS */
111 extern void __init
__P((void)) __asm(".init");
112 extern void __fini
__P((void)) __asm(".fini");
116 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
117 __init(base
) /* XXX ARM32_BROKEN_RELOCATIONS */
118 long base
; /* XXX ARM32_BROKEN_RELOCATIONS */
119 #else /* XXX ARM32_BROKEN_RELOCATIONS */
123 static int initialized
= 0;
126 * Call global constructors.
127 * Arrange to call global destructors at exit.
131 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
132 __ctors(base
); /* XXX ARM32_BROKEN_RELOCATIONS */
133 #else /* XXX ARM32_BROKEN_RELOCATIONS */
135 #endif /* XXX ARM32_BROKEN_RELOCATIONS */
141 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
142 __fini(base
) /* XXX ARM32_BROKEN_RELOCATIONS */
143 long base
; /* XXX ARM32_BROKEN_RELOCATIONS */
144 #else /* XXX ARM32_BROKEN_RELOCATIONS */
146 #endif /* XXX ARM32_BROKEN_RELOCATIONS */
149 * Call global destructors.
151 #ifdef ARM32_BROKEN_RELOCATIONS /* XXX ARM32_BROKEN_RELOCATIONS */
152 __dtors(base
); /* XXX ARM32_BROKEN_RELOCATIONS */
153 #else /* XXX ARM32_BROKEN_RELOCATIONS */
155 #endif /* XXX ARM32_BROKEN_RELOCATIONS */