【发布时间】:2021-11-20 23:53:17
【问题描述】:
我正在尝试构建一个包含另一个源文件的可加载内核模块。我在 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⏎mymodule-objs := mymodule_main.o other_src_file.o。
标签: linux makefile linux-kernel kernel-module kbuild