为内核模块编写 makefile

Posted

技术标签:

【中文标题】为内核模块编写 makefile【英文标题】:Writing a makefile for a kernel module 【发布时间】:2015-06-04 12:08:39 【问题描述】:

我想写一个内核模块,现在我已经写了一些文件:a.c、b.c、b.h 和 d.h。

a.c 包括 b.h 和 d.h,b.h 也包括 d.h。

我这样写了一个 Makefile:

ifneq ($(KERNELRELEASE),)
mymodule-objs :=a.c b.c
obj-m += a.o b.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
    rm -rf *.o *.mod.c *.symvers *order *.markers *.cmd *-
    $(MAKE) -C $(KDIR) M=$(PWD)
clean:
    rm -rf *.o *.mod.c *.symvers *order *.markers *.cmd *-
endif

但它不起作用,我应该如何编写一个正确的Makefile?我想得到一个文件名 x.ko 最后和。

在我使用'make'命令后,我使用'insmod'是给我一个消息:

insmod: 错误: 无法插入模块 a.ko: 模块中的未知符号

顺便说一句,我使用的是 Ubuntu 14.10。内核是 3.16.0-37-generic

【问题讨论】:

你能详细说明一下But it doesn't work吗? @SouravGhosh 在我使用“make”命令并使用“insmod”后给我一条消息:insmod: ERROR: could not insert module a.ko: Unknown symbol in module 所以你的代码也可能有问题...... .ko文件生成了吗? .ko 文件是否在“可见”路径中? @LPs 最后我得到了 2 个 .ko 文件,它们是 a.ko 和 b.ko 【参考方案1】:
obj-m += a.o b.o

将创建两个模块,a.ko 和 b.ko 如果您想从两者中创建一个模块(我想您这样做是因为mymodule-objs 的行),请将该行替换为

obj-m += mymodule.o

mymodule.o会根据mymodule-objs构建,然后使用modpost变成mymodule.ko。 如前所述,您的$(MAKE) 行中缺少modules

【讨论】:

【参考方案2】:

尝试在此之后为您的 Makefile 建模?

https://unix.stackexchange.com/questions/122095/understanding-a-make-file-for-making-ko-files

您可能不需要mymodule-objs := a.c b.c。而且我认为您在$(MAKE) 行之后缺少modules

【讨论】:

以上是关于为内核模块编写 makefile的主要内容,如果未能解决你的问题,请参考以下文章

编写简单的内核模块

linux内核模块编译makefile -2

linux内核模块编译makefile

在linux中编写了一个小的内核模块,怎么编译成.ko文件?

Linux中编写了内核模块的C源程序之后怎么编写makefile文件的内容??

在启动时加载linux内核模块