Потрібно зібрати два модуля 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. що містить «суму» описаних ідентифікаторів, які не є частиною ядра.