Linux一个Makefile编译多个内核驱动

:= 表示直接赋值,赋予当前位置的值。
+= 表示将等号后面的值添加到前面的变量上。
?=表示如果该变量没有被赋值,则赋予等号后的值。

需要在同一个Makefile文件中要编译两个内核驱动模块,每个驱动依赖多个源文件,实现方法如下所示。

obj-m := module_01.o module_02.o

module_01-y := file_01.o file_02.o
module_02-y := file_03.o file_04.o

也可以下面这样写

obj-m += module_01.o
obj-m += module_02.o

module_01-y += file_01.o
module_01-y += file_02.o

module_02-y += file_03.o
module_02-y += file_04.o

注意事项:低版本Make工具链模块名不能与依赖-y文件同名,如下所示:

obj-m := module_01.o

module_01-y := module_01.o

使用实例:

BASEINCLUDE ?= /lib/modules/`uname -r`/build

obj-m += kprobe.o
obj-m += kretprobe.o

kprobe-y := kprobe_example.o 
kretprobe-y := kretprobe_example.o 

all : 
        $(MAKE) -C $(BASEINCLUDE) M=$(PWD) modules;

clean:
        $(MAKE) -C $(BASEINCLUDE) M=$(PWD) clean;
        rm -f *.ko;
curtis@curtis-PC:~/work/write_code/kmodule/kprobe_example$ ll
总用量 24
-rw-r--r-- 1 curtis curtis 2087 214 07:51 example.c
-rwxr-xr-x 1 curtis curtis  353 214 07:51 hello_world.c
-rw-r--r-- 1 curtis curtis 3139 214 07:51 kprobe_example.c
-rw-r--r-- 1 curtis curtis 3074 214 07:51 kretprobe_example.c
-rwxr-xr-x 1 curtis curtis  272 226 11:19 Makefile
-rw-r--r-- 1 curtis curtis 1688 214 07:51 test_args_pass.c
curtis@curtis-PC:~/work/write_code/kmodule/kprobe_example$ make
make -C /lib/modules/`uname -r`/build M=/home/curtis/work/write_code/kmodule/kprobe_example modules;
make[1]: 进入目录“/usr/src/linux-headers-5.15.77-amd64-desktop”
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (Uos 8.3.0.6-1+dde) 8.3.0
  You are using:           gcc (Uos 8.3.0.3-3+rebuild) 8.3.0
  CC [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kprobe_example.o
  LD [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kprobe.o
  CC [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kretprobe_example.o
  LD [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kretprobe.o
  MODPOST /home/curtis/work/write_code/kmodule/kprobe_example/Module.symvers
  CC [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kprobe.mod.o
  LD [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kprobe.ko
  CC [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kretprobe.mod.o
  LD [M]  /home/curtis/work/write_code/kmodule/kprobe_example/kretprobe.ko
make[1]: 离开目录“/usr/src/linux-headers-5.15.77-amd64-desktop”
curtis@curtis-PC:~/work/write_code/kmodule/kprobe_example$ ll
总用量 1824
-rw-r--r-- 1 curtis curtis   2087 214 07:51 example.c
-rwxr-xr-x 1 curtis curtis    353 214 07:51 hello_world.c
-rw-r--r-- 1 curtis curtis   3139 214 07:51 kprobe_example.c
-rw-r--r-- 1 curtis curtis 228744 226 11:19 kprobe_example.o
-rw-r--r-- 1 curtis curtis 334920 226 11:19 kprobe.ko	# 第一个模块
-rw-r--r-- 1 curtis curtis     70 226 11:19 kprobe.mod
-rw-r--r-- 1 curtis curtis    634 226 11:19 kprobe.mod.c
-rw-r--r-- 1 curtis curtis 107744 226 11:19 kprobe.mod.o
-rw-r--r-- 1 curtis curtis 228752 226 11:19 kprobe.o
-rw-r--r-- 1 curtis curtis   3074 214 07:51 kretprobe_example.c
-rw-r--r-- 1 curtis curtis 233456 226 11:19 kretprobe_example.o
-rw-r--r-- 1 curtis curtis 339712 226 11:19 kretprobe.ko	# 第二个模块
-rw-r--r-- 1 curtis curtis     73 226 11:19 kretprobe.mod
-rw-r--r-- 1 curtis curtis    634 226 11:19 kretprobe.mod.c
-rw-r--r-- 1 curtis curtis 107768 226 11:19 kretprobe.mod.o
-rw-r--r-- 1 curtis curtis 233464 226 11:19 kretprobe.o
-rwxr-xr-x 1 curtis curtis    272 226 11:19 Makefile
-rw-r--r-- 1 curtis curtis    127 226 11:19 modules.order
-rw-r--r-- 1 curtis curtis      0 226 11:19 Module.symvers
-rw-r--r-- 1 curtis curtis   1688 214 07:51 test_args_pass.c
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核中,通常有许多头文件和源文件需要编译成.ko(内核对象)文件,以实现对特定功能或驱动程序的支持。 首先,头文件包含了函数和数据结构的声明,被其他源文件引用。这些头文件通常以.h文件扩展名结尾。源文件则包含了函数和数据结构的实现,通常以.c或.cpp文件扩展名结尾。 为了将多个头文件和源文件编译成.ko文件,使用Makefile一个常见的方法。Makefile一个文本文件,包含了一系列的规则,指定了文件的依赖关系以及编译和链接的命令。 Makefile中的规则通常包括以下几个步骤: 1. 定义目标文件(.ko文件)的名称和相关的编译选项。 2. 定义依赖关系,即指定哪些源文件和头文件需要进行编译。 3. 定义编译命令,通常使用gcc或其他编译器执行编译操作。例如,可以使用gcc -c命令将源文件编译成目标文件(.o文件)。 4. 定义链接命令,将所有目标文件链接成一个.ko文件。例如,可以使用gcc -o命令将所有目标文件链接成一个.ko文件。 在执行Makefile时,会根据规则的定义逐步执行编译和链接的操作,生成最终的.ko文件。同时,Makefile还可用于指定其他操作,例如清除中间文件或执行其他自定义操作。 总而言之,将多个头文件和源文件编译成.ko文件可以通过使用Makefile来定义编译和链接的规则,并将其作为输入参数传递给编译器。Makefile中的规则会根据文件的依赖关系逐步执行编译和链接的操作,最终生成所需的.ko文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值