internal / external include files
Dear all, is it correct that the files under include/uapi/ can be included by a user space application? I just ran into an error where my application ended up including include/uapi/linux/stddef.h (with a number of intermediate steps). This fails because the kernel's stddef.h includes include/linux/compiler_types.h and this file is internal to the kernel. What is the correct way to solve this? Should I fix my include path to make sure that my application picks the stddef.h in the compiler's sysroot rather than the kernel's stddef.h? Or should include/uapi/linux/stddef.h guard the kernel-internal parts using #ifdef __KERNEL__? Thanks, Martin
On Wed, Jul 24, 2019 at 11:11:00AM +0200, Martin Kaiser wrote:
Dear all,
is it correct that the files under include/uapi/ can be included by a user space application?
Yes.
I just ran into an error where my application ended up including include/uapi/linux/stddef.h (with a number of intermediate steps).
That's odd, what did you ask to be included that caused that?
This fails because the kernel's stddef.h includes include/linux/compiler_types.h and this file is internal to the kernel.
What kernel version did this happen for?
What is the correct way to solve this? Should I fix my include path to make sure that my application picks the stddef.h in the compiler's sysroot rather than the kernel's stddef.h?
The system stddef.h should always be used "first".
Or should include/uapi/linux/stddef.h guard the kernel-internal parts using #ifdef __KERNEL__?
There should no longer be any need for that. thanks, greg k-h
Thus wrote Greg KH (greg@kroah.com):
That's odd, what did you ask to be included that caused that?
I called gcc with -I $KERNEL_ROOT/include/uapi. This is the chain of files that were included. my_app.c $GCC_SYSROOT/usr/include/netinet/in.h $GCC_SYSROOT/usr/include/sys/socket.h $KERNEL_ROOT/include/uapi/asm-generic/socket.h $KERNEL_ROOT/include/uapi/linux/posix_types.h $KERNEL_ROOT/include/uapi/linux/stddef.h and the error is $KERNEL_ROOT/include/uapi/linux/stddef.h:2:34: fatal error: linux/compiler_types.h: No such file or directory #include <linux/compiler_types.h>
This fails because the kernel's stddef.h includes include/linux/compiler_types.h and this file is internal to the kernel.
What kernel version did this happen for?
I get the error with today's linux-next tree. 4.14 is fine.
What is the correct way to solve this? Should I fix my include path to make sure that my application picks the stddef.h in the compiler's sysroot rather than the kernel's stddef.h?
The system stddef.h should always be used "first".
My understanding of the gcc manual is that directories specified with -I are searched before the system directories. https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Directory-Options.html#Director... So it seems that -I /my/kernel/include/uapi is not a good idea since the kernel's include files take precedence then. Best regards, Martin
Hi, Martin. The [$KERNEL_ROOT/include/uapi/linux/stddef.h] you are talking about is just a few lines: | #include <linux/compiler_types.h> | | #ifndef __always_inline | #define __always_inline inline | #endif it turns into | #ifndef __always_inline | #define __always_inline inline | #endif after [make headers_install] installs it into [/usr/include/linux/stddef.h]. Userspace applications shall not use kernel tree directly. Regards, Konstantin. Martin Kaiser, 25 jul 2010 00:20 msk:
I called gcc with -I $KERNEL_ROOT/include/uapi. This is the chain of files that were included.
my_app.c $GCC_SYSROOT/usr/include/netinet/in.h ...
and the error is
$KERNEL_ROOT/include/uapi/linux/stddef.h:2:34: fatal error: linux/compiler_types.h: No such file or directory #include <linux/compiler_types.h>
Best regards, Martin
participants (3)
-
Greg KH -
Konstantin Andreev -
Martin Kaiser