我正在尝试编译第 3 方专有驱动程序模块,但失败了。我已经安装了这个linux-headers-5.4.0
包,但是我不知道如何编写一个可以成功使用它的 gcc 命令行。
作为一个最小的例子,考虑一下test.c
,它实际上只包含内核头文件。
#include <asm/linkage.h>
#include <linux/module.h>
因为内核包含这两个文件,并且可以自己编译,所以肯定有一些 GCC 标志的组合会导致test.c
编译。专有驱动程序.c
文件包括这两个文件以及许多其他文件,但它们足以证明我的问题。
eyes=(
-I/usr/src/linux-headers-5.4.0-21/include # for linux/module.h
-I/usr/src/linux-headers-5.4.0-21/arch/x86/include # for asm/linkage.h
)
gcc -c "${eyes[@]}" test.c
结果是
In file included from /usr/src/linux-headers-5.4.0-21/include/linux/seqlock.h:36,
from /usr/src/linux-headers-5.4.0-21/include/linux/time.h:6,
from /usr/src/linux-headers-5.4.0-21/include/linux/stat.h:19,
from /usr/src/linux-headers-5.4.0-21/include/linux/module.h:10,
from test.c:2:
/usr/src/linux-headers-5.4.0-21/include/linux/spinlock.h:60:10: fatal error: asm/mmiowb.h: No such file or directory
60 | #include <asm/mmiowb.h>
| ^~~~~~~~~~~~~~
dpkg -L linux-headers-5.4.0-21 | grep mmiowb.h
include/asm-generic
在和 中显示此文件arch/{ia64,mips,powerpc,riscv,sh}/include/asm
。进一步调整我-I
以包括其中之一,并且错误移动到:
In file included from /usr/src/linux-headers-5.4.0-21/include/linux/mmzone.h:19,
from /usr/src/linux-headers-5.4.0-21/include/linux/gfp.h:6,
from /usr/src/linux-headers-5.4.0-21/include/linux/umh.h:4,
from /usr/src/linux-headers-5.4.0-21/include/linux/kmod.h:9,
from /usr/src/linux-headers-5.4.0-21/include/linux/module.h:13,
from test.c:2:
/usr/src/linux-headers-5.4.0-21/include/linux/page-flags-layout.h:6:10: fatal error: generated/bounds.h: No such file or directory
6 | #include <generated/bounds.h>
| ^~~~~~~~~~~~~~~~~~~~
这个文件在我的系统上根本不存在,但是有一个名为的文件/usr/src/linux-headers-5.4.0-21/KBuild
,它看起来像一个会创建它的makefile,尽管我不知道如何调用这个makefile。
我该如何继续?安装后是否需要运行命令linux-headers-*
来填充generated
文件夹?在某处网上有这种事情的指南吗?
Linux 内核有自己的基于 的构建系统
make
,它为成功编译内核组件和模块生成正确的gcc
选项。外部内核模块中包含的Kbuild
文件旨在与该内核构建系统一起使用。此外,外部内核模块还应该包括一个Makefile
调用内核构建系统的模块。Makefile
外部模块的最小值可能如下所示:如您所见,
Makefile
内核构建系统的主要内容实际上位于文件夹/lib/modules/$(KVERSION)/build
中,其中$(KVERSION)
是您要构建的内核的版本号。如果你很好奇,你可以尝试追溯 Makefile 的网格做了什么,以及它最终调用的选项集gcc
。