Linux驅動編譯安裝遇到的問題(Kernel configuration is invalid)(Invalid module format)
- 前言
- 1. Kernel configuration is invalid
- 2. Invalid module format
- 2.1 第一種情況:內核模塊編譯的環境與現在insmod想要運行的環境不一致
- 2.2 第二種情況:內核編譯的問題
- 結束
前言
Linux驅動編譯和安裝經常會遇到各種問題,上篇帖子
ubuntu cp210x(USB轉串口)驅動安裝教程
介紹了下載某官方驅動編譯時編譯不通過的問題,原因是代碼問題。本篇主要講系統環境引起的安裝失敗的問題。主要涉及錯誤點:Kernel configuration is invalid;Invalid module format。
1. Kernel configuration is invalid
詳細報錯信息:
ERROR: Kernel configuration is invalid.
include/generated/autoconf.h or include/config/auto.conf are missing.
Run ‘make oldconfig && make prepare’ on kernel src to fix it.
但是當執行make oldconfig && make prepare命令時可能仍會出錯。如錯誤信息,缺少相關的系統配置文件,如果確實缺少可通過
make menuconfig #自己配置
然后在源碼目錄下執行 /usr/src/<kernel-version>e.g. /usr/src/linux-headers-5.15.0-88-genericmake oldconfigmake preparemake scripts
注:有時執行make menuconfig也會出錯,錯誤如果類似
LEX scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
make[1]: *** [scripts/Makefile.host:9: scripts/kconfig/lexer.lex.c] Error 127
此時可能因為缺少詞法解析器flex,和語法解析器bison,可通過下述命令安裝
sudo apt install flex
sudo apt install bison
2. Invalid module format
安裝驅動文件可能會出現 Invalid module format現象
insmod: ERROR: could not insert module cp210x.ko: Invalid module format
出錯后,使用dmesg查看錯誤日志,如下:
dmesg
module: x86/modules: Skipping invalid relocation target, existing value is nonzero for type 1.....
2.1 第一種情況:內核模塊編譯的環境與現在insmod想要運行的環境不一致
也就是說,編譯時內核的版本和現在安裝的內核版本不一致。可能由于系統存在多個版本的內核,編譯時運行的內核和安裝時的內核版本不一致。可以檢查是否出現編譯后重啟系統進入了其他版本的內核,或者makefile里面的內核是否寫的正確,
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
2.2 第二種情況:內核編譯的問題
實際上,上述可能很多問題都是由于內核編譯的問題,如果上述都不能解決問題,需要重新編譯內核版本
sudo apt update && sudo apt upgrade
sudo apt remove --purge linux-headers-<kernel-version>
sudo apt autoremove && sudo apt autoclean
sudo apt install linux-headers-<kernel-version>
e.g. linux-headers-5.15.0-88-generic
結束
結束后重新編譯和安裝驅動即可
make
cp cp210x.ko to /lib/modules/<kernel-version>/kernel/drivers/usb/serial
insmod /lib/modules/<kernel-version/kernel/drivers/usb/serial/usbserial.ko
insmod cp210x.ko