Ядро Linux содержит структуры данных, расположение которых меняется не только от версии к версии, но и в зависимости от опций компиляции. Как следствие, при компиляции модуля ядра необходимо иметь не только заголовочные файлы из исходного кода ядра, но и некоторые заголовочные файлы, которые генерируются в процессе компиляции ядра. Простой распаковки исходного кода ядра недостаточно.
В ядрах, собранных с помощью CONFIG_MODVERSIONS
, номер версии может отличаться, но расположение структур данных должно быть одинаковым. Эта опция активирована в ядрах Ubuntu. С этой опцией, помимо заголовков, модули должны быть скомпилированы с соответствующим Module.symvers
файлом. Ubuntu, как и большинство дистрибутивов, включает этот файл в тот же пакет, что и заголовки ядра, полученные в результате компиляции. Пакет заголовков ядра Ubuntu называется linux-headers-VERSION-VARIANT
, например, linux-headers-3.8.0-38-generic
.
В ядрах, собранных без CONFIG_MODVERSIONS
(что может быть в случае, если вы скомпилировали собственное ядро), проверка при загрузке модуля - это простая проверка версии. Вы можете взять распакованный исходник ядра, скопировать .config
, который использовался при компиляции вашего работающего ядра, и запустить make modules_prepare
. Вы должны убедиться, что любое исправление, внесенное вами в ядро, не влияет на бинарную совместимость.