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

kbuild: prevent exported headers from including <stdlib.h>, <stdbool.h>

Some UAPI headers included <stdlib.h>, like this:

#ifndef __KERNEL__
#include <stdlib.h>
#endif

As it turned out, they just included it for no good reason.

After some fixes, now I can compile-test UAPI headers
(CONFIG_UAPI_HEADER_TEST=y) without including <stdlib.h> from the
system header search paths.

To avoid somebody getting it back again, this commit adds the dummy
header, usr/dummy-include/stdlib.h

I added $(srctree)/usr/dummy-include to the header search paths.
Because it is searched before the system directories, if someone
tries to include <stdlib.h>, they will see the error message.

While I am here, I also replaced $(objtree)/usr/include with $(obj),
but it has no functional change.

If we can make kernel headers self-contained (that is, none of exported
kernel headers includes system headers), we will be able to add the
-nostdinc flag, but that is much far from where we stand now.

As a realistic solution, we can ban header inclusion individually by
putting a dummy header into usr/dummy-include/.

Currently, no header include <stdbool.h>. I put it as well before somebody
attempts to use it.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Masahiro Yamada and committed by
Arnd Bergmann
02a6e4be 783eb354

+15 -1
+7
usr/dummy-include/stdbool.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + #ifndef _STDBOOL_H 3 + #define _STDBOOL_H 4 + 5 + #error "Please do not include <stdbool.h> from exported headers" 6 + 7 + #endif /* _STDBOOL_H */
+7
usr/dummy-include/stdlib.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + #ifndef _STDLIB_H 3 + #define _STDLIB_H 4 + 5 + #error "Please do not include <stdlib.h> from exported headers" 6 + 7 + #endif /* _STDLIB_H */
+1 -1
usr/include/Makefile
··· 15 15 # USERCFLAGS might contain sysroot location for CC. 16 16 UAPI_CFLAGS += $(USERCFLAGS) 17 17 18 - override c_flags = $(UAPI_CFLAGS) -Wp,-MMD,$(depfile) -I$(objtree)/usr/include 18 + override c_flags = $(UAPI_CFLAGS) -Wp,-MMD,$(depfile) -I $(obj) -I $(srctree)/usr/dummy-include 19 19 20 20 # The following are excluded for now because they fail to build. 21 21 #