【问题标题】:Linux Kernel Module ignores main module file when an additional source file is added [duplicate]添加其他源文件时,Linux内核模块会忽略主模块文件[重复]
【发布时间】: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.omymodule-objs := mymodule_main.o other_src_file.o

标签: linux makefile linux-kernel kernel-module kbuild


【解决方案1】:

线

obj-m += mymodule.o

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

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

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

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

【讨论】:

  • 谢谢,这很有帮助。这解决了我的问题。我在发布此内容几个小时后发现了您链接的问题。我确定这在用于模块构建的文档中,但从最初的解析来看并不是特别明显。
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
相关资源
最近更新 更多