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.
中描述了这种情况
我正在尝试构建一个包含另一个源文件的可加载内核模块。我在 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.