From a2c396f8a991e93cd606fdb9e3b4ca91fa652730 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 3 Sep 2002 02:45:12 +0000 Subject: * sysdeps/powerpc/elf/libc-start.c [! SHARED]: Call __pthread_initialize_minimal and __libc_check_standard_fds to match the generic version. * sysdeps/powerpc/Makefile (CFLAGS-pt-initfini.s): New variable. * sysdeps/unix/sysv/linux/shmat.c (shmat): Add a cast to avoid a warning when INLINE_SYSCALL macro uses the __syscall_ipc function. * locale/localeconv.c (__localeconv): Cast -1 to char to avoid warnings on platorms where char is unsigned. --- sysdeps/powerpc/elf/libc-start.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'sysdeps/powerpc/elf') diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c index c96e96609d..9450fab68d 100644 --- a/sysdeps/powerpc/elf/libc-start.c +++ b/sysdeps/powerpc/elf/libc-start.c @@ -33,6 +33,15 @@ weak_extern (__cache_line_size) extern int __libc_multiple_libcs; extern void *__libc_stack_end; +#ifndef SHARED +# include +extern void __pthread_initialize_minimal (void) +# if !(USE_TLS - 0) + __attribute__ ((weak)) +# endif + ; +#endif + struct startup_info { void *__unbounded sda_base; @@ -43,7 +52,7 @@ struct startup_info /* 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 + for not NULL. If it is defined then assign the cache block size value to __cache_line_size. */ static inline void __aux_init_cache (ElfW(auxv_t) *av) @@ -103,7 +112,7 @@ 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 ((ElfW(auxv_t) *) auxvec); @@ -113,7 +122,7 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, } INIT_ARGV_and_ENVIRON; - + /* Initialize the __cache_line_size variable from the aux vector. */ __aux_init_cache((ElfW(auxv_t) *) auxvec); @@ -121,6 +130,25 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, stack, for backtraces. This variable should be thread-specific. */ __libc_stack_end = stack_on_entry + 4; +#ifndef SHARED + /* 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) + 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); -- cgit v1.2.3