Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

kbuild: warn if a different compiler is used for external module builds

It is always safe to use the same compiler for the kernel and external
modules, but in reality, some distributions such as Fedora release a
different version of GCC from the one used for building the kernel.

There was a long discussion about mixing different compilers [1].

I do not repeat it here, but at least, showing a heads up in that
case is better than nothing.

Linus suggested [2]:
And a warning might be more palatable even if different compiler
version work fine together. Just a heads up on "it looks like you
might be mixing compiler versions" is a valid note, and isn't
necessarily wrong. Even when they work well together, maybe you want
to have people at least _aware_ of it.

This commit shows a warning unless the compiler is exactly the same.

warning: the compiler differs from the one used to build the kernel
The kernel was built by: gcc (GCC) 11.1.1 20210531 (Red Hat 11.1.1-3)
You are using: gcc (GCC) 11.2.1 20210728 (Red Hat 11.2.1-1)

Check the difference, and if it is OK with you, please proceed at your
risk.

To avoid the locale issue as in commit bcbcf50f5218 ("kbuild: fix
ld-version.sh to not be affected by locale"), pass LC_ALL=C to
"$(CC) --version".

[1] https://lore.kernel.org/linux-hardening/efe6b039a544da8215d5e54aa7c4b6d1986fc2b0.1611607264.git.jpoimboe@redhat.com/
[2] https://lore.kernel.org/lkml/CAHk-=wgjwhDy-y4mQh34L+2aF=n6BjzHdqAW2=8wri5x7O04pA@mail.gmail.com/

Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

+12 -2
+12 -2
Makefile
··· 581 581 # Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile. 582 582 # CC_VERSION_TEXT is referenced from Kconfig (so it needs export), 583 583 # and from include/config/auto.conf.cmd to detect the compiler upgrade. 584 - CC_VERSION_TEXT = $(subst $(pound),,$(shell $(CC) --version 2>/dev/null | head -n 1)) 584 + CC_VERSION_TEXT = $(subst $(pound),,$(shell LC_ALL=C $(CC) --version 2>/dev/null | head -n 1)) 585 585 586 586 ifneq ($(findstring clang,$(CC_VERSION_TEXT)),) 587 587 ifneq ($(CROSS_COMPILE),) ··· 1739 1739 clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers $(KBUILD_EXTMOD)/modules.nsdeps \ 1740 1740 $(KBUILD_EXTMOD)/compile_commands.json $(KBUILD_EXTMOD)/.thinlto-cache 1741 1741 1742 + PHONY += prepare 1743 + # now expand this into a simple variable to reduce the cost of shell evaluations 1744 + prepare: CC_VERSION_TEXT := $(CC_VERSION_TEXT) 1745 + prepare: 1746 + @if [ "$(CC_VERSION_TEXT)" != $(CONFIG_CC_VERSION_TEXT) ]; then \ 1747 + echo >&2 "warning: the compiler differs from the one used to build the kernel"; \ 1748 + echo >&2 " The kernel was built by: "$(CONFIG_CC_VERSION_TEXT); \ 1749 + echo >&2 " You are using: $(CC_VERSION_TEXT)"; \ 1750 + fi 1751 + 1742 1752 PHONY += help 1743 1753 help: 1744 1754 @echo ' Building external modules.' ··· 1760 1750 @echo '' 1761 1751 1762 1752 # no-op for external module builds 1763 - PHONY += prepare modules_prepare 1753 + PHONY += modules_prepare 1764 1754 1765 1755 endif # KBUILD_EXTMOD 1766 1756