一、makefile脚本
KERN_DIR = ../../linux-4.9.84/
ARCH := arm
CROSS_COMPILE := arm-buildroot-linux-uclibcgnueabihf-
EXTRA_CFLAGS += -Werror
MODULE_NAME = alex_main
EXTRA_CFLAGS += -I$(PWD)/include/kernel -I$(PWD)/include/usr
EXTRA_LDFLAGS += --strip-debug
EXTRA_CFLAGS += -Werror
$(CONFIG_MS_GPIO)=y
obj-m += ${MODULE_NAME}.o
${MODULE_NAME}-y += radio/radio.o
${MODULE_NAME}-$(CONFIG_MS_GPIO) += maindev.o
$(MODULE_NAME)-objs += alex.o
.PHONY: modules clean
modules:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERN_DIR) M=$(shell pwd) modules
clean:
rm -rf *.ko *.o *.mod.c *.mod.o */*.o
rm -f modules.order
rm -f Module.symvers
rm -rf .tmp_versions
rm -f .*o.cmd */.*.o.cmd
(1)KERN_DIR = ../../linux-4.9.84/
用来定位用于编译驱动的内核源码的目录位置。可以用下面的格式传递进去
make -C ../../linux-4.9.84/
(2)-C表示kernel source目录,PC机上对应的目录/lib/modules/<uname -r>/build(在这里可以找到kernel最高级的makefile),M=表示在建立模块target的时候,makefile回归到我们模块程序的目录。
(3)obj-m := ${MODULE_NAME}.o
表面驱动模块从目标文件${MODULE_NAME}.o建立,从目标文件建立后,模块的名字为${MODULE_NAME}.ko
(4)${MODULE_NAME}-$(CONFIG_MS_GPIO) += maindev.o
如果模块由N个文件组成,那么其他文件就应该描述如下:${MODULE_NAME}-y += file1.o file2.o。可以通过选择CONFIG_MS_GPIO是y还是n选择是否编译后面的文件 。
(5)如果我们有多个c文件,$(MODULE_NAME)-objs += file1.o file2 alex.o 可以以这种方式添加。其中-objs前面的参数是模块名。在test-objs参数中加入他们的obj文件。接下来就是make了,编译后,生成hello.o文件和hello.ko,还有hello.mod.c及其obj文件,Module.markers Module.sysvers Modules.order 文件。
此处对多个*.c文件情况做一个说明:我们希望创建一个模块的名字叫做hello,我们有三个*.c文件,分别为hello.c, file1.c和file2.c。这样是有问题的,因为在Makefile中obj-m := hello.o,这是指定模块的名称。hello-objs := file1.o file2.o hello.o,这里是说hello模块包括的的obj文件,如果我们在里面不填写hello.o,那么实际并没有编译hello.c。如果我们在这里填写了hello.o,那么在obj-m和hello-objs中都含有hello.o,对make来讲会产生循环和混淆,因此也不能这样书写。如果由多个C文件来构造一个模块,那么C文件的名字不能和模块名字一样。在这个例子中可以将hello.c改名为hello_main.c,在Makefile中obj-m := hello.o,hello-objs = file1.o file2.o hello_main.o。
二、生成ko模块后的处理
ko文件生成后一般都包含各种调试信息,以下命令可以查看。发布产品时,需要使用strip命名删除调试信息,给ko文件瘦身。
readelf -s xxx.ko
strip:
$(CROSS_COMPILE)strip $(MODULE_NAME).ko --strip-unneeded --strip-debug
--strip-debug
Remove debugging symbols only.
--strip-unneeded
Remove all symbols that are not needed for relocation processing.
参考博客