Несовместимость версии 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
Как это исправить?
Ответы
Ответ 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
Н.Б.