为内核模块编写 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中编写了一个小的内核模块,怎么编译成.ko文件?