|
From: Jeremy F. <je...@go...> - 2005-01-17 01:20:55
|
On Sun, 2005-01-16 at 22:28 +1100, Eyal Lebedinsky wrote:
> zz33: ../nptl/sysdeps/unix/sysv/linux/fork.c:132: __libc_fork:
> Assertion `({ __typeof (self->tid) __value; if (sizeof (__value) == 1)
> asm volatile ("movb %%gs:%P2,%b0" : "=q" (__value) : "0" (0),
> "i" (((size_t) &((struct pthread *)0)->tid))); else if (sizeof
> (__value) == 4) asm volatile ("movl %%gs:%P1,%0" : "=r" (__value) :
> "i" (((size_t) &((struct pthread *)0)->tid))); else { if (sizeof
> (__value) != 8) abort (); asm volatile ("movl %%gs:%P1,%%eax\n\t"
> "movl %%gs:%P2,%%edx" : "=A" (__value) : "i" (((size_t) &((struct
> pthread *)0)->tid)), "i" (((size_t) &((struct pthread *)0)->tid) +
> 4)); } __value; }) != ppid' failed.
OK, this looks like the real problem.
Currently, when the sys_clone wrapper sees a clone() which is actually a
fork, it ends up using the fork() syscall instead. However, this
doesn't do the extra things that clone() can do, like writing the parent
and/or child pid into memory, which is what this assert checks for.
However, my glibc does this too, so I don't understand why I (and
everyone else with NPTL glibc) doesn't see this too. Anyway, I'll look
at this in a bit more detail now.
In the meantime as a workaround, try using LD_ASSUME_KERNEL=2.4.0, which
will use LinuxThreads instead, and should be OK with the current code.
J
|