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)17void __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)39void __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