about summary refs log tree commit diff
path: root/sysdeps/powerpc/elf
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-09-03 02:45:12 +0000
committerRoland McGrath <roland@gnu.org>2002-09-03 02:45:12 +0000
commita2c396f8a991e93cd606fdb9e3b4ca91fa652730 (patch)
treeef9dfd31403a02a7f206aeebe7926d2111ce312f /sysdeps/powerpc/elf
parenta37a5055dca6522713f41c40ecb5c5ab9741e733 (diff)
downloadglibc-a2c396f8a991e93cd606fdb9e3b4ca91fa652730.tar.gz
glibc-a2c396f8a991e93cd606fdb9e3b4ca91fa652730.tar.xz
glibc-a2c396f8a991e93cd606fdb9e3b4ca91fa652730.zip
* 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.
Diffstat (limited to 'sysdeps/powerpc/elf')
-rw-r--r--sysdeps/powerpc/elf/libc-start.c34
1 files changed, 31 insertions, 3 deletions
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 <tls.h>
+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);