编译共享代码的多个内核模块
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 解决了编译警告。谢谢!
我希望编译共享一个公共库的两个内核模块(树外):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 解决了编译警告。谢谢!