summaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/elf
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2003-03-15 23:09:52 +0000
committerRoland McGrath <roland@gnu.org>2003-03-15 23:09:52 +0000
commit124dcac84b992d26cfe992f9017f49e92c37add2 (patch)
tree0d6ed66ef128e14f3b685448ebdcdc1872ec243c /sysdeps/powerpc/elf
parent2b089f2101801ca2a3295fcd755261288ce6268e (diff)
* 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.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);
}