From d24837beb4005f7a006a31aed64fec9bc3fffb23 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Wed, 12 Jan 2022 10:57:55 -0800 Subject: busybox: Fix 1.35 build with clang Signed-off-by: Ross Burton Signed-off-by: Khem Raj --- ...r_to_globals-and-bb_errno-to-be-non-const.patch | 172 --------------------- .../0001-apply-const-trick-to-ptr_to_globals.patch | 48 ++++++ recipes-core/busybox/busybox/clang.cfg | 1 + recipes-core/busybox/busybox_1.34%.bbappend | 9 -- recipes-core/busybox/busybox_1.35%.bbappend | 10 ++ 5 files changed, 59 insertions(+), 181 deletions(-) delete mode 100644 recipes-core/busybox/busybox/0001-Turn-ptr_to_globals-and-bb_errno-to-be-non-const.patch create mode 100644 recipes-core/busybox/busybox/0001-apply-const-trick-to-ptr_to_globals.patch create mode 100644 recipes-core/busybox/busybox/clang.cfg delete mode 100644 recipes-core/busybox/busybox_1.34%.bbappend create mode 100644 recipes-core/busybox/busybox_1.35%.bbappend (limited to 'recipes-core') diff --git a/recipes-core/busybox/busybox/0001-Turn-ptr_to_globals-and-bb_errno-to-be-non-const.patch b/recipes-core/busybox/busybox/0001-Turn-ptr_to_globals-and-bb_errno-to-be-non-const.patch deleted file mode 100644 index 468a32d..0000000 --- a/recipes-core/busybox/busybox/0001-Turn-ptr_to_globals-and-bb_errno-to-be-non-const.patch +++ /dev/null @@ -1,172 +0,0 @@ -From d941b59087d34cb93053b638c066bf080122e7bb Mon Sep 17 00:00:00 2001 -From: Khem Raj -Date: Wed, 16 Jan 2019 22:39:24 -0800 -Subject: [PATCH] Turn ptr_to_globals and bb_errno to be non const - -writing to a const variable is undefined behavior - -This is undefined as per (C99 6.7.3 paragraph 5) see [1] - -errno and ptr_to_globals is written to in code, this fails with -segfaults when compiled with clang - -unsigned FAST_FUNC bb_strtou(const char *arg, char **endp, int base) -{ - unsigned long v; - char *endptr; - - if (!endp) endp = &endptr; - *endp = (char*) arg; - - if (!isalnum(arg[0])) return ret_ERANGE(); - errno = 0; - v = strtoul(arg, endp, base); - if (v > UINT_MAX) return ret_ERANGE(); - return handle_errors(v, endp); - } - -without 'const' ( working code ) - -Dump of assembler code for function bb_strtou: - 0x0000555555568298 <+0>: push %rbx - 0x0000555555568299 <+1>: sub $0x10,%rsp - 0x000055555556829d <+5>: test %rsi,%rsi - 0x00005555555682a0 <+8>: lea 0x8(%rsp),%rbx - 0x00005555555682a5 <+13>: cmovne %rsi,%rbx - 0x00005555555682a9 <+17>: mov %rdi,(%rbx) - 0x00005555555682ac <+20>: mov (%rdi),%al - 0x00005555555682ae <+22>: lea -0x30(%rax),%ecx - 0x00005555555682b1 <+25>: cmp $0xa,%cl - 0x00005555555682b4 <+28>: jb 0x5555555682be - 0x00005555555682b6 <+30>: or $0x20,%al - 0x00005555555682b8 <+32>: add $0x9f,%al - 0x00005555555682ba <+34>: cmp $0x1a,%al - 0x00005555555682bc <+36>: jae 0x5555555682dc - 0x00005555555682be <+38>: mov 0x107da3(%rip),%rax # 0x555555670068 -=> 0x00005555555682c5 <+45>: movl $0x0,(%rax) - 0x00005555555682cb <+51>: mov %rbx,%rsi - 0x00005555555682ce <+54>: callq 0x555555564310 - 0x00005555555682d3 <+59>: mov %rax,%rcx - 0x00005555555682d6 <+62>: shr $0x20,%rcx - 0x00005555555682da <+66>: je 0x5555555682f0 - 0x00005555555682dc <+68>: mov 0x107d85(%rip),%rax # 0x555555670068 - 0x00005555555682e3 <+75>: movl $0x22,(%rax) - 0x00005555555682e9 <+81>: mov $0xffffffff,%eax - 0x00005555555682ee <+86>: jmp 0x5555555682fb - 0x00005555555682f0 <+88>: mov %rax,%rdi - 0x00005555555682f3 <+91>: mov %rbx,%rsi - 0x00005555555682f6 <+94>: callq 0x5555555681e8 - 0x00005555555682fb <+99>: add $0x10,%rsp - 0x00005555555682ff <+103>: pop %rbx - 0x0000555555568300 <+104>: retq - -here address of bb_errno is valid rax = 0x7ffff7cac6c0 - -with 'const' ( non-working code ) - -Dump of assembler code for function bb_strtou: - 0x00005555555682a4 <+0>: push %r14 - 0x00005555555682a6 <+2>: push %rbx - 0x00005555555682a7 <+3>: push %rax - 0x00005555555682a8 <+4>: test %rsi,%rsi - 0x00005555555682ab <+7>: mov %rsp,%rbx - 0x00005555555682ae <+10>: cmovne %rsi,%rbx - 0x00005555555682b2 <+14>: mov %rdi,(%rbx) - 0x00005555555682b5 <+17>: mov (%rdi),%al - 0x00005555555682b7 <+19>: lea -0x30(%rax),%ecx - 0x00005555555682ba <+22>: cmp $0xa,%cl - 0x00005555555682bd <+25>: jb 0x5555555682d6 - 0x00005555555682bf <+27>: or $0x20,%al - 0x00005555555682c1 <+29>: add $0x9f,%al - 0x00005555555682c3 <+31>: cmp $0x1a,%al - 0x00005555555682c5 <+33>: jb 0x5555555682d6 - 0x00005555555682c7 <+35>: mov 0x107d9a(%rip),%rax # 0x555555670068 - 0x00005555555682ce <+42>: movl $0x22,(%rax) - 0x00005555555682d4 <+48>: jmp 0x5555555682fc - 0x00005555555682d6 <+50>: mov 0x107d8b(%rip),%r14 # 0x555555670068 -=> 0x00005555555682dd <+57>: movl $0x0,(%r14) - 0x00005555555682e4 <+64>: mov %rbx,%rsi - 0x00005555555682e7 <+67>: callq 0x555555564300 - 0x00005555555682ec <+72>: mov %rax,%rcx - 0x00005555555682ef <+75>: shr $0x20,%rcx - 0x00005555555682f3 <+79>: je 0x555555568303 - 0x00005555555682f5 <+81>: movl $0x22,(%r14) - 0x00005555555682fc <+88>: mov $0xffffffff,%eax - 0x0000555555568301 <+93>: jmp 0x55555556830e - 0x0000555555568303 <+95>: mov %rax,%rdi - 0x0000555555568306 <+98>: mov %rbx,%rsi - 0x0000555555568309 <+101>: callq 0x5555555681f4 - 0x000055555556830e <+106>: add $0x8,%rsp - 0x0000555555568312 <+110>: pop %rbx - 0x0000555555568313 <+111>: pop %r14 - 0x0000555555568315 <+113>: retq - -r14 is 0x0 and writing to this ofcourse ends up in segfault - -[1] https://bugs.llvm.org/show_bug.cgi?id=39919 - -Signed-off-by: Khem Raj ---- - coreutils/test.c | 2 +- - include/libbb.h | 4 ++-- - libbb/lineedit.c | 2 +- - shell/ash.c | 5 ++--- - 4 files changed, 6 insertions(+), 7 deletions(-) - ---- a/coreutils/test.c -+++ b/coreutils/test.c -@@ -435,7 +435,7 @@ struct test_statics { - }; - - /* See test_ptr_hack.c */ --extern struct test_statics *const test_ptr_to_statics; -+extern struct test_statics *test_ptr_to_statics; - - #define S (*test_ptr_to_statics) - #define args (S.args ) ---- a/include/libbb.h -+++ b/include/libbb.h -@@ -342,7 +342,7 @@ struct BUG_off_t_size_is_misdetected { - #if defined(errno) - /* If errno is a define, assume it's "define errno (*__errno_location())" - * and we will cache it's result in this variable */ --extern int *const bb_errno; -+extern int *bb_errno; - #undef errno - #define errno (*bb_errno) - #define bb_cached_errno_ptr 1 -@@ -2228,7 +2228,7 @@ struct globals; - /* '*const' ptr makes gcc optimize code much better. - * Magic prevents ptr_to_globals from going into rodata. - * If you want to assign a value, use SET_PTR_TO_GLOBALS(x) */ --extern struct globals *const ptr_to_globals; -+extern struct globals *ptr_to_globals; - - #if defined(__clang_major__) && __clang_major__ >= 9 - /* Clang/llvm drops assignment to "constant" storage. Silently. ---- a/libbb/lineedit.c -+++ b/libbb/lineedit.c -@@ -192,7 +192,7 @@ struct lineedit_statics { - }; - - /* See lineedit_ptr_hack.c */ --extern struct lineedit_statics *const lineedit_ptr_to_statics; -+extern struct lineedit_statics * lineedit_ptr_to_statics; - - #define S (*lineedit_ptr_to_statics) - #define state (S.state ) ---- a/shell/ash.c -+++ b/shell/ash.c -@@ -300,10 +300,9 @@ typedef long arith_t; - * set "-DBB_GLOBAL_CONST=''" in CONFIG_EXTRA_CFLAGS to disable - * this optimization. - */ --#ifndef BB_GLOBAL_CONST --# define BB_GLOBAL_CONST const --#endif - -+#undef BB_GLOBAL_CONST -+#define BB_GLOBAL_CONST - - /* ============ Hash table sizes. Configurable. */ - diff --git a/recipes-core/busybox/busybox/0001-apply-const-trick-to-ptr_to_globals.patch b/recipes-core/busybox/busybox/0001-apply-const-trick-to-ptr_to_globals.patch new file mode 100644 index 0000000..84b61a2 --- /dev/null +++ b/recipes-core/busybox/busybox/0001-apply-const-trick-to-ptr_to_globals.patch @@ -0,0 +1,48 @@ +From d3fbf09787b9dd8a061b541cd931ffbf63e4d610 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 12 Jan 2022 10:48:36 -0800 +Subject: [PATCH] apply const trick to ptr_to_globals + +This was missing in the previous attempt to fix it via [1] + +This helps fix segfaults when compiling with clang ( seen on riscv64 ) + +[ 452.428349] less[270]: unhandled signal 11 code 0x1 at 0x000000000000000c in busybox.nosuid[2ab7491000+ba000] +[ 452.430246] CPU: 3 PID: 270 Comm: less Not tainted 5.15.13-yocto-standard #1 +[ 452.431323] Hardware name: riscv-virtio,qemu (DT) +[ 452.431925] epc : 0000002ab74a19ee ra : 0000002ab74a19dc sp : 0000003fec6ec980 +[ 452.432725] gp : 0000002ab754dcb0 tp : 0000003f88783800 t0 : 0000003f8878d4a0 +[ 452.433744] t1 : 0000002ab749b00c t2 : 0000000000000000 s0 : 0000003fec6ecc38 +[ 452.434732] s1 : 000000000000004c a0 : 00000000ffffffff a1 : 0000002ab754dde0 +[ 452.435861] a2 : 0000000000000000 a3 : 0000000000000100 a4 : 0000002ab754f3a0 +[ 452.436787] a5 : 0000002ab754f3a0 a6 : 0000000000000000 a7 : 0000002ab754f2a0 +[ 452.437974] s2 : 0000000000000002 s3 : 0000002ab754b6c8 s4 : 0000002ab749b60e +[ 452.438781] s5 : 0000000000000000 s6 : 0000002ab754b6c8 s7 : 0000003f88943060 +[ 452.439723] s8 : 0000003f88944050 s9 : 0000002ad8502e88 s10: 0000002ad8502de8 +[ 452.440538] s11: 0000000000000014 t3 : 0000003f887fceb6 t4 : 0000003f8893af0c +[ 452.441438] t5 : 0000000000000000 t6 : 0000003f88923000 + +[1] https://git.busybox.net/busybox/commit/?id=1f925038a + +Upstream-Status: Submitted [http://lists.busybox.net/pipermail/busybox/2022-January/089413.html] +Signed-off-by: Khem Raj +--- + include/libbb.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/libbb.h b/include/libbb.h +index a487828..7b76335 100644 +--- a/include/libbb.h ++++ b/include/libbb.h +@@ -2281,7 +2281,7 @@ struct globals; + /* '*const' ptr makes gcc optimize code much better. + * Magic prevents ptr_to_globals from going into rodata. + * If you want to assign a value, use SET_PTR_TO_GLOBALS(x) */ +-extern struct globals *const ptr_to_globals; ++extern struct globals *BB_GLOBAL_CONST ptr_to_globals; + + #define barrier() asm volatile ("":::"memory") + +-- +2.34.1 + diff --git a/recipes-core/busybox/busybox/clang.cfg b/recipes-core/busybox/busybox/clang.cfg new file mode 100644 index 0000000..450fa7e --- /dev/null +++ b/recipes-core/busybox/busybox/clang.cfg @@ -0,0 +1 @@ +CONFIG_EXTRA_CFLAGS="-DBB_GLOBAL_CONST=''" diff --git a/recipes-core/busybox/busybox_1.34%.bbappend b/recipes-core/busybox/busybox_1.34%.bbappend deleted file mode 100644 index 2c0af5e..0000000 --- a/recipes-core/busybox/busybox_1.34%.bbappend +++ /dev/null @@ -1,9 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" -SRC_URI:append:toolchain-clang = "\ - file://0001-Turn-ptr_to_globals-and-bb_errno-to-be-non-const.patch \ -" - -# networking/tls_pstm_sqr_comba.c:514:4: error: inline assembly requires more registers than available -# SQRADD2(*tmpx++, *tmpy--); -# ^ -TOOLCHAIN:x86 = "gcc" diff --git a/recipes-core/busybox/busybox_1.35%.bbappend b/recipes-core/busybox/busybox_1.35%.bbappend new file mode 100644 index 0000000..fbe6279 --- /dev/null +++ b/recipes-core/busybox/busybox_1.35%.bbappend @@ -0,0 +1,10 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +SRC_URI:append:toolchain-clang = "\ + file://0001-apply-const-trick-to-ptr_to_globals.patch \ + file://clang.cfg" + +# networking/tls_pstm_sqr_comba.c:514:4: error: inline assembly requires more registers than available +# SQRADD2(*tmpx++, *tmpy--); +# ^ +TOOLCHAIN:x86 = "gcc" -- cgit v1.2.3-54-g00ecf