交叉编译未知嵌入式Linux内核模块时的加载问题
嵌入式Linux交叉编译内核模块问题
我正在学习嵌入式Linux交叉编译,最终目标是为一款不支持RTL8188无线USB适配器的老旧嵌入式Linux设备编译对应的内核模块,目前借助Buildroot和Bill Van Leeuwen的指南搭建基础交叉编译环境。
目标设备架构信息
通过SSH探测目标设备,获取到以下架构信息:
Processor: ARM926EJ-S Architecture: armv5tejl Kernel Version: 4.12.0BSP8.44.10.38 (unsurprisingly a custom kernel) GCC Version: 11.2.0 LibC: uClibc 1.0.39
Buildroot配置(仅展示与默认值不同的设置)
据此配置Buildroot:
--- Target Options --- Target Architecture: ARM little-endian Target Architecture Variant: arm926t Target ABI: EABI --- Toolchain --- Toolchain Type: External Toolchain Toolchain: Custom Toolchain Toolchain Origin: armv5-eabi--glibc--stable-2022.08-1.tar.bz2 from Bootlin Toolchain GCC version: 11.x Toolchain Kernel Headers: 4.9.x Toolchain C Library uClibc --- Kernel --- Kernel Version: 4.12 Kernel Configuration: In-tree defconfig file Kernal Defconfig Name: multi_v5
初始模块加载失败问题
Buildroot编译成功,也能编译Bill的示例hello.c内核模块,但模块无法在目标设备上运行:
# insmod hello.ko insmod: can't insert 'hello.ko': invalid module format
目标设备上的dmesg未显示额外错误解释模块格式问题。
modinfo输出对比
从目标设备复制一个现有驱动并运行modinfo,与编译的hello.ko输出对比:
$ modinfo hello.ko filename: ~/kmod_hello/hello.ko license: GPL vermagic: 4.12.0BSP8.44.10.38 preempt mod_unload ARMv5 p2v8 ... $ modinfo 8192cu.ko filename: ~/kmod_hello/8192cu.ko license: GPL vermagic: 4.12.0BSP8.44.10.38 preempt mod_unload modversions ARMv5 ...
交叉编译的.ko文件与设备上现有.ko文件的唯一区别是p2v8内核标志,疑惑这是否会导致模块完全无法工作,且无论如何配置Buildroot内核都无法移除该标志。
编辑1:问题推进
调整并修改multi_v5_defconfig内核配置的默认值后,编译环境几乎与正常.ko文件匹配:
$ modinfo hello.ko | grep vermag vermagic: 4.12.0BSP8.44.10.38 preempt mod_unload modversions ARMv5 p2v8 $ modinfo 8192cu.ko | grep vermag vermagic: 4.12.0BSP8.44.10.38 preempt mod_unload modversions ARMv5
现在运行insmod时,dmesg终于给出错误信息:
hello: disagrees about version of symbol module_layout hello: disagrees about version of symbol module_layout
问题推进到需要解决module_layout版本匹配的问题,初步了解到这并非易事。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

