编译共享代码的多个内核模块

Compile multiple Kernel modules that share code

我希望编译共享一个公共库的两个内核模块(树外):module1.c 使用来自 library.c 的函数并且 module2.c 也使用来自 [=29= 的函数].但是,library.c 实现了一个需要在 module1.c 和 module2.c 之间共享的全局变量 "my_variable"。

目前,我有以下 Makefile:

# List of files
obj-m   += my_module1.o my_module2.o

my_module1-objs := library.o module1.o
my_module2-objs := library.o module2.o

all:    
    make -C $(KERNEL_DIR) M=$(PWD) modules

$(KERNEL_DIR) 和 $(PWD) 在调用 makefile 之前设置。

该生成文件产生以下输出:

CC library.o
CC module1.o
LD my_module1.o
CC library.o
CC module2.o
LD my_module2.o
CC my_module1.mod.o
LD my_module1.ko
CC my_module2.mod.o
LD my_module2.ko

library.c 为每个使用它的模块编译两次。所以有两个不同的 "my_variables" 对象独立存在,这是我想避免的事情。

如何修改 Makefile 以先编译 library.c => library.o 然后使用相同的 library.o 编译每个内核模块?

非常感谢。

如果不查看您的代码,就很难确切地知道发生了什么。

但据我所知,您有两个单独的模块在编译(包括库)。由于它们是分开的,因此它们将拥有自己的变量副本。

如果您想共享一个变量,您需要在一个模块中使用 EXPORT_SYMBOL,然后在另一个模块中使用 extern - 类似于

感谢您的建议。实际上,共享符号不是在 module1.c 或 module2.c 中声明的,而是在 library.c.

中声明的

如果我在 library.c 中使用 EXPORT_SYMBOL(my_variable); 并在 libray.h 中使用 extern int my_variable;(module1.c 和 module2.c 都包含),这是编译时警告的结果:

CC library.c
CC module1.c
LD my_module1.o
CC module2.c
LD my_module2.o
WARNNING: my_module2 : 'my_variable' exported twice. Previous export was in my_module1.ko
CC my_module1.mod.o
LD my_module1.ko
CC my_module2.mod.o
LD my_module2.ko

至少library.c编译一次

编辑:通过将 EXPORT_SYMBOL(my_variable); 从 library.c 移动到 module1.c 解决了编译警告。谢谢!