Investigated this further. The problem is a text relocation created by the hash_md5_sha256_x86-32_shaNI.S file. When compiling BusyBox with LDFLAGS=-Wl,-z,text one is warned about the following relocation by gcc:
/usr/lib/gcc/i586-alpine-linux-musl/12.2.1/../../../../i586-alpine-linux-musl/bin/ld: libbb/lib.a(hash_md5_sha_x86-32_shaNI.o): warning: relocation in read-only section `.text.sha1_process_block64_shaNI' /usr/lib/gcc/i586-alpine-linux-musl/12.2.1/../../../../i586-alpine-linux-musl/bin/ld: read-only segment has dynamic relocations The Linux Kernel, from which the assembly was copied, does addressing relative to the %pic register to avoid this relocation it seems [1]: movdqa PSHUFFLE_BYTE_FLIP_MASK(%rip), SHUF_MASK However, the %rip register is AFAIK not available for i386 and since I am personally not an x86 wizard I have no idea how to best rewrite this code in a way that it doesn't require dynamic relocations. [1]: https://github.com/torvalds/linux/blob/94a855111ed9106971ca2617c5d075269e6aefde/arch/x86/crypto/sha1_ni_asm.S#L112 Sören Tempel <soe...@soeren-tempel.net> wrote: > Hello, > > Natanael Copa <nc...@alpinelinux.org> wrote: > > 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) > > ); > > } > > Unfortunately, this does not fix the segfault. Since the segfault occurs > in musl's dynamic loader I also don't think that this code is > reached/executed. Instead, this seems to be a problem with the symbols > of the provided assembly file. > > I am currently debugging this on a96ccbefe417aaac6a2ce59c788e01fc0f83902f. > If I remove the PSHUFFLE_BYTE_FLIP_MASK definition (and the instruction > using it) in hash_md5_sha256_x86-32_shaNI.S from the checkout for this > commit then the segfault doesn't occur. So this does definitely seem to > be a problem with the hash_md5_sha256_x86-32_shaNI.S assembly file... > > Greetings, > Sören > _______________________________________________ > 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