我正在尝试按照 guide 编译一个简单的 hello world 模块我对 Makefile 实际在做什么感到困惑。
obj-m += hello-1.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
我知道当我键入 make
命令时,它将运行 all
配方,该配方运行 make -C/lib/modules/$(shell uname - r)/build M=$(PWD) 模块
。所以现在它运行在 -C
标志后给出的路径中找到的 Makefile,但是 M=$(PWD) 模块
做什么?
最佳答案
- 'obj-m' :- 指定构建为可加载的目标文件 内核模块。
'all and clean':- 如果您默认运行“make”,它将运行“all :”。 但是我们可以使用 all 和 clean with make。它只会运行那些特定的命令。
Example :- 'make all' will run "make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules" 'make clean will run "make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean"
3.'uname -r' :- 获取当前内核的名称和信息。
Example :- for me, my kernel is "4.6.0-rc1".
选项“-C dir”:- 在阅读 makefile 之前更改目录 dir。
Example :- "make -C /lib/modules/$(shell uname -r)/build" will change to "make -C /lib/modules/4.6.0-rc1/build.
- '$pwd':- 获取当前目录的路径。
现在您想使用“make -C/lib/modules/$(shell uname -r)/build M=$(PWD) modules”创建可加载模块。
您的源代码需要环境才能运行。这就是为什么我们必须使用 -C 选项来更改构建目录。其中包含所有需要的定义、头文件、宏等。现在,在更改到构建目录后,您需要告诉您的模块在哪里,这就是我们使用 M=$PWD 的原因。
关于c - 如何编译内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507320/