ARM架构WiFi驱动交叉编译报错求助:指定ARCH仍调用x86文件
这种交叉编译时误加载宿主(x86)架构文件的问题我碰到过好多次,大概率是几个关键配置环节没做足,咱们一步步排查:
确认ARM内核编译产物的完整性
你指定的KERNELDIR必须是完全针对ARM架构编译完成的内核目录,不能是只跑了defconfig却没编译的目录,也不能残留x86内核的编译产物:- 检查内核目录下的
.config文件,确保CONFIG_ARCH_ARM=y(而非x86相关配置); - 确认目录下存在
Module.symvers、vmlinux和arch/arm下的编译产物; - 如果之前内核编译不完整,重新执行:
ARCH=arm CROSS_COMPILE=<你的工具链前缀> make modules_prepare(或者完整编译内核+模块:ARCH=arm CROSS_COMPILE=xxx make -j8)。
- 检查内核目录下的
确保交叉编译环境变量生效且优先级正确
不要只依赖shell的环境变量,建议直接在编译驱动的命令行里显式指定参数(避免驱动Makefile覆盖变量):make ARCH=arm CROSS_COMPILE=<你的工具链完整路径/前缀> KERNELDIR=/path/to/your/arm-kernel clean all比如工具链前缀是
arm-linux-gnueabihf-,就写成CROSS_COMPILE=/opt/toolchain/arm-linux-gnueabihf-。同时可以先在shell里验证环境变量:echo $ARCH和echo $CROSS_COMPILE,确保输出正确。清理驱动源码的残留编译产物
如果之前在x86平台编译过这个WiFi驱动,目录里会残留x86的.o、.ko和临时文件,编译时会优先调用这些旧文件。先执行:make distclean彻底清理所有编译残留,再重新执行交叉编译命令。
检查驱动Makefile的硬编码问题
部分第三方WiFi驱动的Makefile可能存在硬编码的架构或内核路径,比如:ARCH := x86 KERNELDIR := /lib/modules/$(shell uname -r)/build打开驱动的Makefile,查找这类硬编码,要么注释掉,要么改成依赖外部传入的变量(比如
ARCH ?= $(shell uname -m)),确保我们指定的ARCH和KERNELDIR能生效。验证交叉工具链的正确性
执行工具链的gcc命令验证目标架构:<你的工具链前缀>-gcc -v输出里应该包含
Target: arm-xxx-linux-gnueabihf之类的ARM架构标识,确保没有调用系统默认的x86 gcc。
按照上述步骤排查后,基本能解决误引用x86文件的问题。如果还有具体的报错信息,可以补充出来进一步分析。
内容的提问来源于stack exchange,提问作者Rafal

