linuxthreads broken in glibc 2.2?

Andreas Jaeger aj@suse.de
Thu Jul 6 02:34:00 GMT 2000


>>>>> Mark Kettenis writes:

Mark>    From: Andreas Jaeger <aj@suse.de>
Mark>    Date: 01 Jul 2000 11:47:33 +0200

>>>>>> Andreas Jaeger writes:
[...]
Mark>    The other test programs segfault at the same place.  Any ideas what's
Mark>    broken?

Mark> Yep.  __pthread_initialize_minimal() hasn't been called yet.  It is
Mark> called from the libc constructor functions, but if you look at
Mark> sysdeps/generic/libc-start.c, you'll see that __libc_init_secure() is
Mark> called before __libc_init_first() which calls the constructors.

Mark> I suppose that there is no problem when using the old method of
Mark> getting at the per-thread errno (which is still used on everything <
Mark> i686), but it fails for the stuff that uses the LDT, since the LDT
Mark> hasn't been set up yet.

Mark> I'm entirely not sure how to fix this.  Calling
Mark> __pthread_initialize_minimal from __libc_start_main() #ifndef SHARED
Mark> is probably the easiest solution.

Here's a patch to follow your suggestion - it fixed the problem for
me and I can run threads with static libraries again.

Uli, ok to commit this?

Andreas

2000-07-06  Andreas Jaeger  <aj@suse.de>

	* sysdeps/generic/libc-start.c (__libc_start_main): Initialize
	thread library for static program.s


============================================================
Index: sysdeps/generic/libc-start.c
--- sysdeps/generic/libc-start.c	2000/06/30 01:11:14	1.19
+++ sysdeps/generic/libc-start.c	2000/07/06 09:27:11
@@ -29,6 +29,10 @@
 extern int __libc_multiple_libcs;
 extern void *__libc_stack_end;
 
+#ifndef SHARED
+extern void __pthread_initialize_minimal (void) __attribute__ ((weak));
+#endif
+
 /* Prototype for local function.  */
 extern void __libc_check_standard_fds (void);
 
@@ -62,6 +66,12 @@
   __libc_stack_end = stack_end;
 
 #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 (__pthread_initialize_minimal)
+    __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

-- 
 Andreas Jaeger
  SuSE Labs aj@suse.de
   private aj@arthur.inka.de


More information about the Libc-hacker mailing list