Linux 内核模块 - 在源文件之间共享变量



我正在尝试将内核模块链接到非 LKM 源文件。问题是,我遇到了一些问题。这两个文件的名称是chardev.c(LKM(和foo.c。

我的制作文件:

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 .

您的all目标仅构建模块,而不构建内核,因此foo符号不存在。

将源代码(此处:foo.c(编译到内核中时,必须将生成文件集成到内核源代码中。 例如,您必须添加

obj-y += my-driver/

到上一个目录中的生成文件并构建整个内核。 您可能应该从生成文件中删除all:clean:目标,以避免与内核内置规则发生冲突。

foo.c必须包含

EXPORT_SYMBOL(foo);

EXPORT_SYMBOL_GPL(foo);

第二个生成文件...

将仅生成仅从foo.c构建的chardev.ko模块; chardev.c不会用于它。 当你真的想要这个时,你必须改变文件名;例如

obj-m += chardev.o
chardev-objs = chardev-core.o foo.o

最新更新