Linux内核模块Makefile学习

在《Linux设备驱动程序》一书中读到的内核模块编译Makefile,不是非常理解,在查询很多资料后,在这里做个总结。

书中Makefile代码:

 1 ifneq  ($(KERNELRELEASE),)
 2 obj-m:=hello.o
 3 else
 4 KDIR := /lib/modules/$(shell uname -r)/build
 5 PWD:=$(shell pwd)
 6 all:
 7     make -C $(KDIR) M=$(PWD) modules
 8 clean:
 9     rm -f *.ko *.o *.symvers *.cmd *.cmd.o
10 endif

代码解析:

1. 判断变量KERNELRELEASE是否设置,该变量在linux内核顶层Makefile中会被设置。当然第一次执行makefile时,KERNELRELEASE未被设置

2. 进入else分支,设置KDIR变量为linux内核源代码路径,PWD为makefile文件所在的路径

3. 执行目标all,命令先执行到make -C $(KDIR),此时,makefile跳转到内核源码顶层,执行所在目录的makefile

4. 命令执行到M=$(PWD),此时回到内核模块makefile所在的路径,第二次执行该makefile,此时KERNELRELEASE已经在执行内核顶层Makefile时被赋值,因此obj-m:=hello.o被执行

5. 内核将hello.o链接成hello.ko,得到我们需要的内核模块

编译多文件:

若内核模块由多个源文件,正确的写法为:

obj-m:=hello.o

hello-objs:=file1.o file2.o file3.o

猜你喜欢

转载自www.cnblogs.com/zhaozhenkai/p/10662764.html