diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/misc/internals/__uClibc_main.c | 77 |
1 files changed, 21 insertions, 56 deletions
diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index 35a57c6a9..81cc57d94 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -13,62 +13,25 @@ #define _ERRNO_H #include <unistd.h> +#include <stdlib.h> -#if !defined HAVE_ELF -/* This is a theoretical attempt to support old a.out compilers. - * Dunno if this will work properly and I really don't much - * care... Elf is the One True Path(tm). You will be assimilated */ -# define __USE_WEAK_ALIASES -#endif /* * Prototypes. */ -extern int main(int argc, char **argv, char **envp); -#ifndef __USE_WEAK_ALIASES -#include <stdlib.h> -extern int weak_function atexit(void (*function)(void)); +extern int main(int argc, char **argv, char **envp); extern void weak_function _init(void); extern void weak_function _fini(void); extern void weak_function _stdio_init(void); -extern void weak_function _stdio_term(void); extern int *weak_const_function __errno_location(void); extern int *weak_const_function __h_errno_location(void); +extern int weak_function atexit(void (*function)(void)); #ifdef __UCLIBC_HAS_LOCALE__ extern void weak_function _locale_init(void); #endif -#else -/* - * Define an empty function and use it as a weak alias for the stdio - * initialization routine. That way we don't pull in all the stdio - * code unless we need to. Similarly, do the same for _stdio_term - * so as not to include atexit unnecessarily. - * - * NOTE!!! This is only true for the _static_ case!!! - */ -weak_alias(__environ, environ); -void __uClibc_empty_func(void) -{ -} -extern void exit (int status) __attribute__ ((__noreturn__)); -extern void _init(void); -extern void _fini(void); -extern void _stdio_init(void); -weak_alias(__uClibc_empty_func, _init); -weak_alias(__uClibc_empty_func, _fini); -//weak_alias(__uClibc_empty_func, _stdio_init); -//weak_alias(__uClibc_empty_func, _stdio_term); -//weak_alias(__uClibc_empty_func, atexit); -extern int atexit(void (*function)(void)); -//weak_alias(__uClibc_empty_func, __errno_location); -extern int *__errno_location(void); -//weak_alias(__uClibc_empty_func, __h_errno_location); -extern int *__h_errno_location(void); -#ifdef __UCLIBC_HAS_LOCALE__ -extern void _locale_init(void); -#endif -#endif + + /* * Declare the __environ global variable and create a weak alias environ. @@ -80,16 +43,18 @@ char **__environ = 0; weak_alias(__environ, environ); -/* - * Now for our main routine. - */ + + void __attribute__ ((__noreturn__)) __uClibc_main(int argc, char **argv, char **envp) { - /* - * Initialize the global variable __environ. - */ - __environ = envp; + /* If we are dynamically linked the shared lib loader + * already did this for us. But if we are statically + * linked, we need to do this for ourselves. */ + if (__environ==NULL) { + /* Statically linked. */ + __environ = envp; + } #if 0 /* Some security at this point. Prevent starting a SUID binary @@ -97,7 +62,7 @@ __uClibc_main(int argc, char **argv, char **envp) * to do this only for statically linked applications since * otherwise the dynamic loader did the work already. */ if (unlikely (__libc_enable_secure!=NULL)) - __libc_check_standard_fds (); + __libc_check_standard_fds (); #endif #ifdef __UCLIBC_HAS_LOCALE__ @@ -110,15 +75,16 @@ __uClibc_main(int argc, char **argv, char **envp) * be bypassed if not needed because of the weak alias above. */ if (likely(_stdio_init != NULL)) - _stdio_init(); + _stdio_init(); /* Arrange for dtors to run at exit. */ if (unlikely(_fini!=NULL && atexit)) { - atexit (&_fini); + atexit (&_fini); } + /* Run all ctors now. */ if (unlikely(_init!=NULL)) - _init(); + _init(); /* * Note: It is possible that any initialization done above could @@ -126,15 +92,14 @@ __uClibc_main(int argc, char **argv, char **envp) * we call main. */ if (likely(__errno_location!=NULL)) - *(__errno_location()) = 0; + *(__errno_location()) = 0; /* Set h_errno to 0 as well */ if (likely(__h_errno_location!=NULL)) - *(__h_errno_location()) = 0; + *(__h_errno_location()) = 0; /* * Finally, invoke application's main and then exit. */ exit(main(argc, argv, envp)); } - |