Загрузчик драйвера с помощью insmod: несоответствие версии символа module_layout.

Вопрос или проблема

Я скомпилировал простой драйвер для ядра Linux для системы ARM:

$ uname -a

Linux CR5 4.4.171-cr5 #2 Tue Mar 10 11:49:00 CET 2020 armv7l GNU/Linux

Для компиляции я использовал конфигурационный файл из работающей системы, расположенный по адресу:

/proc/config.gz

Я загрузил ванильное ядро, переключился на тег 4.4.5, заменил конфигурационный файл, скомпилировал ядро, а затем скомпилировал драйвер с помощью инструментария для ARM:

gcc-linaro-7.2.1-2017.11-i686_arm-linux-gnueabi
Драйвер содержит простой код

    #include <linux/module.h>
    #include <linux/kernel.h>

    int init_module(void) {
        printk(KERN_INFO "Привет, мир.\n");
        return 0;
    }

    void cleanup_module(void) {
        printk(KERN_INFO "До свидания, мир.\n");
    }

Я использовал insmod для загрузки драйвера, но сообщение об ошибке в терминале:

insmod: ERROR: не удалось вставить модуль test_module.ko: Неверный формат модуля

В dmesg я получаю следующее сообщение:

test_module: несовпадение версии символа module_layout

Однако, когда я сравнивал загруженный в систему модуль с моим модулем с помощью readelf -a

Заголовки ELF идентичны, и Атрибуты файла совпадают.

Что еще я могу проверить? Может, загрузка модуля была заблокирована ядром? Как я могу это проверить? Есть ли кто-то, кто может подсказать, что мне делать дальше?

p.s

  • программа на простом C работает нормально, так что я думаю, что инструментарий в порядке
  • insmod -f также не сработало

Спасибо

Проблема была в компоновке, хотя всё выглядело одинаково, компоновка была изменена.

Ответ найден здесь

здесь

Ответ или решение

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

Возможные причины проблемы:

  1. Неправильная версия ядра: Вы указали, что вы собрали ядро версии 4.4.5, однако на машине, на которой вы пытаетесь загрузить модуль, работает ядро версии 4.4.171-cr5. Это может привести к несовместимости символов, так как версии могут иметь изменения в структуре.

  2. Использование неправильной конфигурации: Вы загрузили конфигурационный файл из /proc/config.gz, но убедитесь, что все опции ядра, связанные с модульной системой, правильно настроены. Особенно это касается параметров, влияющих на поддержку модулей.

  3. Определение структуры module_layout: Структура module_layout могла измениться между версиями ядра, что значит, что ваш модуль может не совпадать со структурой, ожидаемой в текущем ядре.

Как исправить ситуацию:

  1. Соберите модуль для правильной версии ядра: Если возможно, следует пересобрать модуль для версии ядра 4.4.171-cr5. Это гарантирует совместимость, поскольку вы будете использовать символы и структуру, которые действительно присутствуют в вашем работающем ядре.

  2. Проверка конфигураций: Убедитесь, что конфигурационный файл, используемый для сборки модуля, соответствует конфигурации ядра. Например, если вы используете параметры ядра для модуля, убедитесь, что они активированы в конфигурации вашего ядра.

  3. Проверьте наличие обновлений: Если возможно, обновите ваше ядро до более новой версии и пересоберите ваши модули, чтобы избежать таких несовместимостей.

  4. Исследуйте зависимости: Иногда проблема может быть связана с другими модулями или зависимостями. Убедитесь, что все необходимые модули также загружены и совместимы.

Заключение:

Вы уже столкнулись с типичной проблемой несовместимости, когда работаете с ядром и модулями. Правильная версия для сборки, корректные конфигурации и чёткое соответствие между версиями ядра – ключевые факторы для успешной загрузки модулей. Надеюсь, информация окажется полезной, и вы сможете решить вашу проблему. Если у вас есть дополнительные вопросы или потребность в уточнении, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...