linux 编译不同内核的模块
内核模块 (kernel module) 的编译环境配置会根据发行版的不同而不同,即使是 Ubuntu 和 Debian 也可能有细微的区别。
0x00 安装软件包
对于 Debian 来说,只需要安装 Linux Header 即可进行 module 的编译。
$ sudo apt-get install linux-headers-$(uname -r)
如果需要内核源码,可以参考链接 2。
0x01 编译 module
进行简单的编译测试。
准备 hello.c
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_ALERT "Hello, worldn");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT "Exit, module.n");
}
module_init(hello_init);
module_exit(hello_exit);
内核模块的编译重点在 Makefile 上。需要注意的是,make 对应的 makefile 文件的名称必须为Makefile,全部小写的 makefile 是不行的。
# File name: Makefile
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) module
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
除了使用 modules 参数构建模块之外,我们还可以使用 clean 参数方便的配置清理函数。
在 hello.c 的所在目录执行make进行编译即可。
详细信息参考链接 3。《Linux 设备驱动程序》中的 Makefile 更认真一些。
0x02 其他
在更新内核版本后,uname -r会发生变动,导致 Makefile 使用的/lib/modules/$(shell uname -r)/build指向新的内核构建目录.
但是 linux-header 的安装包同样是使用uname -r安装的,并不会随着内核更新同步更新 (事实上你可以使用 apt 安装任意版本的 linux-header).
解决办法是安装新的 linux-header,即重新执行步骤 0x01 即可.
Referenced from:https://www.dazhuanlan.com/xthsky/topics/1197635
本文链接地址:https://const.net.cn/605.html