Подтвердить что ты не робот

Несовместимость версии module_layout

Я пытаюсь вставить модуль устаревшего ядра 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

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

4b9b3361

Ответ 1

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

Ответ 2

Для тех, кто работает с системами без доступа к ядру, 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 script, чтобы сделать это....

Ответ 3

Чтобы решить эту проблему (было сложно).

Сначала вам нужны исходные коды ядра и заголовки.

Перейдите в базу данных ядра, здесь /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 и загрузите их в script:

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 modules_install бесполезен, но, возможно, потому, что модули присутствуют в двух разных местах (/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 исправить/отладить модуль: (

Ответ 4

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

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

    make -C /lib/modules/`uname -r`/build ...

Ответ 5

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

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

Поскольку я уже создавал ядро, моим быстрым решением было отключить проверку версий, добавив одну строку (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;

Ответ 6

Ранее в исходном ядре

очистить 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/примеры модулей

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

Н.Б.