Как сгенерировать Module.symvers?

14

Я недавно прошел Распаковка rpm-ядра вне системы (OpenSuse)? ; и, поскольку на моей машине прошло> 10 часов, представьте мое удивление, что после описанного там процесса я Module.symversнигде не нахожу !

Когда я ищу «генерировать Module.symvers», я получаю это:

ПРИМЕЧАНИЕ: «modules_prepare» не будет собирать Module.symvers, даже если установлен
CONFIG_MODVERSIONS; следовательно, полная сборка ядра должна быть
выполнена, чтобы заставить работу модулей работать.
( Документация ядра Linux :: kbuild: modules.txt )

... но я не совсем понял - разве ядро ​​не было собрано на предыдущем шаге (описанном в приведенной выше ссылке? Я уверен, что для создания целой связки * .o понадобилось> 10 часов) файлы, и LD, чтобы связать их, так что что-то должно быть построено. Но если так, то где же тогда Module.symvers?

В более явных терминах, какую именно команду я должен вызывать для создания Module.symvers? я знаю этоmake prepare это не сработает, но что это за команда?

sdaau
источник
FYI, на OpenSUSE, вы можете получить Module.symversна zypper install kernel-source, и похоже на другой дистрибутиве. Файл находится в lib/modules/xxx/build.
Сиртис-майор

Ответы:

16

Module.symversЯвляется (вос) генерируется при (перо) модули компиляции. Запустите make modules, и вы должны получить Module.symversфайл в корне дерева ядра.

Обратите внимание, что если вы только работали makeи не работали make modules, вы еще не создали ни одного модуля. Символы из самого ядра ( vmlinuxили одного из архитектурно-зависимых форматов изображений) находятся в System.map.

Жиль "ТАК - прекрати быть злым"
источник
Большое спасибо за это, @Gilles - с тех пор я также нашел файл Answer: Module.symvers ; и может подтвердить, что make modulesдействительно создает Module.symvers. Спасибо также за разъяснение различий между makeи make modulesи отношениями System.map. Ура!
Сдау
Что делать, если «make» недоступен на машине?
bzupnick
3
@bzupnick Установите его. Это один из необходимых инструментов для сборки модулей ядра Linux. Много программного обеспечения требует make для сборки.
Жиль "ТАК - перестань быть злым"
Я пытаюсь кросс-компилировать LKM с другой машины. Установка вещей на первую коробку невозможна.
bzupnick
@bzupnick В любом случае вам нужно иметь make для сборки модуля. Все это происходит на сборочной машине, на целевой машине ничего не нужно делать, кроме как insmod.
Жиль "ТАК - перестань быть злым"
3

для людей, которые нашли этот вопрос, прибегая к помощи предупреждения, которое вы получаете при компиляции одного из образцов LKM Дерека Моллоя: вы можете просто сделать пустой с помощью touch Modules.symvers. если ваше ядро ​​не использует модверсии (CRC, используемые операционной системой для обеспечения соответствия модулей ядру) и ваш модуль не имеет каких-либо зависимостей от других модулей, этого будет достаточно для подавления предупреждения.

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

пустой файл так же хорош, как и файл, сгенерированный gcc, который просто содержит символы с одинаковым 0x00000000значением CRC в системе без модификаций.

jcomeau_ictx
источник
1

В CentOS и, возможно, в других вариантах RedHat просто распакуйте соответствующий файл для вашего работающего ядра:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

В Ubuntu и, возможно, в других вариантах Debian файл будет найден автоматически. Однако, если вам это нужно, файл находится здесь:

/usr/src/linux-headers-$(uname -r)/Module.symvers
Id2ndR
источник
Я не могу найти linux-headers-$(uname -r)папку
King Stone