日前临时维护之前同事写的一个简单linux驱动,遇到了很常见的一个问题,加载驱动时报错:“invalid module format”。
用readelf -h得到的报错的驱动文件信息如下:
而正确的驱动文件是这样的:
可以明显的看到:两个文件差别在于的magic、OS\ABI、flags不一致,尤其是OS/ABI!但却并不清楚它们的含义和区别。我们认为这应该是编译器或内核版本不一致造成的。但是设备上的内核与编译的内核都是同一个版本,于是我们就怀疑是编译器的问题。而设备的dmesg打印显示却是同一个编译器所编译的。后面又检查了许多东西:$PATH,makefile,ARCH,CROSS_COMPILE等,各种方法试了很久,但是都没有找到原因。最后发现是menuconfig的设置有问题,没有使能EABI,需要选定下面两个选项(make menuconfig ARCH=arm,请无视花屏,secureCRT下截的图):
Kernel Features --->
[*] Use the ARM EABI to compilethe kernel
[*] Allow old ABI binaries torun with this kernel (EXPERIMENTAL)