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" \ |