about summary refs log tree commit diff
path: root/sysdeps/powerpc/elf/libc-start.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/elf/libc-start.c')
-rw-r--r--sysdeps/powerpc/elf/libc-start.c132
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);
 }