如何交叉编译ARM版本的LKM?
Posted
技术标签:
【中文标题】如何交叉编译ARM版本的LKM?【英文标题】:How to cross-compile ARM version of LKM? 【发布时间】:2022-01-03 22:05:16 【问题描述】:我需要对一个路由器进行 MITM 攻击,这是一个嵌入式 linux 系统,它的架构是 ARM。 linux内核是2.4.24。通过 MITM 攻击,我的意思是拦截数据包,重新编辑它并转发它。我想使用网络过滤器。但是当我尝试交叉编译LKM时,我遇到了很多问题。
和往常一样,LKM Makefile 如下:
obj-m+=hello.o
KDIR = /lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(shell pwd) modules
clean:
make -C $(KDIR) M=$(shell pwd) clean
我下载了 linux 内核 2.4.24。但是当涉及到交叉编译环境时,问题就出现了。
如何设置KDIR
路径?提取linux_kernel_2.4.24.tar.gz
的路径?我需要先交叉编译内核吗?怎么样?
首先,我将KDIR
设置为linux_kernel_2.4.24
的路径,然后make
,错误是“当前内核配置已禁用模块”。目前我还没有成功make menuconfig
这个版本的内核。
其次,我尝试在 CentOS 5.4 32bit 上进行交叉编译,其内核为 2.6.18。当我将CC=arm-linux-gcc
添加到Makefile
并将KDIR 设置为 /lib/modules/$(shell uname -r)/build
时,结果显示“没有手臂......”。
谁能指定如何在最新的linux上编译老版本内核的LKM?以及
【问题讨论】:
【参考方案1】:如何设置
KDIR
路径?提取linux_kernel_2.4.24.tar.gz
的路径?
是的,就像您通常对任何其他类型的模块一样,KDIR
需要指向 built 内核源代码根目录。
我需要先交叉编译内核吗?怎么样?
是的,你知道。你这样做:
-
下载/编译/安装正确的交叉编译工具链。例如,在 Debian 上,要获得 ARM 交叉编译工具链,我可以使用
sudo apt install binutils-arm-linux-gnueabi
,它将安装您通常在 binutils
中拥有的所有二进制文件,前缀为 arm-linux-gnueabi-
(例如 arm-linux-gnueabi-gcc
、arm-linux-gnueabi-objdump
等...)。您需要所有的 binutils,而不仅仅是 gcc
。
将ARCH=
设置为所需的目标架构,例如ARCH=arm
。
将CROSS_COMPILE=
设置为您的交叉编译工具链前缀,例如CROSS_COMPILE=arm-linux-
。如果您想使用下载的工具链,这也适用,因为您可以指定 CROSS_COMPILE=/path/to/toolchain/
假设此目录包含所有需要的可执行文件。
获取目标系统的有效配置。如果系统上有.config
,您可以使用它(只需将其从目标系统复制到KDIR/.config
),然后使用make menuconfig
更新它。
使用make all
或您需要的任何其他目标进行构建。
【讨论】:
以上是关于如何交叉编译ARM版本的LKM?的主要内容,如果未能解决你的问题,请参考以下文章
关于Linux上的arm-linux交叉编译工具链的问题:但是arm也有很多种啊! 这个工具是对所有的ARM都支持吗?