在不同的内核版本上加载驱动程序时出现“无效的模块格式”错误

时间:2013-09-11 10:49:32

标签: c linux linux-kernel driver linux-device-driver

我创建了一个小的usbtest驱动程序来测试我的USB设备。我有linux内核版本3.2.0和ubuntu 12.04。

我可以很好地在我的电脑上成功加载该驱动程序而没有任何问题,我可以在没有任何故障情况下使用该加载的驱动程序。

我的Linux PC信息:: uname -a的输出 Linux ci5lub021305 3.2.0-29-generic-pae#46-Ubuntu SMP Fri 7月27日17:25:43 UTC 2012 i686 i686 i386 GNU / Linux

驱动程序加载失败的另一台PC的Linux PC信息:: uname -a Linux ci5lub021302 3.2.0-51-generic-pae#77-Ubuntu SMP Wed 7月24日20:40:32 UTC 2013 i686 i686 i386 GNU / Linux

但是,当我试图将该驱动程序加载到另一个具有不同内核版本的Linux平台时,那时它会在加载该驱动程序时给予跟随。

insmod:插入'usbtest.ko'时出错:-1模块格式无效

我在dmesg中看到过显示有关模块版本的错误

usbtest:不同意符号module_layout的版本

我也在另一个论坛上看到过这个问题,他们建议在另一台PC上再次编译驱动程序。但我认为这不是一个合适的解决方案。

有没有人知道如何解决这个版本依赖问题,因为我的客户端需要2.6.30到3.9内核之间的任何内核的驱动程序。?

所以,我需要一些特定的解决方案,以便可以在任何Linux内核版本上加载编译的驱动程序,具体取决于特定的内核版本。

请尽快帮助我解决上述问题,因为这对我来说是一个关键问题。

提前感谢您的支持。

1 个答案:

答案 0 :(得分:2)

您正在编写一个旨在使用内核的多个版本的模块,您可能必须使用宏和#ifdef结构来正确构建代码。

您需要使用linux/version.h中的定义。