OSDN Git Service

fix pthread_cancel lead to segmentation fault for x86_64.
authorZhang Pu <glen4linux@gmail.com>
Tue, 20 May 2014 16:52:55 +0000 (00:52 +0800)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 12 Jun 2014 15:33:39 +0000 (17:33 +0200)
When x86_64 cpu contains 'cpu_has_xsave' flag(in kernel),call the
pthread_cancel will have a segmentation fault. Because gcc could
not find the end of stack in user signal stack.

Signed-off-by: Zhang Pu <glen4linux@gmail.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
libc/sysdeps/linux/x86_64/sigaction.c

index 703b24c..a4042a9 100644 (file)
@@ -111,11 +111,19 @@ libc_hidden_weak(sigaction)
    signal handlers work right.  Important are both the names
    (__restore_rt) and the exact instruction sequence.
    If you ever feel the need to make any changes, please notify the
-   appropriate GDB maintainer.  */
+   appropriate GDB maintainer.
+
+   The unwind information starts a byte before __restore_rt, so that
+   it is found when unwinding, to get an address the unwinder assumes
+   will be in the middle of a call instruction.  See the Linux kernel
+   (the i386 vsyscall, in particular) for an explanation of the complex
+   unwind information used here in order to get the traditional CFA.
+ */
 
 #define RESTORE(name, syscall) RESTORE2(name, syscall)
 #define RESTORE2(name, syscall) \
 __asm__ (                                              \
+       "nop\n"                                         \
        ".text\n"                                       \
        "__" #name ":\n"                                \
        "       movq    $" #syscall ", %rax\n"          \