On Tue, Jun 17, 2025 at 4:59 PM Thomas Weißschuh thomas.weissschuh@linutronix.de wrote:
On Tue, Jun 17, 2025 at 12:35:07AM +0900, Masahiro Yamada wrote:
On Wed, Jun 11, 2025 at 4:38 PM Thomas Weißschuh thomas.weissschuh@linutronix.de wrote:
Userprogs are built with the regular kernel compiler $CC. A kernel compiler does not necessarily contain a libc which is required for a normal userspace application. However the kernel tree does contain a minimal libc implementation "nolibc" which can be used to build userspace applications.
Introduce support to build userprogs against nolibc instead of the default libc of the compiler, which may not exist.
Signed-off-by: Thomas Weißschuh thomas.weissschuh@linutronix.de
This could probably be moved out of the generic kbuild makefiles. I think the ergonimics would suffer and this functionality could be used by other users of userprogs.
Also this does currently not support out-of-tree builds. For that tools/include/nolibc/*.h and usr/include/*.h would need to be installed into the build directory.
<snip>
--- a/scripts/Makefile.userprogs +++ b/scripts/Makefile.userprogs @@ -16,10 +16,17 @@ user-csingle := $(addprefix $(obj)/, $(user-csingle)) user-cmulti := $(addprefix $(obj)/, $(user-cmulti)) user-cobjs := $(addprefix $(obj)/, $(user-cobjs))
+user_nolibc_ccflags := -nostdlib -nostdinc -static -fno-ident -fno-asynchronous-unwind-tables \
-ffreestanding -fno-stack-protector \
-isystem $(objtree)/usr/include -include $(srctree)/tools/include/nolibc/nolibc.h -isystem $(srctree)/tools/include/nolibc/
The tools/ directory is a different world, and Kbuild scripts do not know anything about it.
Ack.
How does this statement affect the next patch which creates tools/include/nolibc/Kconfig.nolibc ? Is it fine to create the Kconfig file in tools/ or should I move it? I do want to maintain this file as part of nolibc and not KUnit. The possibilities I see are init/Kconfig.nolibc or lib/Kconfig.nolibc.
Personally I like init/Kconfig.nolibc. (I am even fine with adding this new entry to init/Kconfig) But, this file is not what I maintain. It is up to you after all.
And, you do not need to implement this in scripts/Makefile.userprogs because you can move this to lib/kunit/Makefile.kunit-uapi or somewhere.
Understood. This is not unexpected, as hinted in the commit message.
One existing example is lib/vdso/Makefile.include, which is included from multiple Makefiles.
+user_nolibc_ldflags := -nostdlib -nostdinc -static
user_ccflags = -Wp,-MMD,$(depfile) $(KBUILD_USERCFLAGS) $(userccflags) \
$($(target-stem)-userccflags)
-user_ldflags = $(KBUILD_USERLDFLAGS) $(userldflags) $($(target-stem)-userldflags) -user_ldlibs = $(userldlibs) $($(target-stem)-userldlibs)
$($(target-stem)-userccflags) $(if $($(target-stem)-nolibc),$(user_nolibc_ccflags))
+user_ldflags = $(KBUILD_USERLDFLAGS) $(userldflags) $($(target-stem)-userldflags) \
$(if $($(target-stem)-nolibc),$(user_nolibc_ldflags))
+user_ldlibs = $(userldlibs) $($(target-stem)-userldlibs) \
$(if $($(target-stem)-nolibc),$(user_nolibc_ldlibs))
# Create an executable from a single .c file quiet_cmd_user_cc_c = CC [U] $@
Thomas
-- Best Regards Masahiro Yamada