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