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

在Linux内核5.8.x上构建驱动程序时出现问题,linux,linux-kernel,driver,linux-device-driver,kbuild,Linux,Linux Kernel,Driver,Linux Device Driver,Kbuild,我使用的Linux驱动程序是基于v5.7.x内核构建的,但不是最新的v5.8.x版本 总之,大多数驱动程序都是预构建的,内核接口是在目标上构建的。这涉及一个make-f Kbuild命令 在检查了所有相关的内核接口文件是否有任何会影响我们的更改后,通常驱动程序会像往常一样在新内核上构建。但是,这次我们得到以下错误: make[2]: *** [scripts/Makefile.modpost:111: /path/to/source/Module.symvers] Error 1 make[1]

我使用的Linux驱动程序是基于v5.7.x内核构建的,但不是最新的v5.8.x版本

总之,大多数驱动程序都是预构建的,内核接口是在目标上构建的。这涉及一个
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.cmd文件不存在于我们的.o_文件中。这在内核5.8以后的版本中似乎很重要,我的修复方法是在Kbuild文件中添加一个touch命令(即“touch.driver.o.cmd”)。这不会删除警告,但允许驾驶员正常构建。

我在回答我自己的问题,以防它帮助其他人解决此问题。尽管在过去这从来不是一个问题,但我们总是收到一个警告,即对应的.o.cmd文件不存在于我们的.o_文件中。这在内核5.8以后的版本中似乎很重要,我的修复方法是在Kbuild文件中添加一个touch命令(即“touch.driver.o.cmd”)。这不会删除警告,但允许驱动程序按正常方式构建。

消息中是否确实包含/patch/to/source/?!modpost根据内核配置构建modpost并运行它。modpost正在失败,应该将问题记录到stderr。谢谢@stark。在模块构建过程中,我看到的唯一错误是我上面帖子中的错误。但是,我确实尝试手动构建Makefile.modpost,并用输出更新了我的帖子。我的5.8副本有/scripts/Makefile.modfinal$srctree需要在调用它时定义。消息中是否真的有/patch/to/source/?!modpost根据内核配置构建modpost并运行它。modpost正在失败,应该将问题记录到stderr。谢谢@stark。在模块构建过程中,我看到的唯一错误是我上面帖子中的错误。但是,我确实尝试手动构建Makefile.modpost,并用输出更新了我的文章。我的5.8副本具有/scripts/Makefile.modfinal$srctree,需要在调用它时定义它。虽然我不必添加
cmd
文件,我必须指定一个虚拟文件
makemodulesymfile=src/Module.symvers
虽然我不必添加
cmd
文件,但我必须指定一个虚拟文件
makemodulesymfile=src/Module.symvers