& ldquo; нет версии символа для module_layout & rdquo; при попытке загрузить usbhid.ko

Я пытаюсь построить свой собственный модуль для usbhid.ko, но после компиляции я не могу загрузить модуль. dmesg говорит no symbol version for module_layout. Мне интересно, в чем проблема? Я уже использовал исходный код ядра, предоставленный Ubuntu, и я также уверен, что версия ядра совпадает.

27
задан 29 August 2012 в 14:41

3 ответа

Установлены пакеты linux-headers и linux-source, соответствующие вашему ядру. Например, для ядра 3.2.0-27-generic-pae вам нужно:

  1. linux-headers-3.2.0-27-generic-pae и
  2. linux-source-3.2.0-27-generic-pae.

Если версия для вышеуказанных пакетов не соответствует используемой вами версии ядра, вам нужно заменить $(uname -r) строкой версии из установленного вами пакета ядра сверху.
Для приведенного выше примера версия пакета - 3.2.0-27-generic-pae. Когда вы запускаете uname -r и его вывод отличается от 3.2.0-27-generic-pae, вам нужно заменить каждый $(uname -r) ниже, чтобы он соответствовал строке версии из установленных пакетов.

  1. cd /usr/src/linux-source-$Version и распакуйте архив .tar.bz2 и поместите компакт-диск в извлеченный каталог - я думаю, вы уже сделали это
  2. cp /boot/config-$(uname -r) .config в каталог исходного кода ядра [ 1125]
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . в исходный каталог ядра

После того, как вы это сделаете, в исходном каталоге ядра сделайте следующее:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial - измените путь после M= в соответствии с вашими потребностями

К сожалению, я не знаю, как построить конкретный модуль, оставляя Module.symvers нетронутым. Например, выполнение make drivers/usb/serial/option.ko убивает файл Module.symvers, и в итоге вы сталкиваетесь с исходной проблемой. Использование параметра M= не приводит к его уничтожению, но вы должны собрать все модули по указанному пути - и я пока не нашел обходного пути.

0
ответ дан 29 August 2012 в 14:41

Конкретно, чем проблема состоит в том, что при создании модуля исходное дерево ядра, вероятно, пропускало файл Modules.symvers. kbuild система на самом деле предупреждает Вас об этом при создании модуля. Если Modules.symvers будет отсутствовать, то Вы будете видеть:

Предупреждение: дамп версии Символа/usr/src/linux-2.6.34-12/Modules.symvers отсутствует; модули не будут иметь никаких зависимостей и modversions.

Если Ваше ядро имеет CONFIG_MODVERSIONS включенный, затем во время modpost фазы создания Вашего драйвера это выполнит scripts/mod/modpost с-m опцией. Если Вы будете храбры и будете смотреть на scripts/mod/modpost.c источник, то Вы будете видеть, что-m опция добавляет _module_layout_ символ от vmlinux, однако если у Вас не будет Modules.symvers от Вашего ядра, то Вы не получите значение CRC для этого символа, и Вы закончите с этим сообщением об ошибке.

Таким образом, существует два пути вокруг этого.

1) выполните полную сборку своего рабочего ядра для генерации Modules.symvers, затем восстановите модуль. [http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt] [1]

51  === 2. How to Build External Modules
52  
53  To build external modules, you must have a prebuilt kernel available
54  that contains the configuration and header files used in the build.
55  Also, the kernel must have been built with modules enabled. If you are
56  using a distribution kernel, there will be a package for the kernel you
57  are running provided by your distribution.
58  
59  An alternative is to use the "make" target "modules_prepare." This will
60  make sure the kernel contains the information required. The target
61  exists solely as a simple way to prepare a kernel source tree for
62  building external modules.
63  
64  NOTE: "modules_prepare" will not build Module.symvers even if
65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66  executed to make module versioning work.

2) Другая опция состоит в том, чтобы сказать глупому modprobe просто проигнорировать все это дерьмо и просто загрузить Ваш модуль так или иначе:

modprobe -f <module>

Я склонен одобрять опцию 2 :)

22
ответ дан 29 August 2012 в 14:41

Вы должны использовать точно идентичную конфигурацию ядра перед запуском make prepare. Кроме того, если вы собираете его вне дерева, вам нужно строить его из точно идентичных заголовков ядра, соответствующих вашему текущему работающему ядру (или целевому, если вы не запускаете его во время компиляции). [ 111]

0
ответ дан 29 August 2012 в 14:41

Другие вопросы по тегам:

Похожие вопросы: