diff options
Diffstat (limited to 'main/libc0.9.32/0007-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch')
-rw-r--r-- | main/libc0.9.32/0007-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch | 251 |
1 files changed, 0 insertions, 251 deletions
diff --git a/main/libc0.9.32/0007-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch b/main/libc0.9.32/0007-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch deleted file mode 100644 index ba3681f334..0000000000 --- a/main/libc0.9.32/0007-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch +++ /dev/null @@ -1,251 +0,0 @@ -From caed9d8dbc7e7b1e39a3e666d691d844da3ab12d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> -Date: Thu, 10 Nov 2011 09:36:44 +0200 -Subject: [PATCH 7/8] libc/x86: fix stack unwinding and backtrace information -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When compiled without framepointer, the DWARF-2 CFI data is required -for proper stack unwinding. - -This patch adds the CFI information to: - * syscalls (so we get proper backtrace even for release builds) - the ebx hack was removed as it would complicate the CFI generation - * new thread stub function (so the backtrace is clean for user - created threads) - -Also pads the signal return trampolines separate from other functions. -If CFI info was found for signal return code (which seems to happen if -it's located right next a valid function), it will not be recognized -as signal trampoline (gcc unwinder and gdb check first CFI info, and -only if it does not exists it compares the exact opcode sequence to -see if we are at signal return code block). This fixes a real crash -if thread is cancelled and the cancellation handler fails to detect the -signal return frame. - -Signed-off-by: Timo Teräs <timo.teras@iki.fi> -Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> ---- - libc/sysdeps/linux/i386/bits/syscalls.h | 82 +++---------------------------- - libc/sysdeps/linux/i386/clone.S | 17 ++++++ - libc/sysdeps/linux/i386/sigaction.c | 4 ++ - 3 files changed, 28 insertions(+), 75 deletions(-) - -diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h -index 9fb4f35..35b09bb 100644 ---- a/libc/sysdeps/linux/i386/bits/syscalls.h -+++ b/libc/sysdeps/linux/i386/bits/syscalls.h -@@ -13,6 +13,7 @@ - #ifndef __ASSEMBLER__ - - #include <errno.h> -+#include <common/sysdep.h> - - #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ - (__extension__ \ -@@ -32,90 +33,21 @@ - - #if 1 /* defined __PIC__ || defined __pic__ */ - --/* This code avoids pushing/popping ebx as much as possible. -- * I think the main reason was that older GCCs had problems -- * with proper saving/restoring of ebx if "b" constraint was used, -- * which was breaking -fPIC code really badly. -- * At least gcc 4.2.x seems to not need these tricks anymore, -- * but this code is still useful because it often avoids -- * using stack for saving ebx. -- * Keeping it unconditionally enabled for now. -- */ -- --/* We need some help from the assembler to generate optimal code. -- * We define some macros here which later will be used. */ --/* gcc>=4.6 with LTO need the same guards as IMA (a.k.a --combine) did. -- * See gcc.gnu.org/PR47577 */ --/* FIXME: drop these b* macros! */ -- --__asm__ ( --#if defined __DOMULTI__ || __GNUC_PREREQ (4, 6) -- /* Protect against asm macro redefinition (happens in __DOMULTI__ mode). -- * Unfortunately, it ends up visible in .o files. */ -- ".ifndef _BITS_SYSCALLS_ASM\n\t" -- ".set _BITS_SYSCALLS_ASM,1\n\t" --#endif -- ".L__X'%ebx = 1\n\t" -- ".L__X'%ecx = 2\n\t" -- ".L__X'%edx = 2\n\t" -- ".L__X'%eax = 3\n\t" -- ".L__X'%esi = 3\n\t" -- ".L__X'%edi = 3\n\t" -- ".L__X'%ebp = 3\n\t" -- ".L__X'%esp = 3\n\t" -- -- /* Loading param #1 (ebx) is done by loading it into -- * another register, and then performing bpushl+bmovl, -- * since we must preserve ebx */ -- -- ".macro bpushl name reg\n\t" -- ".if 1 - \\name\n\t" /* if reg!=ebx... */ -- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ -- "pushl %ebx\n\t" /* save ebx on stack */ -- ".else\n\t" -- "xchgl \\reg, %ebx\n\t" /* else save ebx in reg, and load reg to ebx */ -- ".endif\n\t" -- ".endif\n\t" -- ".endm\n\t" -- -- ".macro bmovl name reg\n\t" -- ".if 1 - \\name\n\t" -- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ -- "movl \\reg, %ebx\n\t" /* load reg to ebx */ -- ".endif\n\t" -- ".endif\n\t" -- ".endm\n\t" -- -- ".macro bpopl name reg\n\t" -- ".if 1 - \\name\n\t" -- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ -- "popl %ebx\n\t" /* restore ebx from stack */ -- ".else\n\t" -- "xchgl \\reg, %ebx\n\t" /* else restore ebx from reg */ -- ".endif\n\t" -- ".endif\n\t" -- ".endm\n\t" -- --#if defined __DOMULTI__ || __GNUC_PREREQ (4, 6) -- ".endif\n\t" /* _BITS_SYSCALLS_ASM */ --#endif --); -- - #define LOADARGS_0 --#define LOADARGS_1 "bpushl .L__X'%k2, %k2\n\t" "bmovl .L__X'%k2, %k2\n\t" -+#define LOADARGS_1 "push %%ebx\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebx, 0) "\n\t" "movl %k2, %%ebx\n\t" - #define LOADARGS_2 LOADARGS_1 - #define LOADARGS_3 LOADARGS_1 - #define LOADARGS_4 LOADARGS_1 - #define LOADARGS_5 LOADARGS_1 --#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" "movl %7, %%ebp\n\t" -+#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebp, 0) "\n\t" "movl %7, %%ebp\n\t" - - #define RESTOREARGS_0 --#define RESTOREARGS_1 "bpopl .L__X'%k2, %k2\n\t" -+#define RESTOREARGS_1 "pop %%ebx\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebx) "\n\t" RESTOREARGS_0 - #define RESTOREARGS_2 RESTOREARGS_1 - #define RESTOREARGS_3 RESTOREARGS_1 - #define RESTOREARGS_4 RESTOREARGS_1 - #define RESTOREARGS_5 RESTOREARGS_1 --#define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1 -+#define RESTOREARGS_6 "pop %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebp) "\n\t" RESTOREARGS_1 - - #define ASMFMT_0() - /* "acdSD" constraint would work too, but "SD" would use esi/edi and cause -@@ -163,7 +95,7 @@ __asm__ ( - #define LOADARGS_3 - #define LOADARGS_4 - #define LOADARGS_5 --#define LOADARGS_6 "push %%ebp\n\t" "movl %7, %%ebp\n\t" -+#define LOADARGS_6 "push %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebp, 0) "\n\t" "movl %7, %%ebp\n\t" - - #define RESTOREARGS_0 - #define RESTOREARGS_1 -@@ -171,7 +103,7 @@ __asm__ ( - #define RESTOREARGS_3 - #define RESTOREARGS_4 - #define RESTOREARGS_5 --#define RESTOREARGS_6 "pop %%ebp\n\t" -+#define RESTOREARGS_6 "pop %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebp) "\n\t" - - #define ASMFMT_0() - #define ASMFMT_1(arg1) \ -diff --git a/libc/sysdeps/linux/i386/clone.S b/libc/sysdeps/linux/i386/clone.S -index a7de3fe..cf6cd35 100644 ---- a/libc/sysdeps/linux/i386/clone.S -+++ b/libc/sysdeps/linux/i386/clone.S -@@ -25,6 +25,7 @@ - - #define _ERRNO_H 1 - #include <bits/errno.h> -+#include <sysdep.h> - #include <sys/syscall.h> - - /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, -@@ -45,6 +46,7 @@ - .global clone - .type clone,%function - clone: -+ cfi_startproc; - /* Sanity check arguments. */ - movl $-EINVAL,%eax - -@@ -86,17 +88,28 @@ clone: - - /* Do the system call */ - pushl %ebx -+ cfi_adjust_cfa_offset (4) - pushl %esi -+ cfi_adjust_cfa_offset (4) - pushl %edi -+ cfi_adjust_cfa_offset (4) -+ - movl TLS+12(%esp),%esi -+ cfi_rel_offset (esi, 4) - movl PTID+12(%esp),%edx - movl FLAGS+12(%esp),%ebx -+ cfi_rel_offset (ebx, 8) - movl CTID+12(%esp),%edi -+ cfi_rel_offset (edi, 0) - movl $__NR_clone,%eax - #ifdef RESET_PID - /* Remember the flag value. */ - movl %ebx, (%ecx) - #endif -+ /* End FDE now, because in the child the unwind info will be -+ wrong. */ -+ cfi_endproc -+ - int $0x80 - popl %edi - popl %esi -@@ -108,6 +121,9 @@ clone: - ret - - .Lthread_start: -+ cfi_startproc; -+ /* Clearing frame pointer is insufficient, use CFI. */ -+ cfi_undefined (eip); - /* Note: %esi is zero. */ - movl %esi,%ebp /* terminate the stack frame */ - call *%ebx -@@ -120,6 +136,7 @@ clone: - movl %eax, %ebx - movl $__NR_exit, %eax - int $0x80 -+ cfi_endproc; - - /* Need to indirect jump to syscall error - * or we end up with TEXTREL's -diff --git a/libc/sysdeps/linux/i386/sigaction.c b/libc/sysdeps/linux/i386/sigaction.c -index a6a22de..1b787a6 100644 ---- a/libc/sysdeps/linux/i386/sigaction.c -+++ b/libc/sysdeps/linux/i386/sigaction.c -@@ -120,6 +120,9 @@ libc_hidden_weak(sigaction) - # define RESTORE2(name, syscall) \ - __asm__ ( \ - ".text\n" \ -+ ".align 8\n" \ -+ " nop\n" \ -+ ".align 16\n" \ - "__" #name ":\n" \ - " movl $" #syscall ", %eax\n" \ - " int $0x80\n" \ -@@ -133,6 +136,7 @@ RESTORE(restore_rt, __NR_rt_sigreturn) - # define RESTORE2(name, syscall) \ - __asm__ ( \ - ".text\n" \ -+ ".align 8\n" \ - "__" #name ":\n" \ - " popl %eax\n" \ - " movl $" #syscall ", %eax\n" \ --- -1.7.8.4 - |