Роздільна збірка пов'язаних модулів ядра linux - stack overflow російською

Потрібно зібрати два модуля a і b окремо один від одного, при цьому один пов'язаний з іншим.
Поясню на прикладі:
файл a.c

Маємо загальний Makefile

На даному етапі модулі збираються і завантажуються в послідовності: a -> b. тому b викликає функцію з a.

Змінимо умови задачі, разнесём модулі по різних папках, і для кожного створимо свій Makefile.
Тепер при складанні модуля b бачимо попередження WARNING: "hello_print_msg" [. /b/hello_b.ko] undefined! Якщо ж тепер з папки з модулем a скопіювати (замінивши) файл Module.symvers в папку з модулем b. і знову виконати команду make. все чудово збереться!

Питання: Чи існує інший спосіб повідомити збирачеві модулів ядра Linux де шукати файли зі списками товарів, що експортуються символів?

це описано в документації. в секції 6.3 Symbols From Another External Module.

нижче - мій вільний переклад:

іноді один зовнішній модуль використовує ідентифікатори з іншого зовнішнього модуля. kbuild повинен знати про них, щоб не набридати попередженнями про невідомих ідентифікатори. існує три рішення.

використання kbuild-файлу в каталозі вище рівнем

якщо у вас два модуля, foo.ko і bar.ko. і модулю foo.ko потрібні ідентифікатори з bar.ko. ви можете використовувати загальний kbuild-файл з каталогу рівнем вище - обидва модуля будуть скомпільовані в процесі однієї збірки. розглянемо наступну структуру каталогів:

тоді kbuild-файл може виглядати, наприклад, так:

приведе до збірки обох модулів з повною інформацією про всі ідентифікатори.

використання додаткового файлу Module.symvers

при складанні зовнішнього модуля генерується файл Module.symvers. що містить всі експортовані ідентифікатори, які не визначені в ядрі. для отримання доступу до ідентифікаторів з bar.ko скопіюйте файл Module.symvers з каталогу збірки цього модуля в каталог, де буде збиратися foo.ko. в процесі складання kbuild прочитає цей файл і після закінчення буде створений новий Module.symvers. що містить «суму» описаних ідентифікаторів, які не є частиною ядра.

використання змінної KBUILD_EXTRA_SYMBOLS

Схожі статті