diff options
author | Matt Fischer <matt.fischer@garmin.com> | 2010-01-11 10:02:06 +0800 |
---|---|---|
committer | Garmin Android technology group <android@garmin.com> | 2010-05-12 14:18:36 -0500 |
commit | e4fa46e75cd0d433b5c6c064720ed7e195cba7c8 (patch) | |
tree | 88ab07e29e66cff45b3588718fa778c8218c4b6e /libc/arch-arm | |
parent | c3581dc78a51180d3550d0d04596657cb2db852c (diff) | |
download | bionic-e4fa46e75cd0d433b5c6c064720ed7e195cba7c8.zip bionic-e4fa46e75cd0d433b5c6c064720ed7e195cba7c8.tar.gz bionic-e4fa46e75cd0d433b5c6c064720ed7e195cba7c8.tar.bz2 |
Set SA_RESTORER in sigaction()
GDB looks for specific opcode sequences when trying to recognize a stack
frame as a signal trampoline. The sequences it looks for happen to be those
created when SA_RESTORER is set, since glibc always sets a restorer. This
patch does the same here, so that the trampolines can be correctly identified.
Change-Id: I0ac574a68818cb24d939c3527f3aaeb04b853d04
Diffstat (limited to 'libc/arch-arm')
-rw-r--r-- | libc/arch-arm/bionic/__sig_restorer.S | 7 | ||||
-rw-r--r-- | libc/arch-arm/bionic/sigaction.c | 29 | ||||
-rw-r--r-- | libc/arch-arm/syscalls.mk | 2 | ||||
-rw-r--r-- | libc/arch-arm/syscalls/__sigaction.S (renamed from libc/arch-arm/syscalls/sigaction.S) | 6 |
4 files changed, 40 insertions, 4 deletions
diff --git a/libc/arch-arm/bionic/__sig_restorer.S b/libc/arch-arm/bionic/__sig_restorer.S new file mode 100644 index 0000000..3f6f284 --- /dev/null +++ b/libc/arch-arm/bionic/__sig_restorer.S @@ -0,0 +1,7 @@ +.global __sig_restorer + +/* This is the opcode sequence GDB looks for in order to recognize + this stack frame as a signal trampoline (see sigaction.c) */ +__sig_restorer: + mov r7, #119 /* __NR_sigreturn */ + swi #0 diff --git a/libc/arch-arm/bionic/sigaction.c b/libc/arch-arm/bionic/sigaction.c new file mode 100644 index 0000000..96ca7c6 --- /dev/null +++ b/libc/arch-arm/bionic/sigaction.c @@ -0,0 +1,29 @@ +#include <signal.h> + +extern int __sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); +extern void __sig_restorer(); + +int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) +{ + struct sigaction real_act; + + /* If the caller has not set a custom restorer, then set up a default one. + * The code will function properly without this, however GDB will not be + * able to recognize the stack frame as a signal trampoline, because it + * is hardcoded to look for the instruction sequence that glibc uses in + * its custom restorer. By creating our own restorer with the same + * sequence, we ensure that GDB correctly identifies this as a signal + * trampoline frame. + * + * See http://sourceware.org/ml/gdb/2010-01/msg00143.html for more + * information on this.*/ + if(act && !(act->sa_flags & SA_RESTORER)) { + real_act = *act; + real_act.sa_flags |= SA_RESTORER; + real_act.sa_restorer = __sig_restorer; + + act = &real_act; + } + + return __sigaction(signum, act, oldact); +} diff --git a/libc/arch-arm/syscalls.mk b/libc/arch-arm/syscalls.mk index 706cb0c..f4cb63a 100644 --- a/libc/arch-arm/syscalls.mk +++ b/libc/arch-arm/syscalls.mk @@ -120,13 +120,13 @@ syscall_src += arch-arm/syscalls/__timer_gettime.S syscall_src += arch-arm/syscalls/__timer_getoverrun.S syscall_src += arch-arm/syscalls/__timer_delete.S syscall_src += arch-arm/syscalls/utimes.S -syscall_src += arch-arm/syscalls/sigaction.S syscall_src += arch-arm/syscalls/sigprocmask.S syscall_src += arch-arm/syscalls/__sigsuspend.S syscall_src += arch-arm/syscalls/__rt_sigaction.S syscall_src += arch-arm/syscalls/__rt_sigprocmask.S syscall_src += arch-arm/syscalls/__rt_sigtimedwait.S syscall_src += arch-arm/syscalls/sigpending.S +syscall_src += arch-arm/syscalls/__sigaction.S syscall_src += arch-arm/syscalls/socket.S syscall_src += arch-arm/syscalls/socketpair.S syscall_src += arch-arm/syscalls/bind.S diff --git a/libc/arch-arm/syscalls/sigaction.S b/libc/arch-arm/syscalls/__sigaction.S index 2696f1e..aba44b8 100644 --- a/libc/arch-arm/syscalls/sigaction.S +++ b/libc/arch-arm/syscalls/__sigaction.S @@ -2,12 +2,12 @@ #include <sys/linux-syscalls.h> .text - .type sigaction, #function - .globl sigaction + .type __sigaction, #function + .globl __sigaction .align 4 .fnstart -sigaction: +__sigaction: .save {r4, r7} stmfd sp!, {r4, r7} ldr r7, =__NR_sigaction |