Як створити Module.symvers?


14

Нещодавно я пройшов розпакування ядра з вихідним числом оборотів у вихідному режимі (OpenSuse)? ; і як минуло> 10 годин на моїй машині, уявіть моє здивування, що, виконуючи описаний там процес, я Module.symversніде не знайду !

Коли я шукаю "create Module.symvers", я отримую таке:

ПРИМІТКА: "module_prepare" не створить Module.symvers, навіть якщо встановлено
CONFIG_MODVERSIONS; тому для завершення
роботи версії модуля потрібно виконати повну збірку ядра .
( Документація ядра Linux :: kbuild: module.txt )

... але я насправді цього не розумію - хіба ядро ​​не було побудовано на попередньому кроці (описаному у наведеному вище посиланні? Я впевнений, знаю, що для CC було потрібно 10 годин, щоб генерувати цілу купу * .o файли та LD, щоб їх пов’язати, значить, щось було побудовано. Але якщо так, то де ж тоді Module.symvers?

Більш чітко, яку саме команду я повинен викликати для створення Module.symvers? Я знаю, що make prepareне вийде - але яка команда буде?


FYI, при відкритому використанні ви можете потрапити Module.symversна zypper install kernel-sourceподібне і на інший Linux-дистрибутив. Файл знаходиться в lib/modules/xxx/build.
Майор

Відповіді:


16

Він Module.symvers(повторно) генерується, коли ви (повторно) збираєте модулі. Запустіть make modules, і ви повинні отримати Module.symversфайл у корені дерева ядра.

Зауважте, що якщо ви працювали лише, makeа ні make modules, ви ще не побудували жодного модуля. Символи з самого ядра ( vmlinuxабо одного із форматів зображень, залежних від архітектури) знаходяться в System.map.


Велике спасибі за це, @Gilles - з того часу я також знайшов відповідь: файл Module.symvers ; і може підтвердити, що make modulesдійсно створює Module.symvers. Дякуємо також за роз'яснення різниці між makeі make modulesта стосунками до System.map. Ура!
sdaau

Що робити, якщо "make" недоступний на машині?
bzupnick

3
@bzupnick Встановіть його. Це один з необхідних інструментів для складання модулів ядра Linux. Для створення потрібно багато програмного забезпечення.
Жил 'ТАК - перестань бути злим'

Я намагаюся схрестити компіляцію LKM з іншої машини. Встановити речі в першому полі неможливо.
bzupnick

@bzupnick У будь-якому випадку потрібно створити модуль. Це все відбувається на машині складання, на цільовій машині нічого робити, крім insmod.
Жил 'ТАК - перестань бути злим'

4

для людей, які знайшли це питання, гуглюючи попередження, яке ви отримуєте під час компіляції одного з зразків LKM Derek Molloy: ви можете просто зробити порожнє touch Modules.symvers. якщо ваше ядро ​​не використовує модифікації (CRC, використовувані операційною системою, щоб забезпечити збіг модулів з ядром) і ваш модуль не має ніяких залежностей від інших модулів, це буде досить добре для придушення попередження.

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

порожній файл такий же гарний, як і генерований gcc, який просто містить символи, що мають однакове 0x00000000значення CRC, у системі без модифікацій.


2

У CentOS і, можливо, інших варіантах RedHat просто витягніть відповідний файл для запущеного ядра:

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

У Ubuntu та, можливо, інших варіантах Debian, шви файлів можна знайти автоматично. Однак якщо вам це потрібно, файл знаходиться тут:

/usr/src/linux-headers-$(uname -r)/Module.symvers

Я не можу знайти linux-headers-$(uname -r)папку
King Stone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.