如何交叉编译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-gccarm-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都支持吗?

如何安装arm-liunx交叉编译环境?

arm-linux-gcc交叉编译器的制作,以及版本选择问题。

GEOS/GDAL 交叉编译ARM64-linux版本

如何更改ubuntu中交叉编译工具链?

Ubuntu arm 交叉编译 and snapcraft