]> git.ipfire.org Git - thirdparty/glibc.git/blame - csu/elf-init.c
Replace FSF snail mail address with URLs.
[thirdparty/glibc.git] / csu / elf-init.c
CommitLineData
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
44extern const ElfW(Rela) __rela_iplt_start [];
45extern const ElfW(Rela) __rela_iplt_end [];
46# endif
47
48# ifdef ELF_MACHINE_IREL
49extern const ElfW(Rel) __rel_iplt_start [];
50extern 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
55extern void (*__preinit_array_start []) (int, char **, char **)
56 attribute_hidden;
57extern void (*__preinit_array_end []) (int, char **, char **)
58 attribute_hidden;
59extern void (*__init_array_start []) (int, char **, char **)
60 attribute_hidden;
61extern void (*__init_array_end []) (int, char **, char **)
62 attribute_hidden;
6d1d0720
UD
63extern void (*__fini_array_start []) (void) attribute_hidden;
64extern 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. */
69extern void _init (void);
70extern 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
80void
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
104void
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
130void
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}