gcc 如何在没有内核文件的情况下编译Linux内核模块?

fcy6dtqo  于 2023-03-08  发布在  Linux
关注(0)|答案(1)|浏览(205)

我正在做一个项目,我们需要开发/修改一个linux驱动程序,它与其他非内核代码交互,所以我希望能够在相同的框架中编译驱动程序代码作为其余的代码(也保持在相同的存储库中,等等)。
一旦编译了内核(清除了不必要的文件后为800 MB),我就可以轻松地编译驱动程序,生成一个.ko文件,我可以将其复制到系统中并使用insmod my_driver.ko安装。
然而,我使用的内核永远不会改变,所以每次我编译驱动程序的更新时,make都要花费几毫秒的时间,因为毕竟它所做的唯一事情就是检查内核文件是否保持不变,获取用于驱动程序编译的文件/内核信息,然后它就编译驱动程序(也许这个假设是错误的,但无论如何我想我可以肯定地说,即使make实际上是在阅读/使用文件,它们也只是一小堆)。
因此,我想知道是否有一种方法可以“欺骗”make工具(或创建自定义Makefile),假装检查内核文件,而只是硬编码编译驱动程序所需的内核信息。
这个想法是在我的存储库中只放置最少数量的文件来编译驱动程序,而不必:

  • 将整个内核存储在我的本地repo中(gitignored ofc)
  • 每次我/任何人在新环境(即PC)中处理我的项目时,下载并编译内核

我知道 * 有一种方法 *,因为所有的代码都可以逐行复制。问题是,有人知道一种聪明的方法来实现这一点,而不必逐行调试整个make过程来生成自定义脚本/make吗?
PS:运行linux内核和驱动程序的硬件不是PC,因此交叉编译。
我的驱动程序的Makefile非常简单,经典的make -C '$(LINUX_DIR)' M='$(SRC)' ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules。这调用了Linux内核目录中的Makefile,我曾尝试手动更改,但没有效果。当我删除一些部分时,大多数错误都与目录/文件不存在,配置丢失,我不能说我已经广泛地尝试了-内核构建Makefile是1700行长,我不是makeMaven,所以我决定在浪费太多时间之前问一下。
我知道,如果不问具体的代码问题或make行,你就不能说太多,但我是在相当笼统地问,如果有人知道这是否可能,或者关于一个项目做类似的事情,等等。
我读过一些帖子,比如this one,但是没有一篇(我找到的)提到“skip-kernel-files-check”部分;相反,他们都只是要求没有内核的编译。为了澄清,在这里我问如何,有内核,减少内核文件的数量(理想的是0)或简单地跳过内核检查和硬编码的内核信息(我承认这是一个必须的驱动程序编译),以便我可以定期编译我的驱动程序在文件方面的清洁,轻量级,相对可移植的方式。
here这样的帖子中,一些答案提到只需要一份“内核头文件和一些基本的构建工具”,但是我找不到很多关于这个主题的易懂的文献。如果有人能证实这是可能的,或者给我一些文档,我会很感激。在this的其他帖子中,我尝试了:
/usr/bin/arm-linux-gnueabi-gcc -DMODULE -D__KERNEL__ -isystem ../linux-build/build/include -c my_driver.c -o my_driver.ko
但是,像其他用户在帖子中评论,我得到了错误fatal error: asm/linkage.h: No such file or directory.此外,我不知道gcc命令是交叉编译还是隐式的,当使用ARM gcc编译和传递linux内核包含.顺便说一下,../linux-build/build是编译的内核文件所在的地方,它的父包含其他编译的东西(例如dgb,nano,my_driver).

ccrfmcuu

ccrfmcuu1#

您需要使用headers_install make目标。这将生成并安装头文件,以便能够在指定位置编译内核模块。默认安装在./usr中,您可以使用INSTALL_HDR_PATH变量更改此设置。
完整文档如下:https://www.kernel.org/doc/Documentation/kbuild/headers_install.txt

相关问题