1 /*
2  * Copyright (C) 2006 CodeSourcery Inc
3  *
4  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
5  *
6  * This file defines the main initialisation and finalisation code for
7  * shared flat libraries.  It in turn calls the initialisation and
8  * finalisation code for each registered library.
9  */
10 #include "shared_flat_lib.h"
11 
12 /* A doubly-linked list of shared libraries.  Those nearer the head
13  * of the list should be initialised first and finalised last.  */
14 struct shared_flat_lib *__first_shared_lib;
15 struct shared_flat_lib *__last_shared_lib;
16 
__shared_flat_init(void)17 void __shared_flat_init(void)
18 {
19 	struct shared_flat_lib *lib;
20 	void (**start)(void);
21 	void (**end)(void);
22 
23 	for (lib = __first_shared_lib; lib; lib = lib->next) {
24 		end = lib->preinit_array_end;
25 		for (start = lib->preinit_array_start; start < end; start++)
26 			(*start)();
27 	}
28 
29 	for (lib = __first_shared_lib; lib; lib = lib->next) {
30 		if (lib->init)
31 			lib->init();
32 
33 		end = lib->init_array_end;
34 		for (start = lib->init_array_start; start < end; start++)
35 			(*start)();
36 	}
37 }
38 
__shared_flat_fini(void)39 void __shared_flat_fini(void)
40 {
41 	struct shared_flat_lib *lib;
42 	void (**start)(void);
43 	void (**end)(void);
44 
45 	for (lib = __last_shared_lib; lib; lib = lib->prev) {
46 		start = lib->fini_array_start;
47 		for (end = lib->fini_array_end; end > start;)
48 			(*--end)();
49 
50 		if (lib->fini)
51 			lib->fini();
52 	}
53 }
54