From d5b369d20cdf2c2843da4e6500da82c1dff9156a Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Wed, 10 Jan 2007 22:03:34 +0000 Subject: Fix SEGV for static builds in exit() path. Leave the now obsolete libc/misc/pthread dir in for now. --- libc/misc/Makefile.in | 1 - libc/misc/internals/__uClibc_main.c | 26 ++++++++++++++++++++++++++ libc/sysdeps/linux/common/bits/uClibc_mutex.h | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/libc/misc/Makefile.in b/libc/misc/Makefile.in index 542859576..104db366e 100644 --- a/libc/misc/Makefile.in +++ b/libc/misc/Makefile.in @@ -20,7 +20,6 @@ include $(top_srcdir)libc/misc/gnu/Makefile.in include $(top_srcdir)libc/misc/internals/Makefile.in include $(top_srcdir)libc/misc/locale/Makefile.in include $(top_srcdir)libc/misc/mntent/Makefile.in -include $(top_srcdir)libc/misc/pthread/Makefile.in include $(top_srcdir)libc/misc/regex/Makefile.in include $(top_srcdir)libc/misc/search/Makefile.in include $(top_srcdir)libc/misc/statfs/Makefile.in diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index 50f3c5cae..4454c7b7c 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -399,3 +399,29 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc, */ exit(main(argc, argv, __environ)); } + +#ifdef __UCLIBC_HAS_THREADS__ +/* Weaks for internal library use only. + * + * We need to define weaks here to cover all the pthread functions that + * libc itself will use so that we aren't forced to link libc against + * libpthread. This file is only used in libc.a and since we have + * weaks here, they will be automatically overridden by libpthread.a + * if it gets linked in. + */ + +static int __pthread_return_0 (void) { return 0; } +static void __pthread_return_void (void) { return; } + +weak_alias (__pthread_return_0, __pthread_mutex_init) +weak_alias (__pthread_return_0, __pthread_mutex_lock) +weak_alias (__pthread_return_0, __pthread_mutex_trylock) +weak_alias (__pthread_return_0, __pthread_mutex_unlock) +weak_alias (__pthread_return_void, _pthread_cleanup_push_defer) +weak_alias (__pthread_return_void, _pthread_cleanup_pop_restore) +# ifdef __UCLIBC_HAS_THREADS_NATIVE__ +weak_alias (__pthread_return_0, __pthread_mutexattr_init) +weak_alias (__pthread_return_0, __pthread_mutexattr_destroy) +weak_alias (__pthread_return_0, __pthread_mutexattr_settype) +# endif +#endif diff --git a/libc/sysdeps/linux/common/bits/uClibc_mutex.h b/libc/sysdeps/linux/common/bits/uClibc_mutex.h index b202a6bd2..14aeb9c80 100644 --- a/libc/sysdeps/linux/common/bits/uClibc_mutex.h +++ b/libc/sysdeps/linux/common/bits/uClibc_mutex.h @@ -36,7 +36,7 @@ struct _pthread_cleanup_buffer __infunc_pthread_cleanup_buffer; \ if (C) { \ _pthread_cleanup_push_defer(&__infunc_pthread_cleanup_buffer, \ - __uclibc_mutex_unlock, \ + (void (*) (void *))__pthread_mutex_unlock, \ &(M)); \ __pthread_mutex_lock(&(M)); \ } \ -- cgit v1.2.3