我想根据自定义标头编译一个简单的字符设备模块。因此组织了文件夹,
+ mymod.c
| customized-header.h
| customized-header.c
| Makefile
在mymod.c
中,因此使用标题,
#include "customized-header.h"
在Makefile中:
obj-m := mymod.o
mymod-objs := customized-header.o
KVERSION = $(shell uname -r)
PWD = $(shell pwd)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
一切都应该正常工作,模块编译没有问题,我可以通过sudo insmod
加载模块,但模块无法正常工作。当我检查nm mymod.ko
时,会丢失许多变量和函数。链接customized_header.o
后,它看起来好像已经停止了。如果我删除了这个标题及其功能,比如没有来自模块的标题函数调用,它会完美地编译所需的结果。
你能看到这里出了什么问题吗?
答案 0 :(得分:2)
问题在于Makefile
。由于链接here,我将其更改为
obj-m: mymodko.o
mymodko-obj: customized-header.o mymod.o
现在工作正常。所以问题是模块对象的命名。我们需要指定不同的名称,例如mymodko.o
和mymod.o
。