diff options
| -rw-r--r-- | libc/sysdeps/linux/x86_64/sigaction.c | 10 | 
1 files changed, 9 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/x86_64/sigaction.c b/libc/sysdeps/linux/x86_64/sigaction.c index 703b24c51..a4042a9c8 100644 --- a/libc/sysdeps/linux/x86_64/sigaction.c +++ b/libc/sysdeps/linux/x86_64/sigaction.c @@ -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"		\  | 
