]>
Commit | Line | Data |
---|---|---|
06b31ad3 | 1 | /* Startup support for ELF initializers/finalizers in the main executable. |
23bee3e8 RM |
2 | Copyright (C) 2002,2003,2004,2005,2009,2011 |
3 | Free Software Foundation, Inc. | |
06b31ad3 RM |
4 | This file is part of the GNU C Library. |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
7 | modify it under the terms of the GNU Lesser General Public | |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
10 | ||
92c6ccd1 RM |
11 | In addition to the permissions in the GNU Lesser General Public |
12 | License, the Free Software Foundation gives you unlimited | |
13 | permission to link the compiled version of this file with other | |
14 | programs, and to distribute those programs without any restriction | |
15 | coming from the use of this file. (The GNU Lesser General Public | |
16 | License restrictions do apply in other respects; for example, they | |
17 | cover modification of the file, and distribution when not linked | |
18 | into another program.) | |
19 | ||
20 | Note that people who make modified versions of this file are not | |
21 | obligated to grant this special exception for their modified | |
22 | versions; it is their choice whether to do so. The GNU Lesser | |
23 | General Public License gives permission to release a modified | |
24 | version without this exception; this exception also makes it | |
25 | possible to release a modified version which carries forward this | |
26 | exception. | |
27 | ||
06b31ad3 RM |
28 | The GNU C Library is distributed in the hope that it will be useful, |
29 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
31 | Lesser General Public License for more details. | |
32 | ||
33 | You should have received a copy of the GNU Lesser General Public | |
59ba27a6 PE |
34 | License along with the GNU C Library; if not, see |
35 | <http://www.gnu.org/licenses/>. */ | |
06b31ad3 RM |
36 | |
37 | #include <stddef.h> | |
38 | ||
443caceb | 39 | #if defined USE_MULTIARCH && !defined LIBC_NONSHARED |
74414708 UD |
40 | # include <link.h> |
41 | # include <dl-irel.h> | |
42 | ||
43 | # ifdef ELF_MACHINE_IRELA | |
44 | extern const ElfW(Rela) __rela_iplt_start []; | |
45 | extern const ElfW(Rela) __rela_iplt_end []; | |
46 | # endif | |
47 | ||
48 | # ifdef ELF_MACHINE_IREL | |
49 | extern const ElfW(Rel) __rel_iplt_start []; | |
50 | extern const ElfW(Rel) __rel_iplt_end []; | |
51 | # endif | |
52 | #endif /* LIBC_NONSHARED */ | |
ce33ee7c | 53 | |
06b31ad3 | 54 | /* These magic symbols are provided by the linker. */ |
04395c90 UD |
55 | extern void (*__preinit_array_start []) (int, char **, char **) |
56 | attribute_hidden; | |
57 | extern void (*__preinit_array_end []) (int, char **, char **) | |
58 | attribute_hidden; | |
59 | extern void (*__init_array_start []) (int, char **, char **) | |
60 | attribute_hidden; | |
61 | extern void (*__init_array_end []) (int, char **, char **) | |
62 | attribute_hidden; | |
6d1d0720 UD |
63 | extern void (*__fini_array_start []) (void) attribute_hidden; |
64 | extern void (*__fini_array_end []) (void) attribute_hidden; | |
ce33ee7c | 65 | |
06b31ad3 RM |
66 | |
67 | /* These function symbols are provided for the .init/.fini section entry | |
68 | points automagically by the linker. */ | |
69 | extern void _init (void); | |
70 | extern void _fini (void); | |
71 | ||
72 | /* These functions are passed to __libc_start_main by the startup code. | |
73 | These get statically linked into each program. For dynamically linked | |
74 | programs, this module will come from libc_nonshared.a and differs from | |
1c3c269b UD |
75 | the libc.a module in that it doesn't call the preinit array and performs |
76 | explicit IREL{,A} relocations. */ | |
06b31ad3 | 77 | |
06b31ad3 | 78 | |
4bb04b1f | 79 | #ifndef LIBC_NONSHARED |
1c3c269b UD |
80 | void |
81 | __libc_csu_irel (void) | |
82 | { | |
4bb04b1f AS |
83 | # ifdef USE_MULTIARCH |
84 | # ifdef ELF_MACHINE_IRELA | |
74414708 UD |
85 | { |
86 | const size_t size = __rela_iplt_end - __rela_iplt_start; | |
87 | for (size_t i = 0; i < size; i++) | |
88 | elf_irela (&__rela_iplt_start [i]); | |
89 | } | |
4bb04b1f | 90 | # endif |
74414708 | 91 | |
4bb04b1f | 92 | # ifdef ELF_MACHINE_IREL |
74414708 UD |
93 | { |
94 | const size_t size = __rel_iplt_end - __rel_iplt_start; | |
95 | for (size_t i = 0; i < size; i++) | |
96 | elf_irel (&__rel_iplt_start [i]); | |
97 | } | |
4bb04b1f | 98 | # endif |
74414708 | 99 | # endif |
1c3c269b UD |
100 | } |
101 | #endif | |
74414708 | 102 | |
1c3c269b UD |
103 | |
104 | void | |
105 | __libc_csu_init (int argc, char **argv, char **envp) | |
106 | { | |
107 | /* For dynamically linked executables the preinit array is executed by | |
23bee3e8 | 108 | the dynamic linker (before initializing any shared object). */ |
1c3c269b UD |
109 | |
110 | #ifndef LIBC_NONSHARED | |
4bb04b1f | 111 | /* For static executables, preinit happens right before init. */ |
06b31ad3 RM |
112 | { |
113 | const size_t size = __preinit_array_end - __preinit_array_start; | |
114 | size_t i; | |
115 | for (i = 0; i < size; i++) | |
04395c90 | 116 | (*__preinit_array_start [i]) (argc, argv, envp); |
06b31ad3 | 117 | } |
06b31ad3 RM |
118 | #endif |
119 | ||
120 | _init (); | |
121 | ||
ce33ee7c UD |
122 | const size_t size = __init_array_end - __init_array_start; |
123 | for (size_t i = 0; i < size; i++) | |
04395c90 | 124 | (*__init_array_start [i]) (argc, argv, envp); |
06b31ad3 RM |
125 | } |
126 | ||
9dcafc55 UD |
127 | /* This function should not be used anymore. We run the executable's |
128 | destructor now just like any other. We cannot remove the function, | |
129 | though. */ | |
06b31ad3 RM |
130 | void |
131 | __libc_csu_fini (void) | |
132 | { | |
43c59a70 | 133 | #ifndef LIBC_NONSHARED |
06b31ad3 RM |
134 | size_t i = __fini_array_end - __fini_array_start; |
135 | while (i-- > 0) | |
136 | (*__fini_array_start [i]) (); | |
06b31ad3 RM |
137 | |
138 | _fini (); | |
9dcafc55 | 139 | #endif |
06b31ad3 | 140 | } |