diff options
author | Roland McGrath <roland@gnu.org> | 2003-03-15 23:09:52 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2003-03-15 23:09:52 +0000 |
commit | 124dcac84b992d26cfe992f9017f49e92c37add2 (patch) | |
tree | 0d6ed66ef128e14f3b685448ebdcdc1872ec243c /sysdeps/powerpc/elf | |
parent | 2b089f2101801ca2a3295fcd755261288ce6268e (diff) | |
download | glibc-124dcac84b992d26cfe992f9017f49e92c37add2.tar.gz glibc-124dcac84b992d26cfe992f9017f49e92c37add2.tar.xz glibc-124dcac84b992d26cfe992f9017f49e92c37add2.zip |
* sysdeps/powerpc/elf/libc-start.c (AUX_VECTOR_INIT): Define it.
(LIBC_START_MAIN, LIBC_START_MAIN_AUXVEC_ARG, MAIN_AUXVEC_ARG) (INIT_MAIN_ARGS): Define, and #include <sysdeps/generic/libc-start.c>. (__libc_start_main): Just call the generic one for most of the work. * sysdeps/generic/libc-start.c [LIBC_START_MAIN]: If defined, define a static function by that name instead of BP_SYM (__libc_start_main). [LIBC_START_MAIN_AUXVEC_ARG]: Take AUXVEC as argument. [MAIN_AUXVEC_ARG]: Pass 4th argument to MAIN. [INIT_MAIN_ARGS]: Give INIT the same args as MAIN. * sysdeps/generic/dl-sysdep.c (_dl_sysdep_start) [DL_PLATFORM_AUXV]: Use this macro for extra AT_* cases. * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c (DL_PLATFORM_AUXV): New macro, guts from ... (__aux_init_cache): ... here, function removed. (DL_PLATFORM_INIT): Don't define this. * sysdeps/powerpc/powerpc32/memset.S: Put __cache_line_size in bss. * sysdeps/powerpc/powerpc64/memset.S: Likewise. * Versions.def (libthread_db): Add GLICB_2.3.3 set.
Diffstat (limited to 'sysdeps/powerpc/elf')
-rw-r--r-- | sysdeps/powerpc/elf/libc-start.c | 132 |
1 files changed, 28 insertions, 104 deletions
diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c index aac34430a8..bbc4eeb3b8 100644 --- a/sysdeps/powerpc/elf/libc-start.c +++ b/sysdeps/powerpc/elf/libc-start.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998,2000,2001,2002 Free Software Foundation, Inc. +/* Copyright (C) 1998,2000,2001,2002,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,31 +22,9 @@ #include <bp-start.h> #include <bp-sym.h> -extern void __libc_init_first (int argc, char **argv, char **envp); - extern int __cache_line_size; weak_extern (__cache_line_size) -extern int __libc_multiple_libcs; -extern void *__libc_stack_end; - -#ifndef SHARED -# include <tls.h> -extern void __pthread_initialize_minimal (void) -# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP - __attribute__ ((weak)) -# endif - ; -#endif - -struct startup_info -{ - void *__unbounded sda_base; - int (*main) (int, char **, char **, void *); - int (*init) (int, char **, char **, void *); - void (*fini) (void); -}; - /* Scan the Aux Vector for the "Data Cache Block Size" entry. If found verify that the static extern __cache_line_size is defined by checking for not NULL. If it is defined then assign the cache block size @@ -66,16 +44,35 @@ __aux_init_cache (ElfW(auxv_t) *av) break; } } +/* This is used in sysdeps/generic/libc-start.c. */ +#define AUX_VECTOR_INIT __aux_init_cache + +/* The main work is done in the generic function. */ +#define LIBC_START_MAIN generic_start_main +#define LIBC_START_MAIN_AUXVEC_ARG +#define MAIN_AUXVEC_ARG +#define INIT_MAIN_ARGS +#include <sysdeps/generic/libc-start.c> + + +struct startup_info +{ + void *__unbounded sda_base; + int (*main) (int, char **, char **, void *); + int (*init) (int, char **, char **, void *); + void (*fini) (void); +}; int /* GKM FIXME: GCC: this should get __BP_ prefix by virtue of the BPs in the arglist of startup_info.main and startup_info.init. */ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, - char *__unbounded *__unbounded ubp_ev, - ElfW(auxv_t) *__unbounded auxvec, void (*rtld_fini) (void), - struct startup_info *__unbounded stinfo, - char *__unbounded *__unbounded stack_on_entry) + char *__unbounded *__unbounded ubp_ev, + ElfW(auxv_t) *__unbounded auxvec, + void (*rtld_fini) (void), + struct startup_info *__unbounded stinfo, + char *__unbounded *__unbounded stack_on_entry) { #if __BOUNDED_POINTERS__ char **argv; @@ -83,15 +80,6 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, # define argv ubp_av #endif -#ifndef SHARED - /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. - If the address would be taken inside the expression the optimizer - would try to be too smart and throws it away. Grrr. */ - int *dummy_addr = &_dl_starting_up; - - __libc_multiple_libcs = dummy_addr && !_dl_starting_up; -#endif - /* the PPC SVR4 ABI says that the top thing on the stack will be a NULL pointer, so if not we assume that we're being called as a statically-linked program by Linux... */ @@ -110,78 +98,14 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, while (*temp != NULL) ++temp; auxvec = (ElfW(auxv_t) *)++temp; - -# ifndef SHARED - _dl_aux_init (auxvec); -# endif #endif rtld_fini = NULL; } - INIT_ARGV_and_ENVIRON; - /* Initialize the __cache_line_size variable from the aux vector. */ - __aux_init_cache(auxvec); - - /* Store something that has some relationship to the end of the - stack, for backtraces. This variable should be thread-specific. - Use +8 so it works for both 32- and 64-bit. */ - __libc_stack_end = stack_on_entry + 8; - -#ifndef SHARED -# ifdef DL_SYSDEP_OSCHECK - if (!__libc_multiple_libcs) - { - /* This needs to run to initiliaze _dl_osversion before TLS - setup might check it. */ - DL_SYSDEP_OSCHECK (__libc_fatal); - } -# endif - /* Initialize the thread library at least a bit since the libgcc - functions are using thread functions if these are available and - we need to setup errno. If there is no thread library and we - handle TLS the function is defined in the libc to initialized the - TLS handling. */ -# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP - if (__pthread_initialize_minimal) -# endif - __pthread_initialize_minimal (); - - /* Some security at this point. Prevent starting a SUID binary where - the standard file descriptors are not opened. We have to do this - only for statically linked applications since otherwise the dynamic - loader did the work already. */ - if (__builtin_expect (__libc_enable_secure, 0)) - __libc_check_standard_fds (); -#endif - - /* Register the destructor of the dynamic linker if there is any. */ - if (rtld_fini != NULL) - __cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL); - - /* Call the initializer of the libc. */ -#ifdef SHARED - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) - _dl_debug_printf ("\ninitialize libc\n\n"); -#endif - __libc_init_first (argc, argv, __environ); - - /* Register the destructor of the program, if any. */ - if (stinfo->fini) - __cxa_atexit ((void (*) (void *)) stinfo->fini, NULL, NULL); - - /* Call the initializer of the program, if any. */ -#ifdef SHARED - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) - _dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]); -#endif - if (stinfo->init) - stinfo->init (argc, argv, __environ, auxvec); - -#ifdef SHARED - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) - _dl_debug_printf ("\ntransferring control: %s\n\n", argv[0]); -#endif + __aux_init_cache (auxvec); - exit (stinfo->main (argc, argv, __environ, auxvec)); + return generic_start_main (stinfo->main, argc, ubp_av, auxvec, + stinfo->init, stinfo->fini, rtld_fini, + stack_on_entry); } |