Linux内核模块编译:makefile详解

需积分: 49 1 下载量 176 浏览量 更新于2024-09-01 收藏 19KB DOCX 举报
"内核态makefile指南:讲解如何编译Linux内核模块,包括编译进内核的模块和可加载模块的配置方法,以及处理多个文件依赖的编译规则。指南强调了编译选项的变化,如EXTRA_CFLAGS等变量的替换,并提供了一个最简单makefile的示例。" 在Linux内核开发中,`makefile`扮演着至关重要的角色,它负责编译和链接内核模块。内核态`makefile`的编写是确保模块正确构建的关键步骤。本指南聚焦于如何编写内核态`makefile`以支持模块的编译。 首先,有两种主要的编译模式:将模块编译进内核(`obj-y`)和编译成可加载模块(`obj-m`)。`obj-y`用于将模块静态编入内核镜像,而`obj-m`则用于创建可加载的`.ko`模块文件,这些文件可以在需要时动态加载到内核中。例如,`obj-y+=foo.o`会将`foo.o`编译进内核,而`obj-m+=foo.o`则会将其编译为可加载模块`foo.ko`。 如果一个模块依赖于多个源文件,可以使用类似`foo-y:=a.o b.o c.o`这样的指令,这告诉`make`程序`foo.o`是由`a.o`, `b.o`, `c.o`链接生成的。在实际编译过程中,`ld`工具的`-r`选项用于合并这些目标文件为单个模块。 在较新的内核版本中,编译选项已从`EXTRA_CFLAGS`, `EXTRA_AFLAGS`和`EXTRA_LDFLAGS`更改为`ccflags-y`, `asflags-y`和`ldflags-y`,分别对应于C编译器、汇编器和链接器的选项。这些变量允许开发者添加特定的编译和链接标志,以满足模块的特殊需求。 一个最简单的内核模块`makefile`如下所示: ```makefile obj-m+=hello.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 ``` 这个`makefile`将编译`hello.c`并生成`hello.ko`。`obj-m+=hello.o`声明了`hello.o`是一个可加载模块,`all`和`clean`目标分别用于编译和清理项目。`-C`选项指定使用内核源代码树中的`make`,而`M=$(PWD)`设置了当前工作目录,使得`make`能够找到模块的源文件。 `makefile`的自动推导功能在这里也得到了体现,即使没有明确指定`hello.c`,`make`也能自动寻找并编译它,只要该文件存在于同一目录下。这就是`makefile`的简洁和强大之处,它允许开发者专注于模块的功能实现,而不是编译过程的细节。