aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc
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
parenta37a5055dca6522713f41c40ecb5c5ab9741e733 (diff)
downloadglibc-a2c396f8a991e93cd606fdb9e3b4ca91fa652730.zip
glibc-a2c396f8a991e93cd606fdb9e3b4ca91fa652730.tar.gz
glibc-a2c396f8a991e93cd606fdb9e3b4ca91fa652730.tar.bz2
* 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')
-rw-r--r--sysdeps/powerpc/Makefile5
-rw-r--r--sysdeps/powerpc/elf/libc-start.c34
2 files changed, 36 insertions, 3 deletions
diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile
index 0737f6f..e6444f2 100644
--- a/sysdeps/powerpc/Makefile
+++ b/sysdeps/powerpc/Makefile
@@ -46,6 +46,11 @@ shared-only-routines += divdi3 libgcc-compat
endif
endif
+ifeq ($(subdir):$(elf),linuxthreads:yes)
+# See CFLAGS-initfini.s above; this is the same code.
+CFLAGS-pt-initfini.s = -g0 -fpic -O1
+endif
+
ifeq ($(subdir),string)
CFLAGS-memcmp.c += -Wno-uninitialized
endif
diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c
index c96e966..9450fab 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);