diff options
author | Andre McCurdy <armccurdy@gmail.com> | 2018-05-16 18:03:53 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-05-29 21:07:12 +0100 |
commit | 568a1f74913d7524650015297648f51f85bc2809 (patch) | |
tree | a4638fbeac600b4615ee51e35cb1818864fccbc5 /meta/recipes-devtools/strace/strace | |
parent | 0781c9fe7b2c31a208b63d344b5acf28a442f408 (diff) | |
download | openembedded-core-contrib-568a1f74913d7524650015297648f51f85bc2809.tar.gz |
strace: fix ARM Thumb build with frame pointers enabled
Replace the previous (incomplete) workaround with better solution
backported from upstream.
(From OE-Core rev: b038a6e418d723a0a413219e9882cdd7f3804625)
Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/strace/strace')
-rw-r--r-- | meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch b/meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch new file mode 100644 index 0000000000..8584291ba8 --- /dev/null +++ b/meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch @@ -0,0 +1,74 @@ +From 0c75ebaad09d6d3f2395dfe6160904af883dd0d9 Mon Sep 17 00:00:00 2001 +From: Andre McCurdy <armccurdy@gmail.com> +Date: Tue, 15 May 2018 15:34:39 -0700 +Subject: [PATCH] linux/arm/raw_syscall.h: avoid r7 specified register + variables with Thumb + +If Thumb code is being generated and frame pointers are enabled, the +Thumb frame pointer in r7 clashes with any local variable which may +need to be assigned to r7 (e.g. the syscall NR when making a raw +syscall). + +With gcc, the double use of r7 results in a build error, e.g. + + strace-4.22/tests/inject-nf.c:86:1: error: r7 cannot be used in asm here + +With clang, the double use of r7 can result in the compiler silently +generating broken code which crashes at run time due to frame pointer +corruption: + + https://bugs.llvm.org/show_bug.cgi?id=34165 + +In most cases the problem isn't visible as frame pointers will be +disabled automatically due to optimisation level. However to handle +cases where frame pointers are enabled (e.g. when CFLAGS etc are set +to support a debug build, etc) provide a version of raw_syscall_0 +which manually saves and restores the frame pointer value in r7 +to a temporary register before setting up the syscall NR in r7 +and invoking the syscall. + +* linux/arm/raw_syscall.h (raw_syscall_0) [__thumb__]: Provide +an alternative version. + +Upstream-Status: Backport + +Signed-off-by: Andre McCurdy <armccurdy@gmail.com> +--- + linux/arm/raw_syscall.h | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/linux/arm/raw_syscall.h b/linux/arm/raw_syscall.h +index 69c7e23..ec534ec 100644 +--- a/linux/arm/raw_syscall.h ++++ b/linux/arm/raw_syscall.h +@@ -36,12 +36,27 @@ static inline kernel_ulong_t + raw_syscall_0(const kernel_ulong_t nr, kernel_ulong_t *err) + { + *err = 0; ++ ++#ifdef __thumb__ /* && FRAME_POINTERS_ENABLED */ ++ ++ register kernel_ulong_t rt; ++ register kernel_ulong_t r0 __asm__("r0"); ++ __asm__ __volatile__("mov %1,r7; mov r7,%2; swi 0x0; mov r7,%1" ++ : "=r"(r0), "=&r"(rt) ++ : "r"(nr) ++ : "memory"); ++ ++#else ++ + register kernel_ulong_t r7 __asm__("r7") = nr; + register kernel_ulong_t r0 __asm__("r0"); + __asm__ __volatile__("swi 0x0" + : "=r"(r0) + : "r"(r7) + : "memory"); ++ ++#endif ++ + return r0; + } + # define raw_syscall_0 raw_syscall_0 +-- +1.9.1 + |