【问题标题】:Compiling Linux Kernel Module With A Custom Header使用自定义头文件编译 Linux 内核模块
【发布时间】:2013-10-01 15:05:50
【问题描述】:

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

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

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

【问题讨论】:

  • 将 obj-m 行更改为:obj-m := mymod.o customize-header.o 会发生什么?
  • @PeterL。那么obj-m就是生成一个模块。当我添加customized-header.o 时,会生成更多文件:例如customized-header.ko。与此同时,mymod.ko 还是一样的。这里我只想要一个模块,即mymod.kocustomized-header 就像模块的库一样工作。

标签: linux module linux-kernel kernel kbuild


【解决方案1】:

问题在于Makefile。由于链接here,我改成了

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

现在可以正常工作了。所以问题是模块对象的命名。我们需要指定不同的名称,如本例中的mymodko.omymod.o

【讨论】:

  • @BenjaminLeinweber 我需要再等 20 个小时才能接受我自己的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多