Linux 添加附加源文件时,内核模块忽略主模块文件

Linux Kernel Module ignores main module file when an additional source file is added

我正在尝试构建一个包含另一个源文件的可加载内核模块。我在 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 的行之前它不会打印任何内容。

所以我发现,通过包含一个额外的源文件(无论它是否被使用),主要的 module/C 文件被有效地忽略了。产生了一个LKM,但据我所见,它没有任何作用。在后一种情况下使用 --debug 确认使用了 mymodule.c (管道进入 grep returns 字面上任何东西)而前者表明没有对 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,它具有 与模块本身同名。 应重命名模块或源文件。 that question.

中描述了这种情况