我希望编译两个共享公共库的内核模块(不在树中):module1.c使用来自library.c的函数,module2.c也使用来自library.c的函数。但是,library.c实现了一个全局变量“ my_variable”,需要在module1.c和module2.c之间共享。
目前,我有以下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之前已设置。
该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
-类似this