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