Re: [LTP] [PATCH] kvm: Fix Nix build failure by moving -fno-stack-protector to CFLAGS

Petr Vorel
2023-09-22T07:57:12Z

Hi all,

[I Cc Fabrice and Buildroot ML]

On Tue, 19 Sept 2023 at 14:51, Martin Doucha <mdoucha@suse.cz> wrote:
>
> Hi,
> pvorel should have a look whether it doesn't break the other systems
> where -fno-stack-protector is needed, but otherwise:

Yesterday night I tested the current LTP master with ./utils/test-pkg. Some
Bootlin toolchains keep failing (bootlin-x86-64-musl, bootlin-x86-64-glibc):

CC testcases/kernel/kvm/lib_x86.o
gbr-test-pkg/bootlin-x86-64-musl/host/opt/ext-toolchain/bin/../lib/gcc/x86_64-buildroot-linux-musl/11.3.0/../../../../x86_64-buildroot-linux-musl/bin/ld:
lib_x86.o: in function `kvm_init_guest_vmcb':
lib_x86.c:(.text+0x7c8): undefined reference to `__stack_chk_fail'
collect2: error: ld returned 1 exit status

Problems are only on x86_64, other archs (aarch64, riscv64, mipsel, amv7r)
are OK.

NOTE: In Buildroot LTP is currently disabled when musl is used due 5.11
headers requirement for musl toolchain [1], but I temporarily remove this
requirement to get more testing. That's why there are also musl results.

It looks like this patch actually fixes it, thus:
Acked-by: Petr Vorel <pvorel@suse.cz>

There are even more kvm test related results [2], but I suspect they are more
related to the Buildroot toolchain than LTP itself:

CC testcases/kernel/kvm/lib_guest.o
bootstrap_x86_64.S: Assembler messages:
bootstrap_x86_64.S:16: Error: unknown pseudo-op: `.code16'
bootstrap_x86_64.S:19: Error: unknown mnemonic `cli' -- `cli'
bootstrap_x86_64.S:21: Error: unknown mnemonic `lgdt' -- `lgdt kvm_gdt32_desc'
bootstrap_x86_64.S:23: Error: operand 1 must be an integer register --
`mov $0x11,%eax'
bootstrap_x86_64.S:24: Error: operand 1 must be an integer register --
`mov %eax,%cr0'
bootstrap_x86_64.S:26: Error: unknown mnemonic `jmp' -- `jmp
$3*8,$protected_mode_entry'
bootstrap_x86_64.S:28: Error: unknown pseudo-op: `.code32'

Kind regards,
Petr

[1] https://git.busybox.net/buildroot/commit/?id=5e1c238b7202c3b04d9eab94e429c5580c77444b
[2] http://autobuild.buildroot.net/results/6fe953a989a83da67e7ec228ab1668998928ad11/build-end.log
>
> Reviewed-by: Martin Doucha <mdoucha@suse.cz>
>
> On 19. 09. 23 10:38, Richard Palethorpe wrote:
> > Nix (and by extension NixOS) uses a binutils wrapper of some sort to
> > allow switching between toolchains. This seems to be causing a problem
> > for the KVM tests although it may not be unique to Nix.
> >
> > gcc -I/home/rich/kernel/ltp/testcases/kernel/kvm/include -DCOMPILE_PAYLOAD -ffreestanding -O2 -Wall -fno-asynchronous-unwind-tables -mno-mmx\
> > -mno-sse -fno-pie -c -o lib_guest.o lib_guest.c
> > as -c -o bootstrap_x86_64.o bootstrap_x86_64.S
> > gcc -I/home/rich/kernel/ltp/testcases/kernel/kvm/include -DCOMPILE_PAYLOAD -ffreestanding -O2 -Wall -fno-asynchronous-unwind-tables -mno-mmx\
> > -mno-sse -fno-pie -c -o lib_x86.o lib_x86.c
> > gcc -I/home/rich/kernel/ltp/testcases/kernel/kvm/include -I../../../include -I../../../include -I../../../include/old/ -DCOMPILE_PAYLOAD -ff\
> > reestanding -O2 -Wall -fno-asynchronous-unwind-tables -mno-mmx -mno-sse -fno-pie -nostdlib -Wl,--build-id=none -fno-stack-protector -z noexe\
> > cstack -no-pie -Wl,-T/home/rich/kernel/ltp/testcases/kernel/kvm/linker/x86_64.lds -o kvm_pagefault01-payload.elf kvm_pagefault01.c lib_guest\
> > .o bootstrap_x86_64.o lib_x86.o
> > /nix/store/inq79dwl8sz1ygmfbgsmg77i5cwmdjpz-binutils-2.40/bin/ld: lib_x86.o: in function `kvm_init_guest_vmcb':
> > lib_x86.c:(.text+0x7b3): undefined reference to `__stack_chk_fail'
> > collect2: error: ld returned 1 exit status
> > make: *** [Makefile:58: kvm_pagefault01-payload.o] Error 1
> >
> > __stack_chk_fail is added to lib_x86.o which means that
> > -fstack-protector somehow gets added to the compilation of lib_x86.o.
> >
> > Swapping -fno-stack-protector from the LD flags to the C flags ensures
> > it is disabled when compiling lib_x86.o.
> >
> > Signed-off-by: Richard Palethorpe <rpalethorpe@suse.com>
> > ---
> > testcases/kernel/kvm/Makefile | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/testcases/kernel/kvm/Makefile b/testcases/kernel/kvm/Makefile
> > index d9eb10728..ce4a5ede2 100644
> > --- a/testcases/kernel/kvm/Makefile
> > +++ b/testcases/kernel/kvm/Makefile
> > @@ -8,8 +8,8 @@ include $(top_srcdir)/include/mk/testcases.mk
> > ASFLAGS =
> > CPPFLAGS += -I$(abs_srcdir)/include
> > GUEST_CPPFLAGS = $(CPPFLAGS) -DCOMPILE_PAYLOAD
> > -GUEST_CFLAGS = -ffreestanding -O2 -Wall -fno-asynchronous-unwind-tables -mno-mmx -mno-sse
> > -GUEST_LDFLAGS = -nostdlib -Wl,--build-id=none -fno-stack-protector -z noexecstack
> > +GUEST_CFLAGS = -ffreestanding -O2 -Wall -fno-asynchronous-unwind-tables -fno-stack-protector -mno-mmx -mno-sse
> > +GUEST_LDFLAGS = -nostdlib -Wl,--build-id=none -z noexecstack
> > GUEST_LDLIBS =
> > KVM_LD ?= $(LD)
> >
>
> --
> Martin Doucha mdoucha@suse.cz
> SW Quality Engineer
> SUSE LINUX, s.r.o.
> CORSO IIa
> Krizikova 148/34
> 186 00 Prague 8
> Czech Republic
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp