首页 > 解决方案 > 添加附加源文件时,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 和编译)。非常感谢这里的指针。

标签: linuxmakefilelinux-kernelkernel-modulekbuild

解决方案


线

obj-m += mymodule.o

告诉KBuild系统只构建一个名为mymodule.

编译到该模块中的源依赖于变量mymodule-y

  • 如果变量已设置(如在您的代码中),则源列表取自该变量。没有“自动”添加mymodule.c源。
  • 如果未设置变量,则默认情况下,模块从具有相同名称的源编译。

请注意,不能mymodule多个来源构建模块,其中之一是mymodule.c与模块本身同名。模块或源文件都应该重命名。在那个问题中描述了这种情况。


推荐阅读