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