]>
Commit | Line | Data |
---|---|---|
568035b7 | 1 | /* Copyright (C) 1998-2013 Free Software Foundation, Inc. |
66000494 UD |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
5 | modify it under the terms of the GNU Lesser General Public |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
66000494 UD |
8 | |
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 12 | Lesser General Public License for more details. |
66000494 | 13 | |
41bdb6e2 | 14 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
15 | License along with the GNU C Library; if not, see |
16 | <http://www.gnu.org/licenses/>. */ | |
66000494 UD |
17 | |
18 | #include <stdlib.h> | |
19 | #include <unistd.h> | |
a42195db | 20 | #include <ldsodefs.h> |
6df7ffad | 21 | #include <sysdep.h> |
66000494 | 22 | |
8c2e201b | 23 | |
75fb247e UD |
24 | int __cache_line_size attribute_hidden; |
25 | /* The main work is done in the generic function. */ | |
26 | #define LIBC_START_MAIN generic_start_main | |
27 | #define LIBC_START_DISABLE_INLINE | |
28 | #define LIBC_START_MAIN_AUXVEC_ARG | |
29 | #define MAIN_AUXVEC_ARG | |
30 | #define INIT_MAIN_ARGS | |
31 | #include <csu/libc-start.c> | |
32 | ||
33 | struct startup_info | |
34 | { | |
70d9946a | 35 | void *sda_base; |
75fb247e UD |
36 | int (*main) (int, char **, char **, void *); |
37 | int (*init) (int, char **, char **, void *); | |
38 | void (*fini) (void); | |
39 | }; | |
40 | ||
66000494 | 41 | int |
e97ed6dd JM |
42 | __libc_start_main (int argc, char **argv, |
43 | char **ev, | |
44 | ElfW (auxv_t) * auxvec, | |
45 | void (*rtld_fini) (void), | |
46 | struct startup_info *stinfo, | |
47 | char **stack_on_entry) | |
66000494 | 48 | { |
66000494 UD |
49 | /* the PPC SVR4 ABI says that the top thing on the stack will |
50 | be a NULL pointer, so if not we assume that we're being called | |
8c2e201b | 51 | as a statically-linked program by Linux... */ |
66000494 UD |
52 | if (*stack_on_entry != NULL) |
53 | { | |
70d9946a | 54 | char **temp; |
66000494 | 55 | /* ...in which case, we have argc as the top thing on the |
8c2e201b | 56 | stack, followed by argv (NULL-terminated), envp (likewise), |
6f65e668 | 57 | and the auxiliary vector. */ |
1010f17b | 58 | /* 32/64-bit agnostic load from stack */ |
70d9946a JM |
59 | argc = *(long int *) stack_on_entry; |
60 | argv = stack_on_entry + 1; | |
61 | ev = argv + argc + 1; | |
f58f41f1 | 62 | #ifdef HAVE_AUX_VECTOR |
70d9946a | 63 | temp = ev; |
b8a5737a | 64 | while (*temp != NULL) |
8c2e201b UD |
65 | ++temp; |
66 | auxvec = (ElfW (auxv_t) *)++ temp; | |
51ac41a7 | 67 | #endif |
66000494 UD |
68 | rtld_fini = NULL; |
69 | } | |
70 | ||
b8a5737a | 71 | /* Initialize the __cache_line_size variable from the aux vector. */ |
8c2e201b | 72 | for (ElfW (auxv_t) * av = auxvec; av->a_type != AT_NULL; ++av) |
1e084487 UD |
73 | switch (av->a_type) |
74 | { | |
75 | case AT_DCACHEBSIZE: | |
fa03b94e | 76 | __cache_line_size = av->a_un.a_val; |
8c2e201b | 77 | break; |
1e084487 | 78 | } |
75fb247e | 79 | |
70d9946a | 80 | return generic_start_main (stinfo->main, argc, argv, auxvec, |
124dcac8 RM |
81 | stinfo->init, stinfo->fini, rtld_fini, |
82 | stack_on_entry); | |
66000494 | 83 | } |