【问题标题】:What does the GNU makefile flag "-m" mean, and how does it operate in the line "Obj -m += simple.o"?GNU makefile 标志“-m”是什么意思,它如何在“Obj -m += simple.o”行中运行?
【发布时间】:2019-01-18 19:24:27
【问题描述】:

我正在学习操作系统课程,我们被要求解释给定 makefile 的语法。但是,我无法理解内容:

Obj -m += simple.o

all:
        make -C/lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C/lib/modules/$(shell uname -r)/build M=$(PWD) clean

我不明白的主要部分是第一行。据我所知,“Obj”是一个变量名“-m”是一个标志“+=”是连接运算符“simple.o”是目标文件。即使我知道这些部分,我也不知道这条线是做什么的。我进行了广泛搜索,但找不到“-m”标志的任何解释。它只出现在一个列表中,说明编译器知道忽略它,请参阅此处https://www.gnu.org/software/make/manual/html_node/Options-Summary.html。有人可以解释一下这条线的含义和作用吗?

感谢您的帮助。

【问题讨论】:

  • 您的第一行打错了。这是 make 中的语法错误,这可能是您不理解它的原因。我敢肯定,在您给定的 makefile 中,它实际上是 Obj-m += simple.oObj-m 之间没有空格)。
  • 在任何情况下,-m 选项都会被忽略,具体取决于您链接到的页面;如果不是,这将不是您启用它的方式。
  • 谢谢,这很有道理。我习惯于看到由 -(flag) 表示的标志,我认为 -m 一定是一个标志。

标签: gnu-make gnu option flags


【解决方案1】:

这是一个用于内核树外模块的Linux kbuild makefile。正如@MadScientist 指出的那样,您的第一行应该是

obj-m += simple.o

在 Linux kbuild 上下文中,这意味着“编译并将 simple.c 链接到模块”。目标all(默认目标)将针对您当前运行的内核版本构建模块。

注意:您需要安装内核开发头文件才能成功构建模块。

编辑:在 Linux 内核树中,您还可以找到符号 obj-y += X,意思是“在启用此内核配置后将 X 编译并链接到内核中”。

【讨论】:

  • 感谢您提供链接并解释这一行,它真的很有帮助!我编译了makefile并将其成功添加到内核中。据我了解,假设 obj-m 是我创建的模块并且 obj-y 是已经是内核一部分的模块,我是否正确?因此,如果我使用 obj-y 这意味着我正在修改现有模块,而不是创建新模块?
  • 您不能在内核源代码树之外使用obj-y,因为内核已经链接。我忘了说实际用法通常是obj-$(CONFIG_XYZ),即当CONFIG_XYZ 设置为y 时,该对象将被添加到内核中。如果它设置为m,该对象将进入内核模块。如果设置为n,则不会构建对象。
  • 我根据你的 cmets 做了更多的研究,我想我现在明白了其中的区别。 “obj-y”表示程序将作为静态程序添加到内核的配置目录中,因此它会在每次内核启动时运行,作为它的一部分。 “obj-m”表示程序将被创建为内核模块并根据需要动态调用(添加/删除)。是这样吗?
  • obj-y 对象将直接链接到内核二进制文件中,即vmlinux。但除此之外,我认为你明白了。
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多