On Thu, 05 Jan 2023 21:39:09 +0100 Sören Tempel <soe...@soeren-tempel.net> wrote:
> Hi, > > I am the maintainer of the BusyBox package for Alpine Linux. While > upgrading that package from 1.35.0 to 1.36.0 I noticed a segfault > on Alpine x86, on all other architectures BusyBox 1.36.0 builds > fine and passes the tests. On x86 though it segfaults with any > command-line argument, for example: > > $ make defconfig > $ make > $ gdb --args ./busybox_unstripped > (gdb) run > Starting program: > /home/buildozer/aports/main/busybox/src/build-dynamic/busybox_unstripped > > Program received signal SIGSEGV, Segmentation fault. > 0xf7fc24e0 in do_relocs (dso=dso@entry=0xf7ffca20 <app>, > rel=0x565578e4, rel_size=8712, stride=2) at ldso/dynlink.c:471 > 471 ldso/dynlink.c: No such file or directory. > (gdb) bt > #0 0xf7fc24e0 in do_relocs (dso=dso@entry=0xf7ffca20 <app>, > rel=0x565578e4, rel_size=8712, stride=2) at ldso/dynlink.c:471 > #1 0xf7fc263f in reloc_all (p=p@entry=0xf7ffca20 <app>) at > ldso/dynlink.c:1375 > #2 0xf7fc473e in __dls3 (sp=0xffffdcf0, auxv=0xffffdd3c) at > ldso/dynlink.c:1974 > #3 0xf7fc3eab in __dls2 (base=<optimized out>, sp=<optimized out>) at > ldso/dynlink.c:1719 > #4 0xf7fc19c9 in _dlstart () from /lib/ld-musl-i386.so.1 > > Looking at the backtrace, it seems that it segfaults in musl's dynamic > loader. Since BusyBox 1.35.0 worked fine on x86 I bisected this and it > turns out that this is a regression introduced in commit > a96ccbefe417aaac6a2ce59c788e01fc0f83902f [1]. If I disable SHA/MD5 > hardware acceleration then BusyBox 1.36.0 builds fine and passes all > tests on Alpine Linux x86. > > Any idea what particular part of the referenced commit might be causing this? I believe this happens due to ebx is clobbered which is needed for position independent code (PIC) on 32 bit x86. I also wonder if the asm needs to be volatile. Try something like this: diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c index 880ffab01..d2351d3e6 100644 --- a/libbb/hash_md5_sha.c +++ b/libbb/hash_md5_sha.c @@ -17,8 +17,11 @@ # if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) static void cpuid(unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx) { - asm ("cpuid" - : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) + asm volatile ( + "mov %%ebx, %%esi;" /* save %ebx PIC register */ + "cpuid;" + "xchg %%ebx, %%esi;" + : "=a"(*eax), "=S"(*ebx), "=c"(*ecx), "=d"(*edx) : "0"(*eax), "1"(*ebx), "2"(*ecx), "3"(*edx) ); } > > Greetings, > Sören > > [1]: > https://git.busybox.net/busybox/commit/?id=a96ccbefe417aaac6a2ce59c788e01fc0f83902f > _______________________________________________ busybox mailing list > busybox@busybox.net > http://lists.busybox.net/mailman/listinfo/busybox _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox