[PATCH] x86/boot/startup: Disable LTO

Nathan Chancellor posted 1 patch 9 months, 4 weeks ago
arch/x86/boot/startup/Makefile | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
[PATCH] x86/boot/startup: Disable LTO
Posted by Nathan Chancellor 9 months, 4 weeks ago
When building with CONFIG_LTO_CLANG, there is an error in the x86 boot
startup code because it builds with a different code model than the rest
of the kernel:

  ld.lld: error: Function Import: link error: linking module flags 'Code Model': IDs have conflicting values: 'i32 2' from vmlinux.a(head64.o at 1302448), and 'i32 1' from vmlinux.a(map_kernel.o at 1314208)
  ld.lld: error: Function Import: link error: linking module flags 'Code Model': IDs have conflicting values: 'i32 2' from vmlinux.a(common.o at 1306108), and 'i32 1' from vmlinux.a(gdt_idt.o at 1314148)

As this directory is for code that only runs during early system
initialization, LTO is not very important, so filter out the LTO flags
from KBUILD_CFLAGS for arch/x86/boot/startup to resolve the build error.

Fixes: 4cecebf200ef ("x86/boot: Move the early GDT/IDT setup code into startup/")
Reported-by: Linux Kernel Functional Testing <lkft@linaro.org>
Closes: https://lore.kernel.org/CA+G9fYvnun+bhYgtt425LWxzOmj+8Jf3ruKeYxQSx-F6U7aisg@mail.gmail.com/
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
 arch/x86/boot/startup/Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/x86/boot/startup/Makefile b/arch/x86/boot/startup/Makefile
index ccdfc42a4d59..bb7c826e586c 100644
--- a/arch/x86/boot/startup/Makefile
+++ b/arch/x86/boot/startup/Makefile
@@ -7,8 +7,9 @@ KBUILD_CFLAGS		+= -D__DISABLE_EXPORTS -mcmodel=small -fPIC \
 			   -fno-stack-protector -D__NO_FORTIFY \
 			   -include $(srctree)/include/linux/hidden.h
 
-# disable ftrace hooks
+# disable ftrace hooks and LTO
 KBUILD_CFLAGS	:= $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS))
+KBUILD_CFLAGS	:= $(filter-out $(CC_FLAGS_LTO),$(KBUILD_CFLAGS))
 KASAN_SANITIZE	:= n
 KCSAN_SANITIZE	:= n
 KMSAN_SANITIZE	:= n

---
base-commit: 9287216a0c8f7bf7b485e18ad71584b434b59bb6
change-id: 20250414-x86-boot-startup-lto-error-26e0825706a3

Best regards,
-- 
Nathan Chancellor <nathan@kernel.org>
Re: [PATCH] x86/boot/startup: Disable LTO
Posted by Ard Biesheuvel 9 months, 4 weeks ago
On Mon, 14 Apr 2025 at 21:26, Nathan Chancellor <nathan@kernel.org> wrote:
>
> When building with CONFIG_LTO_CLANG, there is an error in the x86 boot
> startup code because it builds with a different code model than the rest
> of the kernel:
>
>   ld.lld: error: Function Import: link error: linking module flags 'Code Model': IDs have conflicting values: 'i32 2' from vmlinux.a(head64.o at 1302448), and 'i32 1' from vmlinux.a(map_kernel.o at 1314208)
>   ld.lld: error: Function Import: link error: linking module flags 'Code Model': IDs have conflicting values: 'i32 2' from vmlinux.a(common.o at 1306108), and 'i32 1' from vmlinux.a(gdt_idt.o at 1314148)
>
> As this directory is for code that only runs during early system
> initialization, LTO is not very important, so filter out the LTO flags
> from KBUILD_CFLAGS for arch/x86/boot/startup to resolve the build error.
>
> Fixes: 4cecebf200ef ("x86/boot: Move the early GDT/IDT setup code into startup/")
> Reported-by: Linux Kernel Functional Testing <lkft@linaro.org>
> Closes: https://lore.kernel.org/CA+G9fYvnun+bhYgtt425LWxzOmj+8Jf3ruKeYxQSx-F6U7aisg@mail.gmail.com/
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
>  arch/x86/boot/startup/Makefile | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>

Thanks for the fix

Acked-by: Ard Biesheuvel <ardb@kernel.org>


> diff --git a/arch/x86/boot/startup/Makefile b/arch/x86/boot/startup/Makefile
> index ccdfc42a4d59..bb7c826e586c 100644
> --- a/arch/x86/boot/startup/Makefile
> +++ b/arch/x86/boot/startup/Makefile
> @@ -7,8 +7,9 @@ KBUILD_CFLAGS           += -D__DISABLE_EXPORTS -mcmodel=small -fPIC \
>                            -fno-stack-protector -D__NO_FORTIFY \
>                            -include $(srctree)/include/linux/hidden.h
>
> -# disable ftrace hooks
> +# disable ftrace hooks and LTO
>  KBUILD_CFLAGS  := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS))
> +KBUILD_CFLAGS  := $(filter-out $(CC_FLAGS_LTO),$(KBUILD_CFLAGS))
>  KASAN_SANITIZE := n
>  KCSAN_SANITIZE := n
>  KMSAN_SANITIZE := n
>
> ---
> base-commit: 9287216a0c8f7bf7b485e18ad71584b434b59bb6
> change-id: 20250414-x86-boot-startup-lto-error-26e0825706a3
>
> Best regards,
> --
> Nathan Chancellor <nathan@kernel.org>
>