1 /* 2 * Copyright (C) 2004 CodeSourcery, LLC 3 * 4 * Permission to use, copy, modify, and distribute this file 5 * for any purpose is hereby granted without fee, provided that 6 * the above copyright notice and this notice appears in all 7 * copies. 8 * 9 * This file is distributed WITHOUT ANY WARRANTY; without even the implied 10 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11 */ 12 13 /* Handle ELF .{pre_init,init,fini}_array sections. */ 14 #include <sys/types.h> 15 16 #ifdef _HAVE_INITFINI_ARRAY 17 18 /* These magic symbols are provided by the linker. */ 19 extern void (*__preinit_array_start []) (void) __attribute__((weak)); 20 extern void (*__preinit_array_end []) (void) __attribute__((weak)); 21 extern void (*__init_array_start []) (void) __attribute__((weak)); 22 extern void (*__init_array_end []) (void) __attribute__((weak)); 23 24 #ifdef _HAVE_INIT_FINI 25 extern void _init (void) __attribute__((weak)); 26 #endif 27 28 /* Iterate over all the init routines. */ 29 void __libc_init_array(void)30__libc_init_array (void) 31 { 32 size_t count; 33 size_t i; 34 35 count = __preinit_array_end - __preinit_array_start; 36 for (i = 0; i < count; i++) 37 __preinit_array_start[i] (); 38 39 #ifdef _HAVE_INIT_FINI 40 if (_init) 41 _init (); 42 #endif 43 44 count = __init_array_end - __init_array_start; 45 for (i = 0; i < count; i++) 46 __init_array_start[i] (); 47 } 48 #endif 49