LINUX.ORG.RU

проблема после сборки модулей для ядра

 , ,


0

1

Сама задача была скомпилировать модули для телефона с arm, но как бы не пытался всё равно insmod и modprobe выдают can't load module invalid module format. Собирал вот так. make modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- KERNELRELEASE=3.0.31-1071214 Пробовал разными компиляторами, результат тот же. Потом уже попробовал теми же методами собрать модуля под десктопную машину, модули собираються но результат тот же, но ещё в логах вот такое

ath: no symbol version for module_layout

Ядра брал с kernel.org, точно тех версий что показывает uname -r вот машины 3.2.0-32-generic

а это для примера modinfo mwl8k.ko

filename: mwl8k.ko license: GPL author: Lennert Buytenhek <buytenh@marvell.com> version: 0.12 description: Marvell TOPDOG(R) 802.11 Wireless Network Driver firmware: mwl8k/fmimage_8366_ap-2.fw firmware: mwl8k/fmimage_8366.fw firmware: mwl8k/helper_8366.fw firmware: mwl8k/fmimage_8687.fw firmware: mwl8k/helper_8687.fw firmware: mwl8k/fmimage_8363.fw firmware: mwl8k/helper_8363.fw srcversion: 63FF6676F54CF2FF2E96220 alias: pci:v000011ABd00002A43sv*sd*bc*sc*i* alias: pci:v000011ABd00002A40sv*sd*bc*sc*i* alias: pci:v000011ABd00002A30sv*sd*bc*sc*i* alias: pci:v000011ABd00002A2Bsv*sd*bc*sc*i* alias: pci:v000011ABd00002A24sv*sd*bc*sc*i* alias: pci:v000011ABd00002A0Csv*sd*bc*sc*i* alias: pci:v000011ABd00002A0Asv*sd*bc*sc*i* depends: mac80211,cfg80211 intree: Y vermagic: 3.2.0-32-generic SMP mod_unload modversions parm: ap_mode_default:Set to 1 to make ap mode the default instead of sta mode (bool)

Может кто чем подскажет где я ошибку делаю, ответа что в темах есть не нашёл?



Последнее исправление: minoro (всего исправлений: 1)

Ядро и модули должны быть собраны одной и той же версией компилятора с использованием одной и той же версии glibc.

Т.е. если у вас уже есть собранное ядро, например разработчиками установленной на аппарате операционной системы. Затем вы просто берёте исходные коды ядра с kernel.org, конфиг от уже собранного разработчиками ядра. Исходники распаковываете, помещаете конфиг ядра, включаете поддержку нужного модуля, затем собираете модуль и просто копирете его в систему. После чего пытаетесь подгрузить его, то ничего не получится.

Вам нужно собирать заново и ядро и все нужные модули. Ну либо можете собрать ядро, отключить в нём проверку того, под какое ядро собран загружаемый модуль. И потом сможете загружать модули, собранные даже под другую версию ядра, но в этом случае ни кто не гарантирует стабильность.

В общем, собираейте ядро и модули, после чего используете свеже собранное ядро и модули от него на вашей системе. По другому ни как.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Ядро и модули должны быть собраны ... с использованием одной и той же версии glibc

Надо же такую жуйню спороть.

anonymous
()
Ответ на: комментарий от kostik87

Ядро и модули должны быть собраны одной и той же версией компилятора с использованием одной и той же версии glibc.

одной и той же версии glibc

*FACEPALM*

anonymous
()
Ответ на: комментарий от kostik87

В твоём посте нет контекста — только уйня.

anonymous
()
Ответ на: комментарий от kostik87

если это оно vermagic то я при компиляции указываю это в параметре KERNELRELEASE. Если нет то можно по конкретней?

minoro
() автор топика
Ответ на: комментарий от kostik87

А можете подсказать каким параметром отключить проверку для какого он ядра? Я думал KERNELRELEASE отвечает для какого ядра.

minoro
() автор топика
Ответ на: комментарий от minoro

Я не точно выразился, проверка отключается при конфигурировании ядра. Т.е. если в ядре не разрешена загрузка сторонних модулей, то без перекомпиляции ядра не получится загрузить модуль, собранный для другого ядра.

А так у 'modprobe' есть ключи:

       --force-vermagic
           Every module contains a small string containing important information, such as the kernel and compiler versions. If a module fails
           to load and the kernel complains that the «version magic» doesn't match, you can use this option to remove it. Naturally, this
           check is there for your protection, so this using option is dangerous unless you know what you're doing.

           This applies to any modules inserted: both the module (or alias) on the command line and any modules on which it depends.


       -f, --force
           Try to strip any versioning information from the module which might otherwise stop it from loading: this is the same as using both
           --force-vermagic and --force-modversion. Naturally, these checks are there for your protection, so using this option is dangerous
           unless you know what you are doing.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Понятно. Только у меня немного другой вопрос, а можно как нибудь скомпилировать модули уже для готового ядра, рабочего? Я ни как не пойму где посмотреть не совместимость. modinfo показывает одинаковую информацию из разных модулей, только один загружается другой новый нет.

minoro
() автор топика
Ответ на: комментарий от minoro

Я уже написал выше про версию компилятора и glibc.

Собирайте ядро целиком и модули для него. После чего перенесите это ядро и модули в вашу систему.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Версии компиляторов идентичны.а какие применялись glibc не знаю как посмотреть. Задача именно стоит собрать модули для конкретного ядра уже собранного и работающего.

minoro
() автор топика

Всем спасибо. Сам разобрался. Новое действие ещё появилось после определённой ветки ядра.

Делаем так 1) Понятно делаем или копируем .config 2) make modules KERNELRELEASE=3.2.0-32-generic 3) cd в папку с нужными новыми скомпилированными модулями 4)make -C /lib/modules/`uname -r`/build M=`pwd` 6) insmod modul.ko

Всё заработало.

minoro
() автор топика
Ответ на: комментарий от minoro

Да и ещё один момент что бы темы не плодить. Вот тут /lib/modules/`uname -r`/ есть папка build. Я так понял что при установке linux-headers она появляеться. у меня пару ядер из репозиториев стоит и в каждом есть такая папка, но вот при компиляции из исходников просто появляется папка типа /lib/modules/3.0.31-1071214 а папки build нет. Подскажите от чего зависит её появление, это всё тот же вопрос о модулях?

minoro
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.