Parcourir la source

My mistake. We do need some weak pthread_* funcs. But we were previously
missing one in the glibc abi, and including a number of extras (which I
left in commented).
Unfortunately, this brings back the perl pthread bug. Fixing the incorrect
weaks in libpthread wasn't sufficient to escape the shared loader bug. :-(

Manuel Novoa III il y a 20 ans
Parent
commit
613037d45c
1 fichiers modifiés avec 87 ajouts et 2 suppressions
  1. 87 2
      libc/misc/pthread/weaks.c

+ 87 - 2
libc/misc/pthread/weaks.c

@@ -22,22 +22,107 @@
 #include <stdlib.h>
 
 extern int __pthread_return_0 __P ((void));
+extern int __pthread_return_1 __P ((void));
 extern void __pthread_return_void __P ((void));
 
-weak_alias (__pthread_return_0, __pthread_once)
-weak_alias (__pthread_return_void, __pthread_initialize_minimal)
+/**********************************************************************/
+/* Weaks for application/library use.
+ *
+ * Verified by comparing to glibc's linuxthreads/forward.c and defined
+ * only those that are in the glibc abi.
+ * The commented aliases are ones that were previously defined in uClibc
+ * and which I left in for documentation.
+ */
+
+weak_alias (__pthread_return_0, pthread_attr_destroy)
+weak_alias (__pthread_return_0, pthread_attr_getdetachstate)
+weak_alias (__pthread_return_0, pthread_attr_getinheritsched)
+weak_alias (__pthread_return_0, pthread_attr_getschedparam)
+weak_alias (__pthread_return_0, pthread_attr_getschedpolicy)
+weak_alias (__pthread_return_0, pthread_attr_getscope)
+/* weak_alias (__pthread_return_0, pthread_attr_getstackaddr) */
+/* weak_alias (__pthread_return_0, pthread_attr_getstacksize) */
+weak_alias (__pthread_return_0, pthread_attr_init)
+weak_alias (__pthread_return_0, pthread_attr_setdetachstate)
+weak_alias (__pthread_return_0, pthread_attr_setinheritsched)
+weak_alias (__pthread_return_0, pthread_attr_setschedparam)
+weak_alias (__pthread_return_0, pthread_attr_setschedpolicy)
+weak_alias (__pthread_return_0, pthread_attr_setscope)
+/* weak_alias (__pthread_return_0, pthread_attr_setstackaddr) */
+/* weak_alias (__pthread_return_0, pthread_attr_setstacksize) */
+weak_alias (__pthread_return_0, pthread_cond_broadcast)
+weak_alias (__pthread_return_0, pthread_cond_destroy)
+weak_alias (__pthread_return_0, pthread_cond_init)
+weak_alias (__pthread_return_0, pthread_cond_signal)
+weak_alias (__pthread_return_0, pthread_cond_timedwait)
+weak_alias (__pthread_return_0, pthread_cond_wait)
+weak_alias (__pthread_return_0, pthread_condattr_destroy)
+weak_alias (__pthread_return_0, pthread_condattr_init)
+weak_alias (__pthread_return_0, pthread_getschedparam)
+/* weak_alias (__pthread_return_0, pthread_getcancelstate) */
+/* weak_alias (__pthread_return_0, pthread_getconcurrency) */
+/* weak_alias (__pthread_return_0, pthread_getschedparam) */
+weak_alias (__pthread_return_0, pthread_mutex_destroy)
+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_0, pthread_mutexattr_destroy) */
+/* weak_alias (__pthread_return_0, pthread_mutexattr_gettype) */
+/* weak_alias (__pthread_return_0, pthread_mutexattr_init) */
+/* weak_alias (__pthread_return_0, pthread_mutexattr_settype) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_destroy) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_init) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_rdlock) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_tryrdlock) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_trywrlock) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_unlock) */
+/* weak_alias (__pthread_return_0, pthread_rwlock_wrlock) */
+/* weak_alias (__pthread_return_0, pthread_rwlockattr_destroy) */
+/* weak_alias (__pthread_return_0, pthread_rwlockattr_getpshared) */
+/* weak_alias (__pthread_return_0, pthread_rwlockattr_init) */
+/* weak_alias (__pthread_return_0, pthread_rwlockattr_setpshared) */
+weak_alias (__pthread_return_0, pthread_self)
+weak_alias (__pthread_return_0, pthread_setcancelstate)
+weak_alias (__pthread_return_0, pthread_setcanceltype)
+/* weak_alias (__pthread_return_0, pthread_setconcurrency) */
+weak_alias (__pthread_return_0, pthread_setschedparam)
+
+/* Those are pthread functions which return 1 if successful. */
+weak_alias (__pthread_return_1, pthread_equal)
 
+/* pthread_exit () is a special case. */
+void weak_function 
+pthread_exit (void *retval)
+{
+  exit (EXIT_SUCCESS);
+}
+
+/**********************************************************************/
+/* Weaks used internally by the C library. */
 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)
 
+/* Weaks used internally by the C library rpc code only. */
+weak_alias (__pthread_return_0, __pthread_once)
+weak_alias (__pthread_return_void, __pthread_initialize_minimal)
+
+/**********************************************************************/
+
 int
 __pthread_return_0 (void)
 {
   return 0;
 }
 
+int
+__pthread_return_1 (void)
+{
+  return 1;
+}
+
 void
 __pthread_return_void (void)
 {