несовместимость версии module_layout - PullRequest
27 голосов
/ 27 апреля 2010

Я пытаюсь перенести устаревший модуль ядра Linux, портируемый мной. Появляются следующие ошибки:

> sudo insmod camac-mx.ko
insmod: error inserting 'camac-mx.ko': -1 Invalid module format
dmesg |tail -n 1
[1312783.938299] camac_mx: disagrees about version of symbol module_layout

Как мне это исправить?

Ответы [ 6 ]

29 голосов
/ 27 апреля 2010

Это указывает на то, что вы скомпилировали модуль для другой версии ядра, отличной от запущенной. Обратите внимание, что даже если работающее ядро ​​и исходный код ядра имеют одинаковое числовое значение (например, оба сервера 2.6.31-20), если оба используют разные параметры конфигурации, вы можете увидеть эту ошибку. Также проверьте, есть ли на машине несколько версий этого модуля, и убедитесь, что вы загружаете правильную версию.

13 голосов
/ 20 июня 2012

Для тех, кто работает в системах без доступа к ядру, kernel-config или ksyms, если у вас есть working.ko и ваш встроенный нерабочий broken.ko.

Скорее всего, он не загрузится, но если вы достаточно отчаянны, чтобы попробовать;

# modprobe --dump-modversions working.ko
0x0b11e775      module_layout
# modprobe --dump-modversions broken.ko
0x2719d41e      module_layout

Затем, используя ваш любимый шестнадцатеричный редактор, измените его на соответствие:

00016c70  75 e7 11 0b 6d 6f 64 75  6c 65 5f 6c 61 79 6f 75  |u...module_layou|

(значение обратное из-за порядка следования байтов) Скорее всего, будет целая куча, которую вы должны соответствовать. Кто-то может написать Perl-скрипт для этого ....

7 голосов
/ 18 февраля 2011

Чтобы решить это (было трудно).

Во-первых, вам нужны исходные коды и заголовки ядра.

Перейдите к директории ядра, здесь / usr / src / linux-source-2.6.35

Проверьте uname -r , здесь 2.6.35-27-generic

make -C /lib/modules/2.6.35-27-generic/build \
SUBDIRS=/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k modules

/ lib / modules / 2.6.35-27-generic / build -> /usr/src/linux-headers-2.6.35-27-generic

Проверьте зависимости модуля с помощью modinfo или lsmod и загрузите их в скрипт:

modprobe -r ath5k
modprobe cfg80211
modprobe led_class
modprobe mac80211
modprobe ath
insmod /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko

При использовании этого метода vermagic также может отличаться ... make make_install был бесполезен, но, возможно, потому что модули присутствуют в 2 разных местах (/ lib / modules / extra и ... / kernel / drivers), заменен ...

modinfo -F vermagic /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko

Я не очень понимаю, почему в Ubuntu 10.10 так сложно исправить / отладить модуль: (

1 голос
/ 14 мая 2012

Было найдено быстрое и рабочее решение здесь .

Просто используйте каталог modules/build в вашем makefile, НЕ /usr/src/linux-source.

    make -C /lib/modules/`uname -r`/build ...
0 голосов
/ 05 ноября 2016

До этого в вашем исходном ядре

сделать чистый ARCH = arm CROSS_COMPILE = arm-linux-gnueabi-

Отредактируйте файл в исходном ядре: Module.symvers измените «Module_layout» на работающий, вы можете найти этот файл на своем устройстве

Пример перекомпиляции драйвера: make -C ~ / source-kernel ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- DIR = / source-kernel M = / modules / example modules

Проверьте module_layout у вас XXX.ko с: sudo modprobe --dump-modversions XXX.ko

NB

0 голосов
/ 29 августа 2013

У меня есть система Android с одним двоичным модулем (pvrsrvkm для графики). Я собирал ядра из источника для этой системы. В целом все работает нормально, но с некоторыми опциями ядра .config (для kgdb) модуль pvrsrvkm не загружается с ошибкой «не согласен с версией символа».

Модуль pvrsrvkm загружается андроидом рано, и когда он выходит из строя, система не работает без графического интерфейса.

Поскольку я уже собирал ядро, мое быстрое решение было отключить проверку версии, добавив одну строку (versindex = 0;) в исходный файл ядра kernel / module.c:

static int check_version(Elf_Shdr *sechdrs,
unsigned int versindex,
const char *symname,
struct module *mod,
const unsigned long *crc,
const struct module *crc_owner) 
{
unsigned int i, num_versions;
struct modversion_info *versions;

/* Exporting module didn't supply crcs?  OK, we're already tainted. */
if (!crc)
    return 1;

/* No versions at all?  modprobe --force does this. */
versindex = 0; // I added this line
if (versindex == 0)
    return try_to_force_load(mod, symname) == 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...