Скомпилируйте несколько модулей ядра, которые совместно используют код - PullRequest
0 голосов
/ 14 апреля 2020

Я sh для компиляции двух модулей ядра (вне дерева), которые совместно используют общую библиотеку: module1. c использует функции из библиотеки. c и module2. c также использует функции из библиотеки. c. Но библиотека. 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) устанавливаются перед вызовом make-файла.

Этот make-файл создает следующий вывод:

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 is компилируется дважды для каждого модуля, который его использует. Итак, есть два разных объекта «my_variables», которые живут независимо, чего я хочу избежать.

Как я могу сначала изменить Makefile, скомпилировать библиотеку. c => library.o, затем использовать тот же library.o для компиляции каждого модуля ядра?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Спасибо за ваше предложение. На самом деле, общий символ не объявляется в module1. c или module2. c, но в библиотеке. c.

Если я использую EXPORT_SYMBOL(my_variable); в библиотеке. c и extern int my_variable; в libray.h (который включен как 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

Как минимум, библиотека. c компилируется один раз .

РЕДАКТИРОВАТЬ: предупреждение компиляции было устранено путем перемещения EXPORT_SYMBOL(my_variable); из библиотеки. c в module1. c. Спасибо!

0 голосов
/ 14 апреля 2020

Не видя вашего кода, трудно понять, что именно происходит.

Но из того, что я могу понять, у вас есть два отдельных модуля (включая библиотеку). Поскольку они разделены, у них будет своя собственная копия их переменных.

Если вы хотите поделиться переменной, вам нужно будет использовать EXPORT_SYMBOL в одном модуле, а затем extern в другом - что-то вроде это

...