Rename patches to -akaros instead of -ros
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.14.1-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 <stdlib.h>
22 #include <fcntl.h>
23 #include <unistd.h>
24 #include <sysdep.h>
25 #include <fpu_control.h>
26 #include <sys/param.h>
27 #include <sys/types.h>
28 #include <libc-internal.h>
29 #include <malloc.h>
30 #include <assert.h>
31 #include <ldsodefs.h>
32 #include <locale/localeinfo.h>
33 #include <sys/time.h>
34 #include <elf.h>
35
36 /* Set nonzero if we have to be prepared for more then one libc being
37    used in the process.  Safe assumption if initializer never runs.  */
38 int __libc_multiple_libcs attribute_hidden = 1;
39
40 /* Remember the command line argument and enviroment contents for
41    later calls of initializers for dynamic libraries.  */
42 int __libc_argc attribute_hidden;
43 char **__libc_argv attribute_hidden;
44
45 struct timeval __t0;
46
47 void
48 __libc_init_first (int argc, char **argv, char **envp)
49 {
50 #ifdef SHARED
51   /* For DSOs we do not need __libc_init_first but instead _init.  */
52 }
53
54 void
55 attribute_hidden
56 _init (int argc, char **argv, char **envp)
57 {
58 #endif
59 #ifdef USE_NONOPTION_FLAGS
60   extern void __getopt_clean_environment (char **);
61 #endif
62
63   __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
64
65   /* Make sure we don't initialize twice.  */
66   if (!__libc_multiple_libcs)
67     {
68       /* Set the FPU control word to the proper default value if the
69          kernel would use a different value.  (In a static program we
70          don't have this information.)  */
71 #ifdef SHARED
72       if (__fpu_control != GLRO(dl_fpu_control))
73 #endif
74         __setfpucw (__fpu_control);
75     }
76
77   /* Save the command-line arguments.  */
78   __libc_argc = argc;
79   __libc_argv = argv;
80   __environ = envp;
81
82 #ifndef SHARED
83   extern ElfW(Phdr) *_dl_phdr;
84   extern size_t _dl_phnum;
85
86   void** auxp = envp;
87   while(*auxp)
88     auxp++;
89   ElfW(auxv_t) *av = (ElfW(auxv_t)*)(auxp+1);
90
91   for ( ; av->a_type != AT_NULL; av++)
92   {
93     switch (av->a_type)
94     {
95       case AT_PHDR:
96         _dl_phdr = (void *) av->a_un.a_val;
97         break;
98       case AT_PHNUM:
99         _dl_phnum = av->a_un.a_val;
100         break;
101       case AT_PAGESZ:
102         _dl_pagesize = av->a_un.a_val;
103         break;
104       case AT_ENTRY:
105         /* user_entry = av->a_un.a_val; */
106         break;
107       case AT_PLATFORM:
108         _dl_platform = (void *) av->a_un.a_val;
109         break;
110       case AT_HWCAP:
111         _dl_hwcap = (unsigned long int) av->a_un.a_val;
112         break;
113     }
114   }
115
116   extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
117   __libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN);
118
119   __libc_init_secure ();
120
121   /* First the initialization which normally would be done by the
122      dynamic linker.  */
123   extern void _dl_non_dynamic_init (void) internal_function;
124   _dl_non_dynamic_init ();
125 #endif
126
127 #ifdef VDSO_SETUP
128   VDSO_SETUP ();
129 #endif
130
131   __init_misc (argc, argv, envp);
132
133 #ifdef USE_NONOPTION_FLAGS
134   /* This is a hack to make the special getopt in GNU libc working.  */
135   __getopt_clean_environment (envp);
136 #endif
137
138 #ifdef SHARED
139   __libc_global_ctors ();
140 #endif
141
142   gettimeofday(&__t0,0);
143 }
144
145
146 /* This function is defined here so that if this file ever gets into
147    ld.so we will get a link error.  Having this file silently included
148    in ld.so causes disaster, because the _init definition above will
149    cause ld.so to gain an init function, which is not a cool thing. */
150
151 extern void _dl_start (void) __attribute__ ((noreturn));
152
153 void
154 _dl_start (void)
155 {
156   abort ();
157 }