我是内核开发的新手。我试图了解Hello World的以下makefile!程序。但我无法完全弄明白。
obj-m += hello.o
all:
sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
我无法理解' obj-m + = hello.o' 。我知道这里的意思是模块,就是这样。
另外,为什么我们没有定义hello.o
的依赖关系最后,我无法完全弄清楚所有的定义编译规则:and clean:
任何帮助都将受到高度赞赏。!!
答案 0 :(得分:2)
obj-m
是一个Makefile变量。它实际上由两部分组成:' obj '意味着引用的目标是一个内核对象,而' m ' part意味着对象将像模块一样构建。
内核构建规则考虑了该变量。由于内核模块遵循某种约定,运行Makefile将导致从源文件hello.ko
创建模块hello.c
(如果一切正常)。
' obj '变量也可以采用不同的后缀。例如' obj-y '将尝试将引用的对象链接到主内核映像,而不是创建模块。后缀也可以引用内核.config
文件变量,如下所示:
obj-$(CONFIG_HOTPLUG) += hotplug.o
在这种情况下,如果CONFIG_HOTPLUG
设置为' y ' hoplug对象将被编译到主内核中;如果设置为' m'然后将创建一个单独的hotplug.ko
可加载模块。如果没有设置为任何内容(导致' obj - '),将彻底省略hotplug。