构建 Linux 模块 - sys/time.h:没有这样的文件或目录

构建 Linux 模块 - sys/time.h:没有这样的文件或目录

我正在尝试在我的系统 (Kubuntu 21.10) 中构建一个旧的 Linux 驱动程序make -C ...
驱动程序声明static struct timeval frame_timestamp;

如果我尝试用类似的东西来构建它

make -C /lib/modules/`uname -r`/build M=`pwd` V=1  modules

我遇到了... has an incomplete type ‘struct timeval’错误和其他一些相关错误。
所以我相信我必须将 sys/time.h 包含#include <sys/time.h>在代码中。
但在这种情况下,我得到了fatal error: sys/time.h: No such file or directory。我找不到解决这个问题的方法。(代码已经包含了一些,但没有来自 sys/,它们都来自 linux/ 和 media/)

我最终得到了以下结果Makefile

obj-m := mydriver.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) M=$(PWD) V=1 modules

解析KDIR为 ,/lib/modules/5.13.0-21-generic/build链接到/usr/src/linux-headers-5.13.0-21-generic。没有sys/time.h

locate sys/time.h返回:

/usr/include/i386-linux-gnu/sys/time.h
/usr/include/sys/time.h
/usr/include/x86_64-linux-gnu/sys/time.h

属于libc6-devlibc6-dev-i386:.
dpkg -l *5.13.0-21*得出:

ii  linux-headers-5.13.0-21                5.13.0-21.21 all          Header files related to Linux kernel version 5.13.0
ii  linux-headers-5.13.0-21-generic        5.13.0-21.21 amd64        Linux kernel headers for version 5.13.0 on 64 bit x86 SMP
ii  linux-image-5.13.0-21-generic          5.13.0-21.21 amd64        Signed kernel image generic
un  linux-image-unsigned-5.13.0-21-generic <нет>        <нет>        (описание недоступно)
ii  linux-modules-5.13.0-21-generic        5.13.0-21.21 amd64        Linux kernel extra modules for version 5.13.0 on 64 bit x86 >
ii  linux-modules-extra-5.13.0-21-generic  5.13.0-21.21 amd64        Linux kernel extra modules for version 5.13.0 on 64 bit x86

我尝试硬编码-I /usr/include/x86_64-linux-gnu/-make -C这没有效果。
我还尝试从 kernel.org 下载 vanilla 内核:https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.tar.xz 并将其硬编码为KDIR- 这没有帮助并且也不包含sys/time.h

问题是:如何强制我的模块构建过程看到sys/time.h
Linux 模块是否允许链接到 libc?如果它不是内核的一部分,如何使其可用于模块构建过程?

答案1

sys/time.h好的,看来在内核模块中不能使用。
我查看了驱动程序应该用来初始化其字段的定义,并struct v4l2_buffer在那里找到:linux/videodev2.hstruct timevaltimestamp

truct v4l2_buffer {
    __u32           index;
    __u32           type;
    __u32           bytesused;
    __u32           flags;
    __u32           field;
#ifdef __KERNEL__
    struct __kernel_v4l2_timeval timestamp;
#else
    struct timeval      timestamp;
#endif
    struct v4l2_timecode    timecode;
....

在进程的某个地方自动__KERNEL__定义了make -C,因此最新的内核需要获得__kernel_v4l2_timeval。使用 替换struct timevalstruct __kernel_v4l2_timeval使用其他一些技巧,我得以编译这个旧驱动程序。

相关内容