Ala*_*ark 4 linux driver linux-device-driver linux-kernel kbuild
我正在使用基于 v5.7.x 内核构建的 Linux 驱动程序,但不是基于最新的 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
Run Code Online (Sandbox Code Playgroud)
这是来自 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
Run Code Online (Sandbox Code Playgroud)
我正在回答我自己的问题,以防它可以帮助其他人解决这个问题。尽管这在过去从来不是问题,但我们总是收到一条警告,指出我们的 .o_shipped 文件不存在相应的 .o.cmd 文件。这在内核 5.8 及以后版本中似乎很重要,我的修复方法是向 Kbuild 文件添加 touch 命令(即“touch .driver.o.cmd”)。这不会消除警告,但它允许驱动程序正常构建。
| 归档时间: |
|
| 查看次数: |
7467 次 |
| 最近记录: |