【发布时间】:2018-04-06 20:29:19
【问题描述】:
我正在尝试将内核模块链接到非 LKM 源文件。问题是,我遇到了一些问题。这两个文件的名称是chardev.c(LKM)和foo.c。
我的 Makefile:
obj-m += chardev.o
obj-y += foo.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
$(CC) test.c -o test
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
rm test
在 chardev.c 内部有以下代码行:extern int foo;,在 foo 内部有以下代码行:int foo = 123;。 (这两行都在文件范围内。)
运行 make 我得到以下输出:
make -C /lib/modules/4.4.0-31-generic/build/ M=/home/kylemart/Desktop/Device-Driver modules
make[1]: Entering directory `/usr/src/linux-headers-4.4.0-31-generic'
CC [M] /home/kylemart/Desktop/Device-Driver/chardev.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "foo" [/home/kylemart/Desktop/Device-Driver/chardev.ko] undefined!
CC /home/kylemart/Desktop/Device-Driver/chardev.mod.o
LD [M] /home/kylemart/Desktop/Device-Driver/chardev.ko
make[1]: Leaving directory `/usr/src/linux-headers-4.4.0-31-generic'
cc test.c -o test
似乎没有正确链接。我做错了什么?
编辑:
这似乎可行,但有一个问题:
obj-m += chardev.o
chardev-objs += foo.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
$(CC) test.c -o test
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
rm test
虽然它编译时没有警告,但在安装编译模块(即sudo insmod chardev.ko)后,/dev 中没有新设备。以前,在不尝试链接源文件的情况下,如前所述安装内核模块会创建一个设备文件。也就是说,该设备在运行lsmod 时存在。
【问题讨论】:
-
你可能错过了
EXPORT_SYMBOL(foo) -
@ensc 试过了,使用上述任何一个 Makefile 实现似乎都没有什么不同。
标签: linux linux-kernel kernel-module