【Linux内核驱动】模块编译技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wr132/article/details/78719615

如何指定处理器架构和交叉编译器版本?

export ARCH=arm
export CROSS_COMPILE=/usr/arm/arm-linux-

如何编译源码目录中的特定模块

export SUBDIRS=<module dir>

如何设定内核的version magic

有时候我们无法获取设备的内核源码或者获得的源码与设备中的内核版本不同,此时如果安装内核模块会提示Exec format error错误,同时会在dmesg中提示version magic不符,如果我们想要强制安装这个内核模块,需要修改version magic。

打开以下文件:

${KERNEL_ROOT}/include/linux/vermagic.h

最后的部分会有一个宏定义,用来合成

  #define VERMAGIC_STRING                         \
      UTS_RELEASE " "                         \
      MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             \
      MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS   \
      MODULE_ARCH_VERMAGIC

其中UTS_RELEASE这个宏就是我们执行uname -r后得到的值,它标识内核的详细版本,我们需要先在设备上执行命令获取该值,然后修改此处。这个宏定义在下面这个文件中:

${KERNEL_ROOT}/include/generated/utsrelease.h

如果需要获取完整的version magic,可以执行以下命令:

cat /proc/version

注意:如果强制安装不兼容的模块,可能会导致kernel panic,请务必保证所安装的模块不依赖于当前运行的内核中不存在的组件。

猜你喜欢

转载自blog.csdn.net/wr132/article/details/78719615