GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/csu/crtbegin.c Lines: 0 20 0.0 %
Date: 2016-12-06 Branches: 0 16 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: crtbegin.c,v 1.20 2015/11/10 04:14:03 guenther Exp $	*/
2
/*	$NetBSD: crtbegin.c,v 1.1 1996/09/12 16:59:03 cgd Exp $	*/
3
4
/*
5
 * Copyright (c) 1993 Paul Kranenburg
6
 * All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 * 3. All advertising materials mentioning features or use of this software
17
 *    must display the following acknowledgement:
18
 *      This product includes software developed by Paul Kranenburg.
19
 * 4. The name of the author may not be used to endorse or promote products
20
 *    derived from this software without specific prior written permission
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
 */
33
34
/*
35
 * Run-time module for GNU C++ compiled shared libraries.
36
 *
37
 * The linker constructs the following arrays of pointers to global
38
 * constructors and destructors. The first element contains the
39
 * number of pointers in each.
40
 * The tables are also null-terminated.
41
 */
42
#include <stdlib.h>
43
44
#include "md_init.h"
45
#include "os-note-elf.h"
46
#include "extern.h"
47
48
struct dwarf2_eh_object {
49
	void *space[8];
50
};
51
52
void __register_frame_info(const void *, struct dwarf2_eh_object *)
53
    __attribute__((weak));
54
55
void __register_frame_info(const void *begin, struct dwarf2_eh_object *ob)
56
{
57
}
58
59
static const char __EH_FRAME_BEGIN__[]
60
    __attribute__((section(".eh_frame"), aligned(4))) = { };
61
62
/*
63
 * java class registration hooks
64
 */
65
66
static void *__JCR_LIST__[]
67
    __attribute__((section(".jcr"), aligned(sizeof(void*)))) = { };
68
69
extern void _Jv_RegisterClasses (void *)
70
    __attribute__((weak));
71
72
73
/*
74
 * Include support for the __cxa_atexit/__cxa_finalize C++ abi for
75
 * gcc > 2.x. __dso_handle is NULL in the main program and a unique
76
 * value for each C++ shared library. For more info on this API, see:
77
 *
78
 *     http://www.codesourcery.com/cxx-abi/abi.html#dso-dtor
79
 */
80
81
void *__dso_handle = NULL;
82
__asm(".hidden  __dso_handle");
83
84
long __guard_local __dso_hidden __attribute__((section(".openbsd.randomdata")));
85
86
87
static const init_f __CTOR_LIST__[1]
88
    __attribute__((section(".ctors"))) = { (void *)-1 };	/* XXX */
89
static const init_f __DTOR_LIST__[1]
90
    __attribute__((section(".dtors"))) = { (void *)-1 };	/* XXX */
91
92
static void	__dtors(void) __used;
93
static void	__ctors(void) __used;
94
95
static void
96
__ctors()
97
{
98
	unsigned long i = (unsigned long) __CTOR_LIST__[0];
99
	const init_f *p;
100
101
	if (i == -1)  {
102
		for (i = 1; __CTOR_LIST__[i] != NULL; i++)
103
			;
104
		i--;
105
	}
106
	p = __CTOR_LIST__ + i;
107
	while (i--)
108
		(**p--)();
109
}
110
111
static void
112
__dtors()
113
{
114
	const init_f *p = __DTOR_LIST__ + 1;
115
116
	while (*p)
117
		(**p++)();
118
}
119
120
void __init(void);
121
void __fini(void);
122
static void __do_init(void) __used;
123
static void __do_fini(void) __used;
124
125
MD_SECTION_PROLOGUE(".init", __init);
126
127
MD_SECTION_PROLOGUE(".fini", __fini);
128
129
MD_SECT_CALL_FUNC(".init", __do_init);
130
MD_SECT_CALL_FUNC(".fini", __do_fini);
131
132
133
void
134
__do_init()
135
{
136
	static int initialized = 0;
137
	static struct dwarf2_eh_object object;
138
139
	/*
140
	 * Call global constructors.
141
	 * Arrange to call global destructors at exit.
142
	 */
143
	if (!initialized) {
144
		initialized = 1;
145
146
		__register_frame_info(__EH_FRAME_BEGIN__, &object);
147
		if (__JCR_LIST__[0] && _Jv_RegisterClasses)
148
			_Jv_RegisterClasses(__JCR_LIST__);
149
		(__ctors)();
150
151
		atexit(__fini);
152
	}
153
}
154
155
void
156
__do_fini()
157
{
158
	static int finalized = 0;
159
160
	if (!finalized) {
161
		finalized = 1;
162
		/*
163
		 * Call global destructors.
164
		 */
165
		(__dtors)();
166
	}
167
}
168