1

我想根据自定义标头编译一个简单的字符设备模块。文件夹因此组织,

+ 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。如果我删除了这个头文件及其函数,比如没有从模块调用头文件函数,它就可以完美地编译并得到所需的结果。

你能看出这里出了什么问题吗?

4

1 回答 1

3

问题出在Makefile. 由于此处的链接,我将其更改为

obj-m: mymodko.o
mymodko-obj: customized-header.o mymod.o

它现在工作正常。所以问题是模块对象的命名。在这种情况下,我们需要指定不同的名称mymodko.omymod.o.

于 2013-10-02T12:20:16.690 回答