Add #include to remove warning for errstr()
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / init-first.c
1 /* Initialization code run first thing by the ELF startup code.  Linux version.
2    Copyright (C) 1995-2004, 2005, 2007 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <stdio.h>
21 #include <stdarg.h>
22 #include <stdlib.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include <sysdep.h>
26 #include <fpu_control.h>
27 #include <sys/param.h>
28 #include <sys/types.h>
29 #include <libc-internal.h>
30 #include <malloc.h>
31 #include <assert.h>
32 #include <ldsodefs.h>
33 #include <locale/localeinfo.h>
34 #include <sys/time.h>
35 #include <elf.h>
36 #include <ctype.h>
37 #include <errno.h>
38
39 /* Set nonzero if we have to be prepared for more then one libc being
40    used in the process.  Safe assumption if initializer never runs.  */
41 int __libc_multiple_libcs attribute_hidden = 1;
42
43 /* Remember the command line argument and enviroment contents for
44    later calls of initializers for dynamic libraries.  */
45 int __libc_argc attribute_hidden;
46 char **__libc_argv attribute_hidden;
47
48 struct timeval __t0;
49
50 void
51 __libc_init_first (int argc, char **argv, char **envp)
52 {
53 #ifdef SHARED
54   /* For DSOs we do not need __libc_init_first but instead _init.  */
55 }
56
57 void
58 attribute_hidden
59 _init (int argc, char **argv, char **envp)
60 {
61 #endif
62 #ifdef USE_NONOPTION_FLAGS
63   extern void __getopt_clean_environment (char **);
64 #endif
65
66   __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
67
68   /* Make sure we don't initialize twice.  */
69   if (!__libc_multiple_libcs)
70     {
71       /* Set the FPU control word to the proper default value if the
72          kernel would use a different value.  (In a static program we
73          don't have this information.)  */
74 #ifdef SHARED
75       if (__fpu_control != GLRO(dl_fpu_control))
76 #endif
77         __setfpucw (__fpu_control);
78     }
79
80   /* Save the command-line arguments.  */
81   __libc_argc = argc;
82   __libc_argv = argv;
83   __environ = envp;
84
85 #ifndef SHARED
86   extern const ElfW(Phdr) *_dl_phdr;
87   extern size_t _dl_phnum;
88
89   void** auxp = (void**)envp;
90   while(*auxp)
91     auxp++;
92   ElfW(auxv_t) *av = (ElfW(auxv_t)*)(auxp+1);
93
94   for ( ; av->a_type != AT_NULL; av++)
95   {
96     switch (av->a_type)
97     {
98       case AT_PHDR:
99         _dl_phdr = (void *) av->a_un.a_val;
100         break;
101       case AT_PHNUM:
102         _dl_phnum = av->a_un.a_val;
103         break;
104       case AT_PAGESZ:
105         _dl_pagesize = av->a_un.a_val;
106         break;
107       case AT_ENTRY:
108         /* user_entry = av->a_un.a_val; */
109         break;
110       case AT_PLATFORM:
111         _dl_platform = (void *) av->a_un.a_val;
112         break;
113       case AT_HWCAP:
114         _dl_hwcap = (unsigned long int) av->a_un.a_val;
115         break;
116     }
117   }
118
119   extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
120   __libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN);
121
122   __libc_init_secure ();
123
124   /* First the initialization which normally would be done by the
125      dynamic linker.  */
126   extern void _dl_non_dynamic_init (void) internal_function;
127   _dl_non_dynamic_init ();
128 #endif
129
130 #ifdef VDSO_SETUP
131   VDSO_SETUP ();
132 #endif
133
134   __init_misc (argc, argv, envp);
135
136 #ifdef USE_NONOPTION_FLAGS
137   /* This is a hack to make the special getopt in GNU libc working.  */
138   __getopt_clean_environment (envp);
139 #endif
140
141   /* Initialize ctype data.  */
142   __ctype_init ();
143
144 #ifdef SHARED
145   __libc_global_ctors ();
146 #endif
147
148   gettimeofday(&__t0,0);
149 }
150
151
152 /* This function is defined here so that if this file ever gets into
153    ld.so we will get a link error.  Having this file silently included
154    in ld.so causes disaster, because the _init definition above will
155    cause ld.so to gain an init function, which is not a cool thing. */
156
157 extern void _dl_start (void) __attribute__ ((noreturn));
158
159 void
160 _dl_start (void)
161 {
162   abort ();
163 }
164
165 /* There are issues using stdio as part of rtld.  You'll get errors like: 
166  *              multiple definition of `__libc_multiple_libcs'
167  * Some info: https://sourceware.org/ml/libc-hacker/2000-01/msg00170.html
168  * For this reason, I couldn't put this in sysdeps/akaros/errno.c and still use
169  * snprintf.  init-first is a reasonable dumping ground, and is one of the
170  * sources of the multiple_libcs. */
171 void werrstr(char *fmt, ...)
172 {
173         va_list ap;
174         va_start(ap, fmt);
175         vsnprintf(errstr(), MAX_ERRSTR_LEN, fmt, ap);
176         va_end(ap);
177 }