You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何交叉编译适配ARM架构2.4.24内核版本的LKM可加载内核模块

ARM架构Linux 2.4.24内核LKM交叉编译全流程指导

核心疑问解答

  • KDIR必须指向已经完成ARM架构配置、且经过预编译的2.4.24内核源码根目录,不是单纯的源码解压路径,必须先完成对应版本内核的交叉编译配置和预编译,才能用来编译匹配的LKM。
  • 你两次操作失败的核心原因:第一次是未开启内核模块支持、也未完成ARM架构的内核配置;第二次是误用了x86架构的2.6版本内核头文件,架构和内核版本都不匹配。

具体操作步骤

1. 准备兼容依赖环境

2.4.24内核版本非常老旧,不能使用太新的交叉编译工具链,需提前准备gcc 3.x版本的arm-linux交叉编译链(比如arm-linux-gcc 3.4.1),如果是64位新版系统还需要安装32位兼容库:
Debian/Ubuntu系执行:apt install lib32z1 lib32ncurses5-dev flex bison
CentOS系执行:yum install glibc.i686 libstdc++.i686 flex bison

2. 配置并预编译2.4.24 ARM内核

  1. 解压内核源码包:tar zxvf linux_kernel_2.4.24.tar.gz,进入解压后的内核源码根目录
  2. 导入内核配置:优先使用目标路由器原厂的.config配置文件,直接放到内核根目录即可;如果拿不到原厂配置,执行默认ARM架构配置:make ARCH=arm CROSS_COMPILE=arm-linux- oldconfig
  3. 开启模块支持:执行make ARCH=arm menuconfig,找到Loadable module support分类,勾选Enable loadable module support,保存后退出配置界面

如果menuconfig启动失败,可直接手动修改内核根目录的Makefile,设置CONFIG_MODULES=y

  1. 执行内核预编译:make ARCH=arm CROSS_COMPILE=arm-linux- dep && make ARCH=arm CROSS_COMPILE=arm-linux- zImage,不需要将编译出的内核刷入设备,只要完成预编译生成必要的符号文件和头文件即可

3. 调整LKM编译Makefile

2.4版本内核的LKM编译参数和2.6+内核有差异,不能使用M=参数,要替换为SUBDIRS=,参考写法如下,自行替换对应路径:

obj-m += hello.o
# 替换为你预编译完成的2.4.24 ARM内核源码根目录
KDIR := /path/to/your/precompiled/linux-2.4.24
# 替换为你自己的ARM交叉编译链前缀
CROSS_COMPILE := arm-linux-
PWD := $(shell pwd)

all:
	make -C $(KDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) SUBDIRS=$(PWD) modules
clean:
	make -C $(KDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) SUBDIRS=$(PWD) clean

常见问题排查

  • 如果加载模块时报版本魔术不匹配,说明你编译内核用的配置和目标路由器运行的内核配置不一致,必须获取和目标设备完全一致的.config文件重新编译内核,再编译LKM
  • 如果报netfilter相关函数未定义,确认内核配置中已开启netfilter对应功能,且LKM代码使用2.4版本内核的netfilter API规范,2.4和2.6+的netfilter接口差异极大,不能混用

内容的提问来源于stack exchange,提问作者SwordWorth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:27:08