当前位置: 首页 > 工具软件 > ko-build > 使用案例 >

编译驱动ko,多个.c文件情况下,怎么写makefile

郭恩
2023-12-01

一、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.

参考博客

https://blog.csdn.net/zengxianyang/article/details/50710695

https://blog.csdn.net/p1279030826/article/details/108040129

 类似资料: