Предупреждение о сборке модуля ядра, который использует экспортированные символы - PullRequest
8 голосов
/ 29 февраля 2012

У меня есть два модуля ядра (скажем, modA и modB).modA экспортирует символ с EXPORT_SYMBOL(symA), а modB использует его.У меня есть заголовок modA.h для modA:

...
extern void symA(int param);
...

и в modB.c:

#include "modA.h"
...
static int __init modB_init(void)
{
    symA(10);
}
...

Если i insmod modB все работает нормально, мой modB правильно связан вядро и функция symA правильно вызваны.Однако при сборке modB компилятор выдает предупреждение: symA is undefined.LKM является перемещаемым ELF, так почему компилятор выдает это предупреждение?Как это можно удалить?

1 Ответ

12 голосов
/ 29 февраля 2012

Эта проблема (и как правильно скомпилировать в этом случае) объясняется в http://www.kernel.org/doc/Documentation/kbuild/modules.txt

Иногда внешний модуль использует экспортированные символы из другого внешний модуль. Kbuild должен иметь полное знание всех символов чтобы не выплевывать предупреждения о неопределенных символах. Три решения существуют для этой ситуации.

ПРИМЕЧАНИЕ: метод с файлом верхнего уровня kbuild рекомендуется, но может быть непрактичным в определенных ситуациях.

Используйте файл верхнего уровня kbuild. Если у вас есть два модуля, foo.ko и bar.ko, где foo.ko нужны символы из bar.ko, вы можете использовать общий файл верхнего уровня kbuild, поэтому оба модуля компилируются в такая же сборка. Рассмотрим следующую схему каталогов:

  ./foo/ <= contains foo.ko       ./bar/ <= contains bar.ko

  The top-level kbuild file would then look like:

  #./Kbuild (or ./Makefile):          obj-y := foo/ bar/

  And executing

      $ make -C $KDIR M=$PWD

  will then do the expected and compile both modules with         full

знание символов из любого модуля.

Использовать дополнительный файл Module.symvers. При сборке внешнего модуля создается файл Module.symvers, содержащий все экспортируемые символы которые не определены в ядре. Чтобы получить доступ к символам из bar.ko, скопируйте файл Module.symvers из компиляции bar.ko в каталог, где построен foo.ko. Во время сборки модуля, kbuild прочитает файл Module.symvers в каталоге внешний модуль, и когда сборка будет завершена, новый Создается файл Module.symvers, содержащий сумму всех символов определяется и не является частью ядра.

Использовать переменную "make" KBUILD_EXTRA_SYMBOLS Если это нецелесообразно скопировать Module.symvers из другого модуля, вы можете назначить пробел Отдельный список файлов для KBUILD_EXTRA_SYMBOLS в вашем файле сборки. Эти файлы будут загружены modpost во время инициализации его таблицы символов.

...