* [PATCH v12 0/3] kbuild: distributed build support for Clang ThinLTO
@ 2026-05-29 18:53 xur
2026-05-29 18:53 ` [PATCH v12 1/3] kbuild: move vmlinux.a build rule to scripts/Makefile.vmlinux_a xur
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: xur @ 2026-05-29 18:53 UTC (permalink / raw)
To: Masahiro Yamada, Nathan Chancellor, Nicolas Schier,
Nick Desaulniers, Yonghong Song, Bill Wendling, Justin Stitt,
Miguel Ojeda, Thomas Gleixner, Alice Ryhl, Sami Tolvanen,
Mike Rapoport (Microsoft), Rafael Aquini, Michael Ellerman,
Stafford Horne, Christophe Leroy, Piotr Gorski, Rong Xu,
Venkat Rao Bagalkote, Miguel Ojeda, Teresa Johnson
Cc: linux-kernel, linux-kbuild, llvm
From: Rong Xu <xur@google.com>
ChangeLog:
V12: Fixed an build error reported by Nathan Chancellor:
Reverted to v10 shell script based approach to get saved_c_flags.
V11: Integrated feedback from Sashiko (Nathan Chancellor):
(1) Included modkern_cflags within the saved _c_flags.
(2) Replaced the shell command with $(saved_c_flags_$(<)).
(3) Refined the file matching for ar_vmlinux.a.
V10: Fixed a minor build error in v9 and added comments.
V9: Fixed a minor build error.
V8: Disabled -always-rename-promoted-locals=false for the distrubute
mode, based on Yonghong and Nathan's comments.
V7: (1) Resolved a conflict by rebasing to kbuild/kbuild-next-unstable.
(2) Separated the '--thin' to 'T' change into its own patch to
preserve Masahiro's original version.
V6: Change '--thin' back to 'T' in Makefile.vmlinux_a to fix
reported the build error from old ar.
V5: Handle single quote escaping in echo _c_flags to fix
Piotr Gorski's reported error.
V4: This is based on the reimplementation provided by Masahiro Yamada
on May 26. The difference is that this version now saves the compiler
flags (_c_flags) from the Front-End (FE) compilation and re-uses them
for the subsequent Back-End (BE) compilation.
Rong Xu (3):
kbuild: move vmlinux.a build rule to scripts/Makefile.vmlinux_a
kbuild: change --thin back to 'T' in $(AR)
kbuild: distributed build support for Clang ThinLTO
.gitignore | 2 +
Makefile | 30 +++++++-------
arch/Kconfig | 19 +++++++++
scripts/Makefile.lib | 8 ++++
scripts/Makefile.thinlto | 40 ++++++++++++++++++
scripts/Makefile.vmlinux_a | 83 ++++++++++++++++++++++++++++++++++++++
scripts/mod/modpost.c | 15 +++++--
7 files changed, 180 insertions(+), 17 deletions(-)
create mode 100644 scripts/Makefile.thinlto
create mode 100644 scripts/Makefile.vmlinux_a
base-commit: 2c31897a17e55a6da529b4e797e98c6febc60fd2
--
2.54.0.823.g6e5bcc1fc9-goog
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v12 1/3] kbuild: move vmlinux.a build rule to scripts/Makefile.vmlinux_a
2026-05-29 18:53 [PATCH v12 0/3] kbuild: distributed build support for Clang ThinLTO xur
@ 2026-05-29 18:53 ` xur
2026-05-29 18:53 ` [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR) xur
2026-05-29 18:53 ` [PATCH v12 3/3] kbuild: distributed build support for Clang ThinLTO xur
2 siblings, 0 replies; 6+ messages in thread
From: xur @ 2026-05-29 18:53 UTC (permalink / raw)
To: Masahiro Yamada, Nathan Chancellor, Nicolas Schier,
Nick Desaulniers, Yonghong Song, Bill Wendling, Justin Stitt,
Miguel Ojeda, Thomas Gleixner, Alice Ryhl, Sami Tolvanen,
Mike Rapoport (Microsoft), Rafael Aquini, Michael Ellerman,
Stafford Horne, Christophe Leroy, Piotr Gorski, Rong Xu,
Venkat Rao Bagalkote, Miguel Ojeda, Teresa Johnson
Cc: linux-kernel, linux-kbuild, llvm
From: Rong Xu <xur@google.com>
From: Masahiro Yamada <masahiroy@kernel.org>
Move the build rule for vmlinux.a to a separate file in preparation
for supporting distributed builds with Clang ThinLTO.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Tested-by: Rong Xu <xur@google.com>
Tested-by: Piotr Gorski <piotrgorski@cachyos.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Rong Xu <xur@google.com>
---
Makefile | 16 +++++--------
scripts/Makefile.vmlinux_a | 46 ++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 10 deletions(-)
create mode 100644 scripts/Makefile.vmlinux_a
diff --git a/Makefile b/Makefile
index e27c91ea56fc..0fce9557a115 100644
--- a/Makefile
+++ b/Makefile
@@ -1291,7 +1291,7 @@ export ARCH_DRIVERS := $(drivers-y) $(drivers-m)
KBUILD_VMLINUX_OBJS := built-in.a $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
KBUILD_VMLINUX_LIBS := $(filter-out %/, $(libs-y))
-export KBUILD_VMLINUX_LIBS
+export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
ifdef CONFIG_TRIM_UNUSED_KSYMS
@@ -1300,16 +1300,12 @@ ifdef CONFIG_TRIM_UNUSED_KSYMS
KBUILD_MODULES := y
endif
-# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
-quiet_cmd_ar_vmlinux.a = AR $@
- cmd_ar_vmlinux.a = \
- rm -f $@; \
- $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
- $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
+PHONY += vmlinux_a
+vmlinux_a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_a
-targets += vmlinux.a
-vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
- $(call if_changed,ar_vmlinux.a)
+vmlinux.a: vmlinux_a
+ @:
PHONY += vmlinux_o
vmlinux_o: vmlinux.a $(KBUILD_VMLINUX_LIBS)
diff --git a/scripts/Makefile.vmlinux_a b/scripts/Makefile.vmlinux_a
new file mode 100644
index 000000000000..9774f02b43b2
--- /dev/null
+++ b/scripts/Makefile.vmlinux_a
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+PHONY := __default
+__default: vmlinux.a
+
+include include/config/auto.conf
+include $(srctree)/scripts/Kbuild.include
+include $(srctree)/scripts/Makefile.lib
+
+# Link of built-in-fixup.a
+# ---------------------------------------------------------------------------
+
+# '$(AR) mPi' needs --thin to workaround the bug of llvm-ar <= 14
+quiet_cmd_ar_builtin_fixup = AR $@
+ cmd_ar_builtin_fixup = \
+ rm -f $@; \
+ $(AR) cDPrS --thin $@ $(KBUILD_VMLINUX_OBJS); \
+ $(AR) mPi --thin $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
+
+targets += built-in-fixup.a
+built-in-fixup.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
+ $(call if_changed,ar_builtin_fixup)
+
+# vmlinux.a
+# ---------------------------------------------------------------------------
+
+targets += vmlinux.a
+vmlinux.a: built-in-fixup.a FORCE
+ $(call if_changed,copy)
+
+# Add FORCE to the prerequisites of a target to force it to be always rebuilt.
+# ---------------------------------------------------------------------------
+
+PHONY += FORCE
+FORCE:
+
+# Read all saved command lines and dependencies for the $(targets) we
+# may be building above, using $(if_changed{,_dep}). As an
+# optimization, we don't need to read them if the target does not
+# exist, we will rebuild anyway in that case.
+
+existing-targets := $(wildcard $(sort $(targets)))
+
+-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
+
+.PHONY: $(PHONY)
--
2.54.0.823.g6e5bcc1fc9-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR)
2026-05-29 18:53 [PATCH v12 0/3] kbuild: distributed build support for Clang ThinLTO xur
2026-05-29 18:53 ` [PATCH v12 1/3] kbuild: move vmlinux.a build rule to scripts/Makefile.vmlinux_a xur
@ 2026-05-29 18:53 ` xur
2026-06-02 7:17 ` Nicolas Schier
2026-05-29 18:53 ` [PATCH v12 3/3] kbuild: distributed build support for Clang ThinLTO xur
2 siblings, 1 reply; 6+ messages in thread
From: xur @ 2026-05-29 18:53 UTC (permalink / raw)
To: Masahiro Yamada, Nathan Chancellor, Nicolas Schier,
Nick Desaulniers, Yonghong Song, Bill Wendling, Justin Stitt,
Miguel Ojeda, Thomas Gleixner, Alice Ryhl, Sami Tolvanen,
Mike Rapoport (Microsoft), Rafael Aquini, Michael Ellerman,
Stafford Horne, Christophe Leroy, Piotr Gorski, Rong Xu,
Venkat Rao Bagalkote, Miguel Ojeda, Teresa Johnson
Cc: linux-kernel, linux-kbuild, llvm
From: Rong Xu <xur@google.com>
The '-T' flag in $(AR) is no longer problematic since the minimum
requirement for LLVM has been updated to version 15. As of LLVM 14
and onward, the '-T' flag functions identically to the '--thin' flag.
Fixed the issue seen on IBM Power11 System:
ar: unrecognized option '--thin'
Reported-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Closes: https://lore.kernel.org/linux-next/476507c9-a371-4864-9e87-572c1ecae82d@linux.ibm.com/
Signed-off-by: Rong Xu <xur@google.com>
---
scripts/Makefile.vmlinux_a | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/scripts/Makefile.vmlinux_a b/scripts/Makefile.vmlinux_a
index 9774f02b43b2..650d44330d1f 100644
--- a/scripts/Makefile.vmlinux_a
+++ b/scripts/Makefile.vmlinux_a
@@ -10,12 +10,12 @@ include $(srctree)/scripts/Makefile.lib
# Link of built-in-fixup.a
# ---------------------------------------------------------------------------
-# '$(AR) mPi' needs --thin to workaround the bug of llvm-ar <= 14
+# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
quiet_cmd_ar_builtin_fixup = AR $@
cmd_ar_builtin_fixup = \
rm -f $@; \
- $(AR) cDPrS --thin $@ $(KBUILD_VMLINUX_OBJS); \
- $(AR) mPi --thin $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
+ $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
+ $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
targets += built-in-fixup.a
built-in-fixup.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
--
2.54.0.823.g6e5bcc1fc9-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v12 3/3] kbuild: distributed build support for Clang ThinLTO
2026-05-29 18:53 [PATCH v12 0/3] kbuild: distributed build support for Clang ThinLTO xur
2026-05-29 18:53 ` [PATCH v12 1/3] kbuild: move vmlinux.a build rule to scripts/Makefile.vmlinux_a xur
2026-05-29 18:53 ` [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR) xur
@ 2026-05-29 18:53 ` xur
2 siblings, 0 replies; 6+ messages in thread
From: xur @ 2026-05-29 18:53 UTC (permalink / raw)
To: Masahiro Yamada, Nathan Chancellor, Nicolas Schier,
Nick Desaulniers, Yonghong Song, Bill Wendling, Justin Stitt,
Miguel Ojeda, Thomas Gleixner, Alice Ryhl, Sami Tolvanen,
Mike Rapoport (Microsoft), Rafael Aquini, Michael Ellerman,
Stafford Horne, Christophe Leroy, Piotr Gorski, Rong Xu,
Venkat Rao Bagalkote, Miguel Ojeda, Teresa Johnson
Cc: linux-kernel, linux-kbuild, llvm
From: Rong Xu <xur@google.com>
Add distributed ThinLTO build support for the Linux kernel.
This new mode offers several advantages: (1) Increased
flexibility in handling user-specified build options.
(2) Improved user-friendliness for developers. (3) Greater
convenience for integrating with objtool and livepatch.
Note that "distributed" in this context refers to a term
that differentiates in-process ThinLTO builds by invoking
backend compilation through the linker, not necessarily
building in distributed environments.
Distributed ThinLTO is enabled via the
`CONFIG_LTO_CLANG_THIN_DIST` Kconfig option. For example:
> make LLVM=1 defconfig
> scripts/config -e LTO_CLANG_THIN_DIST
> make LLVM=1 oldconfig
> make LLVM=1 vmlinux -j <..>
The build flow proceeds in four stages:
1. Perform FE compilation, mirroring the in-process ThinLTO mode.
2. Thin-link the generated IR files and object files.
3. Find all IR files and perform BE compilation, using the flags
stored in the .*.o.cmd files.
4. Link the BE results to generate the final vmlinux.o.
NOTE: This patch currently implements the build for the main kernel
image (vmlinux) only. Kernel module support is planned for a
subsequent patch.
Tested on the following arch: x86, arm64, loongarch, and
riscv.
The earlier implementation details can be found here:
https://discourse.llvm.org/t/rfc-distributed-thinlto-build-for-kernel/85934
Signed-off-by: Rong Xu <xur@google.com>
Co-developed-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Tested-by: Piotr Gorski <piotrgorski@cachyos.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
---
.gitignore | 2 ++
Makefile | 14 +++++++++----
arch/Kconfig | 19 ++++++++++++++++++
scripts/Makefile.lib | 8 ++++++++
scripts/Makefile.thinlto | 40 ++++++++++++++++++++++++++++++++++++++
scripts/Makefile.vmlinux_a | 37 +++++++++++++++++++++++++++++++++++
scripts/mod/modpost.c | 15 +++++++++++---
7 files changed, 128 insertions(+), 7 deletions(-)
create mode 100644 scripts/Makefile.thinlto
diff --git a/.gitignore b/.gitignore
index 3044b9590f05..1cc34c9a5523 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,7 @@
*.zst
Module.symvers
dtbs-list
+builtin.order
modules.order
#
@@ -68,6 +69,7 @@ modules.order
/vmlinux.32
/vmlinux.map
/vmlinux.symvers
+/vmlinux.thinlto-index
/vmlinux.unstripped
/vmlinux-gdb.py
/vmlinuz
diff --git a/Makefile b/Makefile
index 0fce9557a115..857f08dcc952 100644
--- a/Makefile
+++ b/Makefile
@@ -1071,11 +1071,16 @@ export CC_FLAGS_SCS
endif
ifdef CONFIG_LTO_CLANG
-ifdef CONFIG_LTO_CLANG_THIN
+ifdef CONFIG_LTO_CLANG_FULL
+CC_FLAGS_LTO := -flto
+else
CC_FLAGS_LTO := -flto=thin -fsplit-lto-unit
+
+# These LLVM options were initially added with only in-process ThinLTO
+# support, so avoid distributed ThinLTO support for now.
+ifdef CONFIG_LTO_CLANG_THIN
KBUILD_LDFLAGS += $(call ld-option,--lto-whole-program-visibility -mllvm -always-rename-promoted-locals=false)
-else
-CC_FLAGS_LTO := -flto
+endif
endif
CC_FLAGS_LTO += -fvisibility=hidden
@@ -1684,6 +1689,7 @@ endif # CONFIG_MODULES
CLEAN_FILES += vmlinux.symvers modules-only.symvers \
modules.builtin modules.builtin.modinfo modules.nsdeps \
modules.builtin.ranges vmlinux.o.map vmlinux.unstripped \
+ vmlinux.thinlto-index builtin.order \
compile_commands.json rust/test \
rust-project.json .vmlinux.objs .vmlinux.export.c \
.builtin-dtbs-list .builtin-dtbs.S
@@ -2145,7 +2151,7 @@ clean: $(clean-dirs)
$(call cmd,rmfiles)
@find . $(RCS_FIND_IGNORE) \
\( -name '*.[aios]' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \
- -o -name '*.ko.*' \
+ -o -name '*.ko.*' -o -name '*.o.thinlto.bc' \
-o -name '*.dtb' -o -name '*.dtbo' \
-o -name '*.dtb.S' -o -name '*.dtbo.S' \
-o -name '*.dt.yaml' -o -name 'dtbs-list' \
diff --git a/arch/Kconfig b/arch/Kconfig
index e86880045158..082483a3bbf8 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -861,6 +861,25 @@ config LTO_CLANG_THIN
https://clang.llvm.org/docs/ThinLTO.html
If unsure, say Y.
+
+config LTO_CLANG_THIN_DIST
+ bool "Clang ThinLTO in distributed mode (EXPERIMENTAL)"
+ depends on HAS_LTO_CLANG && ARCH_SUPPORTS_LTO_CLANG_THIN
+ select LTO_CLANG
+ help
+ This option enables Clang's ThinLTO in distributed build mode.
+ In this mode, the linker performs the thin-link, generating
+ ThinLTO index files. Subsequently, the build system explicitly
+ invokes ThinLTO backend compilation using these index files
+ and pre-linked IR objects. The resulting native object files
+ are with the .thinlto-native.o suffix.
+
+ This build mode offers improved visibility into the ThinLTO
+ process through explicit subcommand exposure. It also makes
+ final native object files directly available, benefiting
+ tools like objtool and kpatch. Additionally, it provides
+ crucial granular control over back-end options, enabling
+ module-specific compiler options, and simplifies debugging.
endchoice
config ARCH_SUPPORTS_AUTOFDO_CLANG
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 0718e39cedda..86e1428cc55d 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -249,6 +249,13 @@ ifdef CONFIG_LTO_CLANG
cmd_ld_single = $(if $(objtool-enabled)$(is-single-obj-m), ; $(LD) $(ld_flags) -r -o $(tmp-target) $@; mv $(tmp-target) $@)
endif
+ifdef CONFIG_LTO_CLANG_THIN_DIST
+# Save the _c_flags, sliently.
+quiet_cmd_save_c_flags =
+ saved_c_flags = $(_c_flags) $(modkern_cflags)
+ cmd_save_c_flags = printf '\n%s\n' 'saved_c_flags_$@ := $(call escsq,$(saved_c_flags))' >> $(dot-target).cmd
+endif
+
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< \
$(cmd_ld_single) \
@@ -256,6 +263,7 @@ quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
define rule_cc_o_c
$(call cmd_and_fixdep,cc_o_c)
+ $(call cmd,save_c_flags)
$(call cmd,checksrc)
$(call cmd,checkdoc)
$(call cmd,gen_objtooldep)
diff --git a/scripts/Makefile.thinlto b/scripts/Makefile.thinlto
new file mode 100644
index 000000000000..bb83f13f3cd6
--- /dev/null
+++ b/scripts/Makefile.thinlto
@@ -0,0 +1,40 @@
+PHONY := __default
+__default:
+
+include include/config/auto.conf
+include $(srctree)/scripts/Kbuild.include
+include $(srctree)/scripts/Makefile.lib
+
+native-objs := $(patsubst %.o,%.thinlto-native.o,$(call read-file, vmlinux.thinlto-index))
+
+__default: $(native-objs)
+
+# Generate .thinlto-native.o (obj) from .o (bitcode) and .thinlto.bc (summary) files
+# ---------------------------------------------------------------------------
+quiet_cmd_cc_o_bc = CC $(quiet_modtag) $@
+ be_flags = $(shell sed -n '/saved_c_flags_/s/.*:= //p' \
+ $(dir $(<)).$(notdir $(<)).cmd)
+ cmd_cc_o_bc = \
+ $(CC) $(be_flags) -x ir -fno-lto -Wno-unused-command-line-argument \
+ -fthinlto-index=$(word 2, $^) -c -o $@ $<
+
+targets += $(native-objs)
+$(native-objs): %.thinlto-native.o: %.o %.o.thinlto.bc FORCE
+ $(call if_changed,cc_o_bc)
+
+# Add FORCE to the prerequisites of a target to force it to be always rebuilt.
+# ---------------------------------------------------------------------------
+
+PHONY += FORCE
+FORCE:
+
+# Read all saved command lines and dependencies for the $(targets) we
+# may be building above, using $(if_changed{,_dep}). As an
+# optimization, we don't need to read them if the target does not
+# exist, we will rebuild anyway in that case.
+
+existing-targets := $(wildcard $(sort $(targets)))
+
+-include $(foreach f, $(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
+
+.PHONY: $(PHONY)
diff --git a/scripts/Makefile.vmlinux_a b/scripts/Makefile.vmlinux_a
index 650d44330d1f..bd141b893748 100644
--- a/scripts/Makefile.vmlinux_a
+++ b/scripts/Makefile.vmlinux_a
@@ -21,6 +21,41 @@ targets += built-in-fixup.a
built-in-fixup.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
$(call if_changed,ar_builtin_fixup)
+ifdef CONFIG_LTO_CLANG_THIN_DIST
+
+quiet_cmd_builtin.order = GEN $@
+ cmd_builtin.order = $(AR) t $< > $@
+
+targets += builtin.order
+builtin.order: built-in-fixup.a FORCE
+ $(call if_changed,builtin.order)
+
+quiet_cmd_ld_thinlto_index = LD $@
+ cmd_ld_thinlto_index = \
+ $(LD) $(KBUILD_LDFLAGS) -r --thinlto-index-only=$@ @$<
+
+targets += vmlinux.thinlto-index
+vmlinux.thinlto-index: builtin.order FORCE
+ $(call if_changed,ld_thinlto_index)
+
+quiet_cmd_ar_vmlinux.a = GEN $@
+ cmd_ar_vmlinux.a = \
+ rm -f $@; \
+ while read -r obj; do \
+ if grep -Fqx $${obj} $(word 2, $^); then \
+ echo $${obj%.o}.thinlto-native.o; \
+ else \
+ echo $${obj}; \
+ fi; \
+ done < $< | xargs $(AR) cDPrS --thin $@
+
+targets += vmlinux.a
+vmlinux.a: builtin.order vmlinux.thinlto-index FORCE
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.thinlto
+ $(call if_changed,ar_vmlinux.a)
+
+else
+
# vmlinux.a
# ---------------------------------------------------------------------------
@@ -28,6 +63,8 @@ targets += vmlinux.a
vmlinux.a: built-in-fixup.a FORCE
$(call if_changed,copy)
+endif
+
# Add FORCE to the prerequisites of a target to force it to be always rebuilt.
# ---------------------------------------------------------------------------
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index abbcd3fc1394..171886ac1726 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1487,13 +1487,22 @@ static void extract_crcs_for_object(const char *object, struct module *mod)
char cmd_file[PATH_MAX];
char *buf, *p;
const char *base;
- int dirlen, ret;
+ int dirlen, baselen_without_suffix, ret;
base = get_basename(object);
dirlen = base - object;
- ret = snprintf(cmd_file, sizeof(cmd_file), "%.*s.%s.cmd",
- dirlen, object, base);
+ baselen_without_suffix = strlen(object) - dirlen - strlen(".o");
+
+ /*
+ * When CONFIG_LTO_CLANG_THIN_DIST=y, the ELF is *.thinlto-native.o
+ * but the symbol CRCs are recorded in *.o.cmd file.
+ */
+ if (strends(object, ".thinlto-native.o"))
+ baselen_without_suffix -= strlen(".thinlto-native");
+
+ ret = snprintf(cmd_file, sizeof(cmd_file), "%.*s.%.*s.o.cmd",
+ dirlen, object, baselen_without_suffix, base);
if (ret >= sizeof(cmd_file)) {
error("%s: too long path was truncated\n", cmd_file);
return;
--
2.54.0.823.g6e5bcc1fc9-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR)
2026-05-29 18:53 ` [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR) xur
@ 2026-06-02 7:17 ` Nicolas Schier
2026-06-02 16:51 ` Rong Xu
0 siblings, 1 reply; 6+ messages in thread
From: Nicolas Schier @ 2026-06-02 7:17 UTC (permalink / raw)
To: xur
Cc: Masahiro Yamada, Nathan Chancellor, Nick Desaulniers,
Yonghong Song, Bill Wendling, Justin Stitt, Miguel Ojeda,
Thomas Gleixner, Alice Ryhl, Sami Tolvanen,
Mike Rapoport (Microsoft), Rafael Aquini, Michael Ellerman,
Stafford Horne, Christophe Leroy, Piotr Gorski,
Venkat Rao Bagalkote, Miguel Ojeda, Teresa Johnson, linux-kernel,
linux-kbuild, llvm
On Fri, May 29, 2026 at 11:53:45AM -0700, xur@google.com wrote:
> From: Rong Xu <xur@google.com>
>
> The '-T' flag in $(AR) is no longer problematic since the minimum
> requirement for LLVM has been updated to version 15. As of LLVM 14
> and onward, the '-T' flag functions identically to the '--thin' flag.
For correctness: it's called "'T' modifier" (instead of "'-T' flag").
>
> Fixed the issue seen on IBM Power11 System:
> ar: unrecognized option '--thin'
>
> Reported-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
> Closes: https://lore.kernel.org/linux-next/476507c9-a371-4864-9e87-572c1ecae82d@linux.ibm.com/
> Signed-off-by: Rong Xu <xur@google.com>
> ---
> scripts/Makefile.vmlinux_a | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/scripts/Makefile.vmlinux_a b/scripts/Makefile.vmlinux_a
> index 9774f02b43b2..650d44330d1f 100644
> --- a/scripts/Makefile.vmlinux_a
> +++ b/scripts/Makefile.vmlinux_a
> @@ -10,12 +10,12 @@ include $(srctree)/scripts/Makefile.lib
> # Link of built-in-fixup.a
> # ---------------------------------------------------------------------------
>
> -# '$(AR) mPi' needs --thin to workaround the bug of llvm-ar <= 14
> +# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
This comment should be removed.
> quiet_cmd_ar_builtin_fixup = AR $@
> cmd_ar_builtin_fixup = \
> rm -f $@; \
> - $(AR) cDPrS --thin $@ $(KBUILD_VMLINUX_OBJS); \
> - $(AR) mPi --thin $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
> + $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
> + $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
>
> targets += built-in-fixup.a
> built-in-fixup.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
> --
> 2.54.0.823.g6e5bcc1fc9-goog
>
Thanks!
Reviewed-by: Nicolas Schier <nsc@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR)
2026-06-02 7:17 ` Nicolas Schier
@ 2026-06-02 16:51 ` Rong Xu
0 siblings, 0 replies; 6+ messages in thread
From: Rong Xu @ 2026-06-02 16:51 UTC (permalink / raw)
To: xur, Masahiro Yamada, Nathan Chancellor, Nick Desaulniers,
Yonghong Song, Bill Wendling, Justin Stitt, Miguel Ojeda,
Thomas Gleixner, Alice Ryhl, Sami Tolvanen,
Mike Rapoport (Microsoft), Rafael Aquini, Michael Ellerman,
Stafford Horne, Christophe Leroy, Piotr Gorski,
Venkat Rao Bagalkote, Miguel Ojeda, Teresa Johnson, linux-kernel,
linux-kbuild, llvm
Thanks Nicolas for the review!
It looks like Nathan already merged the patch series and squashed this
specific patch into the previous one, which
removed the commit message and that comment. These changes actually
incorporate your review feedback.
Cheers,
-Rong
On Tue, Jun 2, 2026 at 1:46 AM Nicolas Schier <nsc@kernel.org> wrote:
>
> On Fri, May 29, 2026 at 11:53:45AM -0700, xur@google.com wrote:
> > From: Rong Xu <xur@google.com>
> >
> > The '-T' flag in $(AR) is no longer problematic since the minimum
> > requirement for LLVM has been updated to version 15. As of LLVM 14
> > and onward, the '-T' flag functions identically to the '--thin' flag.
>
> For correctness: it's called "'T' modifier" (instead of "'-T' flag").
>
> >
> > Fixed the issue seen on IBM Power11 System:
> > ar: unrecognized option '--thin'
> >
> > Reported-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
> > Closes: https://lore.kernel.org/linux-next/476507c9-a371-4864-9e87-572c1ecae82d@linux.ibm.com/
> > Signed-off-by: Rong Xu <xur@google.com>
> > ---
> > scripts/Makefile.vmlinux_a | 6 +++---
> > 1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/scripts/Makefile.vmlinux_a b/scripts/Makefile.vmlinux_a
> > index 9774f02b43b2..650d44330d1f 100644
> > --- a/scripts/Makefile.vmlinux_a
> > +++ b/scripts/Makefile.vmlinux_a
> > @@ -10,12 +10,12 @@ include $(srctree)/scripts/Makefile.lib
> > # Link of built-in-fixup.a
> > # ---------------------------------------------------------------------------
> >
> > -# '$(AR) mPi' needs --thin to workaround the bug of llvm-ar <= 14
> > +# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
>
> This comment should be removed.
>
> > quiet_cmd_ar_builtin_fixup = AR $@
> > cmd_ar_builtin_fixup = \
> > rm -f $@; \
> > - $(AR) cDPrS --thin $@ $(KBUILD_VMLINUX_OBJS); \
> > - $(AR) mPi --thin $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
> > + $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
> > + $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
> >
> > targets += built-in-fixup.a
> > built-in-fixup.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
> > --
> > 2.54.0.823.g6e5bcc1fc9-goog
> >
>
> Thanks!
>
> Reviewed-by: Nicolas Schier <nsc@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-06-02 16:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-29 18:53 [PATCH v12 0/3] kbuild: distributed build support for Clang ThinLTO xur
2026-05-29 18:53 ` [PATCH v12 1/3] kbuild: move vmlinux.a build rule to scripts/Makefile.vmlinux_a xur
2026-05-29 18:53 ` [PATCH v12 2/3] kbuild: change --thin back to 'T' in $(AR) xur
2026-06-02 7:17 ` Nicolas Schier
2026-06-02 16:51 ` Rong Xu
2026-05-29 18:53 ` [PATCH v12 3/3] kbuild: distributed build support for Clang ThinLTO xur
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox