在Linux内核5.8.x上构建驱动程序时出现问题

问题描述

我正在使用基于v5.7.x内核而不是最新的v5.8.x发行版的Linux驱动程序。

总而言之,大多数驱动程序是预先构建的,内核接口是在目标上构建的。这涉及到make -f Kbuild命令。

已经检查了所有相关的内核接口文件是否有影响我们的更改,通常该驱动程序将像往常一样在新内核上进行构建。但是,这次我们得到以下错误:

make[2]: *** [scripts/Makefile.modpost:111: /path/to/source/Module.symvers] Error 1
make[1]: *** [Makefile:1669: modules] Error 2
make[1]: Leaving directory '/usr/src/kernels/5.8.0-1.el8.elrepo.x86_64'
make: *** [Kbuild:26: default] Error 2

这来自CentOS 8.1,但在Ubuntu 20.04上也看到了相同的错误。

我不是专家,因此解释这些错误有点困难。我尝试使用KBUILD_VERBOSE标志进行构建,除了直到这一点为止构建成功之外,它实际上并没有提供任何有用的信息。

在以前的内核中,将创建Module.symvers文件,但为空。在5.8上,可能根本没有创建此文件,原因是此错误。结果,未创建.ko文件。

最后,如果我们放入源文件而不是预先构建的.o文件,则构建确实会成功。这些.o文件是使用非常老版本的GCC(4.4.7)生成的,但是我们也尝试过使用更新得多的版本(8.3.1)(与目标计算机的版本相同)进行构建。

我希望您能提出一些检查建议。让我知道是否还有其他细节可以帮助您。

编辑:

我手动在Makefile.modpost上运行make并获得以下输出:

sudo make -f ./scripts/Makefile.modpost
WARNING: Symbol version dump "vmlinux.symvers" is missing.
         Modules may not have dependencies or modversions.
make -f /scripts/Makefile.modfinal
make[1]: Entering directory '/usr/src/linux-headers-5.8.0-050800-generic'
make[1]: /scripts/Makefile.modfinal: No such file or directory
make[1]: *** No rule to make target '/scripts/Makefile.modfinal'. Stop.
make[1]: Leaving directory '/usr/src/linux-headers-5.8.0-050800-generic'
make: *** [scripts/Makefile.modpost:117: __modpost] Error 2

解决方法

我正在回答自己的问题,以防其他人遇到此问题。尽管过去从来都不是问题,但是我们始终会警告说,我们的.o_shipped文件没有对应的.o.cmd文件。这在5.8版以上的内核中似乎很重要,我的解决方法是向Kbuild文件添加一个touch命令(即“ touch .driver.o.cmd”)。这不会删除警告,但允许驱动程序正常构建。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...