1 /* $NetBSD: c++rt0.c,v 1.10 2005/12/24 22:02:10 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 void (*__CTOR_LIST__
[0]) __P((void));
55 void (*__DTOR_LIST__
[0]) __P((void));
57 static void __dtors
__P((void));
58 static void __ctors
__P((void));
63 unsigned long i
= (unsigned long) __DTOR_LIST__
[0];
64 void (**p
)(void) = __DTOR_LIST__
+ i
;
73 unsigned long i
= (unsigned long) __CTOR_LIST__
[0];
74 void (**p
)(void) = __CTOR_LIST__
+ 1;
80 extern void __init
__P((void)) __asm(".init");
81 extern void __fini
__P((void)) __asm(".fini");
86 static int initialized
= 0;
89 * Call global constructors.
90 * Arrange to call global destructors at exit.
103 * Call global destructors.