linux - 添加附加源文件时,Linux 内核模块会忽略主模块文件
问题描述
我正在尝试构建一个包含另一个源文件的可加载内核模块。我在 Makefile 或 Kbuild 文件中有以下内容:
obj-m += mymodule.o
mymodule-y += other_src_file.o
在这种情况下,other_src_file.c
将被编译。奇怪的是,主源文件mymodule.c
不会被编译。故意的语法错误不会被捕获。mymodule.o
仍然会生成一个目标文件,就像.KO
文件一样。在目标平台上加载这个模块没有任何效果。
如果我改为删除包含其他源文件的 Makefile/Kbuild 中的第二行,则会捕获我故意的语法错误。在一个最小的例子中,init_module()
将运行并且 dmesg 显示我放入 printk 的内容。other_src_file.o
尽管未更改,但在删除带有 的行之前它不会打印任何内容。
所以我发现通过包含一个额外的源文件(无论它是否被使用),主模块/C文件被有效地忽略了。生产了一个LKM,但据我所见,它没有任何影响。使用 --debug 确认在后一种情况下mymodule.c
使用(管道到 grep 返回字面上的任何东西),而前者表明没有单个引用mymodule.c
(但很多引用other_src_file.c
)
我也尝试如下设置makefile,但没有行为差异。
obj-m += mymodule.o
mymodule-y += other_src_file.o
all:
make -C ../../../ M=($PWD) modules # -C points to the root of my kernel
clean:
clean -c ../../../ M=$(PWD) clean
的输出make
如下所示:
LD some/path/mymodule/built-in.o
CC[M] /some/path/mymodule/other_src_file.o <-- notice it's the only CC; nothing for mymodule.o
LD[M] /some/path/mymodule/mymodule.o
Building modules, stage 2
MODPOST 1 modules
CC /some/path/mymodule/mymodule.mod.o
LD[M] /some/path/mymodule/mymodule.ko
当其他 src 文件被忽略时,有一行显示mymodule.o
正在编译。
我在 x86_64 上的 Ubuntu 20.04 (VM) 中运行。内核是 3.1.10,make 是 4.2.1。
我觉得我错过了一些简单的东西(不熟悉 linux 构建,相当熟悉 C 和编译)。非常感谢这里的指针。
解决方案
线
obj-m += mymodule.o
告诉KBuild系统只构建一个名为mymodule
.
编译到该模块中的源依赖于变量mymodule-y
:
- 如果变量已设置(如在您的代码中),则源列表仅取自该变量。没有“自动”添加
mymodule.c
源。 - 如果未设置变量,则默认情况下,模块从具有相同名称的源编译。
请注意,不能mymodule
从多个来源构建模块,其中之一是mymodule.c
与模块本身同名。模块或源文件都应该重命名。在那个问题中描述了这种情况。
推荐阅读
- r - 下载数据并添加到 Glob.Env
- javascript - 保存反应文件特殊app.js时Visual Studio代码错误?
- php - Laravel 刀片文件在 VSCode 中以刀片类型打开
- visual-studio - 如何在 VS2019 中隐藏 CodeLens 引用计数?
- asp.net - CKEditor 控件不显示图像
- python - 在 Jupyter Notebook 中运行 Dash 时无法访问站点
- reactjs - 重置 useState([]) Reactjs/recharts 中的值
- graph-databases - 无法让 ArangoSearch 视图在 ArangoDB 中正常工作
- solr - 如果 IndexBasedSpellChecker 和 DirectSolrSpellChecker 具有相同的配置,它们是否都会给出相同的建议?
- database-design - 地图中的 dynamoDB 唯一键值不是分区键