diff mbox series

[v2] kbuild: clang: Support building UM with SUBARCH=i386

Message ID 20250304162124.it.785-kees@kernel.org (mailing list archive)
State New
Headers show
Series [v2] kbuild: clang: Support building UM with SUBARCH=i386 | expand

Commit Message

Kees Cook March 4, 2025, 4:21 p.m. UTC
The UM builds distinguish i386 from x86_64 via SUBARCH, but we don't
support building i386 directly with Clang. To make SUBARCH work for
i386 UM, we need to explicitly test for it.

This lets me run i386 KUnit tests with Clang:

$ ./tools/testing/kunit/kunit.py run \
	--make_options LLVM=1 \
	--make_options SUBARCH=i386
...

Fixes: c7500c1b53bf ("um: Allow builds with Clang")
Signed-off-by: Kees Cook <kees@kernel.org>
---
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Thomas Weißschuh <linux@weissschuh.net>
Cc: Bill Wendling <morbo@google.com>
Cc: Justin Stitt <justinstitt@google.com>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Nicolas Schier <nicolas@fjasle.eu>
Cc: llvm@lists.linux.dev
Cc: linux-kbuild@vger.kernel.org
---
 scripts/Makefile.clang | 2 ++
 1 file changed, 2 insertions(+)

Comments

Nathan Chancellor March 4, 2025, 4:28 p.m. UTC | #1
On Tue, Mar 04, 2025 at 08:21:29AM -0800, Kees Cook wrote:
> The UM builds distinguish i386 from x86_64 via SUBARCH, but we don't
> support building i386 directly with Clang. To make SUBARCH work for
> i386 UM, we need to explicitly test for it.
> 
> This lets me run i386 KUnit tests with Clang:
> 
> $ ./tools/testing/kunit/kunit.py run \
> 	--make_options LLVM=1 \
> 	--make_options SUBARCH=i386
> ...
> 
> Fixes: c7500c1b53bf ("um: Allow builds with Clang")
> Signed-off-by: Kees Cook <kees@kernel.org>

Reviewed-by: Nathan Chancellor <nathan@kernel.org>

> ---
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Thomas Weißschuh <linux@weissschuh.net>
> Cc: Bill Wendling <morbo@google.com>
> Cc: Justin Stitt <justinstitt@google.com>
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Nicolas Schier <nicolas@fjasle.eu>
> Cc: llvm@lists.linux.dev
> Cc: linux-kbuild@vger.kernel.org
> ---
>  scripts/Makefile.clang | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/scripts/Makefile.clang b/scripts/Makefile.clang
> index 2435efae67f5..b67636b28c35 100644
> --- a/scripts/Makefile.clang
> +++ b/scripts/Makefile.clang
> @@ -12,6 +12,8 @@ CLANG_TARGET_FLAGS_riscv	:= riscv64-linux-gnu
>  CLANG_TARGET_FLAGS_s390		:= s390x-linux-gnu
>  CLANG_TARGET_FLAGS_sparc	:= sparc64-linux-gnu
>  CLANG_TARGET_FLAGS_x86		:= x86_64-linux-gnu
> +# This is only for i386 UM builds, which need the 32-bit target not -m32
> +CLANG_TARGET_FLAGS_i386		:= i386-linux-gnu
>  CLANG_TARGET_FLAGS_um		:= $(CLANG_TARGET_FLAGS_$(SUBARCH))
>  CLANG_TARGET_FLAGS		:= $(CLANG_TARGET_FLAGS_$(SRCARCH))
>  
> -- 
> 2.34.1
>
Kees Cook March 4, 2025, 5:50 p.m. UTC | #2
On Tue, 04 Mar 2025 08:21:29 -0800, Kees Cook wrote:
> The UM builds distinguish i386 from x86_64 via SUBARCH, but we don't
> support building i386 directly with Clang. To make SUBARCH work for
> i386 UM, we need to explicitly test for it.
> 
> This lets me run i386 KUnit tests with Clang:
> 
> $ ./tools/testing/kunit/kunit.py run \
> 	--make_options LLVM=1 \
> 	--make_options SUBARCH=i386
> ...
> 
> [...]

Applied to for-next/hardening, thanks!

[1/1] kbuild: clang: Support building UM with SUBARCH=i386
      https://git.kernel.org/kees/c/a48d9ebdbb5a

Take care,
David Gow March 6, 2025, 8:59 a.m. UTC | #3
On Wed, 5 Mar 2025 at 00:21, Kees Cook <kees@kernel.org> wrote:
>
> The UM builds distinguish i386 from x86_64 via SUBARCH, but we don't
> support building i386 directly with Clang. To make SUBARCH work for
> i386 UM, we need to explicitly test for it.
>
> This lets me run i386 KUnit tests with Clang:
>
> $ ./tools/testing/kunit/kunit.py run \
>         --make_options LLVM=1 \
>         --make_options SUBARCH=i386
> ...
>
> Fixes: c7500c1b53bf ("um: Allow builds with Clang")
> Signed-off-by: Kees Cook <kees@kernel.org>
> ---

Thanks for this -- I'd been using `--kconfig_add CONFIG_64BIT=n` as a
way to build i386 UML kernels, which seems to work even without this
patch -- but this is definitely an improvement.

It may be worth noting that CONFIG_FORTIFY_SOURCE is incompatible with
clang + i386, which seems to affect UML as well. (That might actually
not be required, as I think UML doesn't use any of the strange
-mregparm calling convention stuff which appears to be what breaks
FORTIFY_SOURCE here.)

Regardless,

Tested-by: David Gow <davidgow@google.com>

Cheers,
-- David


> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Thomas Weißschuh <linux@weissschuh.net>
> Cc: Bill Wendling <morbo@google.com>
> Cc: Justin Stitt <justinstitt@google.com>
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Nicolas Schier <nicolas@fjasle.eu>
> Cc: llvm@lists.linux.dev
> Cc: linux-kbuild@vger.kernel.org
> ---
>  scripts/Makefile.clang | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/scripts/Makefile.clang b/scripts/Makefile.clang
> index 2435efae67f5..b67636b28c35 100644
> --- a/scripts/Makefile.clang
> +++ b/scripts/Makefile.clang
> @@ -12,6 +12,8 @@ CLANG_TARGET_FLAGS_riscv      := riscv64-linux-gnu
>  CLANG_TARGET_FLAGS_s390                := s390x-linux-gnu
>  CLANG_TARGET_FLAGS_sparc       := sparc64-linux-gnu
>  CLANG_TARGET_FLAGS_x86         := x86_64-linux-gnu
> +# This is only for i386 UM builds, which need the 32-bit target not -m32
> +CLANG_TARGET_FLAGS_i386                := i386-linux-gnu
>  CLANG_TARGET_FLAGS_um          := $(CLANG_TARGET_FLAGS_$(SUBARCH))
>  CLANG_TARGET_FLAGS             := $(CLANG_TARGET_FLAGS_$(SRCARCH))
>
> --
> 2.34.1
>
Kees Cook March 7, 2025, 3:41 a.m. UTC | #4
On Thu, Mar 06, 2025 at 04:59:53PM +0800, David Gow wrote:
> On Wed, 5 Mar 2025 at 00:21, Kees Cook <kees@kernel.org> wrote:
> >
> > The UM builds distinguish i386 from x86_64 via SUBARCH, but we don't
> > support building i386 directly with Clang. To make SUBARCH work for
> > i386 UM, we need to explicitly test for it.
> >
> > This lets me run i386 KUnit tests with Clang:
> >
> > $ ./tools/testing/kunit/kunit.py run \
> >         --make_options LLVM=1 \
> >         --make_options SUBARCH=i386
> > ...
> >
> > Fixes: c7500c1b53bf ("um: Allow builds with Clang")
> > Signed-off-by: Kees Cook <kees@kernel.org>
> > ---
> 
> Thanks for this -- I'd been using `--kconfig_add CONFIG_64BIT=n` as a
> way to build i386 UML kernels, which seems to work even without this
> patch -- but this is definitely an improvement.

Thanks! Yeah, I figured there must have been a way to get at it. I
wanted to make it work the "normal" way.

> It may be worth noting that CONFIG_FORTIFY_SOURCE is incompatible with
> clang + i386, which seems to affect UML as well. (That might actually
> not be required, as I think UML doesn't use any of the strange
> -mregparm calling convention stuff which appears to be what breaks
> FORTIFY_SOURCE here.)

Also fixed! :)
https://lore.kernel.org/lkml/20250303214929.work.499-kees@kernel.org/

> Tested-by: David Gow <davidgow@google.com>

Thanks for testing; I've updated the trailers in my tree.

-Kees
diff mbox series

Patch

diff --git a/scripts/Makefile.clang b/scripts/Makefile.clang
index 2435efae67f5..b67636b28c35 100644
--- a/scripts/Makefile.clang
+++ b/scripts/Makefile.clang
@@ -12,6 +12,8 @@  CLANG_TARGET_FLAGS_riscv	:= riscv64-linux-gnu
 CLANG_TARGET_FLAGS_s390		:= s390x-linux-gnu
 CLANG_TARGET_FLAGS_sparc	:= sparc64-linux-gnu
 CLANG_TARGET_FLAGS_x86		:= x86_64-linux-gnu
+# This is only for i386 UM builds, which need the 32-bit target not -m32
+CLANG_TARGET_FLAGS_i386		:= i386-linux-gnu
 CLANG_TARGET_FLAGS_um		:= $(CLANG_TARGET_FLAGS_$(SUBARCH))
 CLANG_TARGET_FLAGS		:= $(CLANG_TARGET_FLAGS_$(SRCARCH))