交叉编译内核和内核模块问题

问题描述 投票:0回答:1

[我上周一直在努力达到我尚未达到的目标。

我的最终目标是针对某些体系结构进行交叉编译(在这个问题中,我仅以MIPSLE为例进行说明)我想在我的计算机上使用的几个内核模块家用路由器,通过在运行时使用INSMOD加载它们。

我的路由器缺少某些iptables功能,这就是为什么在内核编译期间,谁对其进行编译决定摆脱它们。

The current kernel version is quite obsolete: Linux version 2.6.36+ by doing /proc/version

我阅读了许多文档,但仍然不确定是否可以仅编译某些模块,或者是否有必要每次都编译整个内核(有人说对于某些模块是可行的,而对于其他具有更多依赖性的模块则是不是,是真的吗?)。

在这种情况下,我需要的内核模块位于/net/ipv4/netfilter/

由于我没有获得如何以独立方式编译内核模块的方法,所以我决定交叉编译整个内核并采用我需要的模块。

因此,我已经下载了正确的工具链(uclibc mipsle工具链),并且我成功地编译了一个简单的工作hello世界,该世界已经在具有ssh shell的路由器上执行了。

所以我确定我使用的工具链是正确的。


现在,由于我想用最新版本的内核进行测试,因此我下载了具有相应内核的最新ubuntu 20,并且我已经成功地对其进行了编译,而我之前所说的内核模块位于netfilter文件夹中以[[.ko格式,完美!

我清楚地将主机的/boot/config_file用作.config

因此,我下载了路由器具有的相同内核版本(2.6.36),并尝试使用.config文件进行编译,该文件在GitHub上与我的mipsle设备相关。相同的内核版本。

[这里我认为我们遇到了第一个问题,我试图找到设备的.config以便具有平滑的配置,但是我没有/boot文件夹,并且也不在/proc中。

我如何得到它?

无论如何,我已经用过了,编译看起来好像没有失败,但是这些是最后几行:

CC drivers/usb/storage/usual-tables.o LD drivers/usb/storage/usb-storage.o LD drivers/usb/storage/built-in.o LD drivers/usb/built-in.o LD drivers/video/built-in.o LD drivers/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o LD init/built-in.o LD .tmp_vmlinux1 KSYM .tmp_kallsyms1.S AS .tmp_kallsyms1.o LD .tmp_vmlinux2 KSYM .tmp_kallsyms2.S AS .tmp_kallsyms2.o LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/mips/boot/vmlinux.bin Building modules, stage 2. MODPOST 1 modules CC drivers/scsi/scsi_wait_scan.mod.o LD [M] drivers/scsi/scsi_wait_scan.ko

它说“ 1个模块”,但我不明白为什么,现在在/net/ipv4/netfilter文件夹中,我有.o文件而不是.ko文件,就像没有链接一样。

由于我发疯了,经过几次尝试,我都不知道该怎么做,所以我决定使用主机的配置文件(ubuntu 2020,内核5.4.0.26),编译成功,< [文件夹中有.ko个文件。

问题是,它们显然是为x86-64编译的模块,而不是MIPS和其他与我的x86-64机器的配置有关的明显“问题”。

所以,我现在想的是,我发现的.config可能以某种方式被破坏了,我还尝试通过添加注释来禁用该SCSI模块,但是没有,我总是得到相同的东西。

显然,每次尝试之间我总是做make distcleanmake clean

您建议我做什么?我什至不会发布我已经阅读的有关该材料的所有参考书,因为我可以用该数量的数据来标记StackOverflow的服务器。

感谢大家,为墙贴感到抱歉。

linux-kernel kernel cross-compiling kernel-module mips32
1个回答
0
投票
我不确定是否可以只编译某些模块,或者是否有必要每次都编译整个内核
嗯,您只能编译单个模块,但是编译模块需要已经构建内核。但是,一旦执行了一次,就应该能够单独编译其他模块。也就是说,当然,如果您不希望将它们嵌入内核本身(CONFIG_XXX=y而不是CONFIG_XXX=m)。您

应该只能这样编译所需的模块(假设/path/to/linux是您已构建的内核源代码所在的目录):

$ cd /path/to/linux $ cd path/to/module/folder $ make -C /path/to/linux M=$(pwd) modules

我试图找到设备的.config以使其具有平滑的配置,但是我没有/boot文件夹,并且它也不在/proc中。我如何得到它?

您在哪里精确看? /proc/config.gz的存在取决于CONFIG_IKCONFIG_PROCCONFIG_IKCONFIG_PROC)。如果找不到该文件,则很可能是因为在构建内核时禁用了该配置选项。您可以尝试在see also here下查看(就像您已经做过的那样),或者在/boot下查看,但是不幸的是,除此之外没有太多其他事情可以做。

[我见过人们/lib/modules/$(uname -r)/build/.config试图运行suggest然后检查modprobe configs,但这似乎很奇怪,因为据我所知,内核配置不应该被配置为可加载模块。] >

你建议我做什么?

好吧,您现在最想要的是找到路由器(或兼容的路由器)的配置文件。如果找不到,将很难正确解决所有问题。您可能想搜索适用于您的路由器(如果有)或互联网上其他任何地方的OpenWRT版本,只要您找到合适的配置即可。在搜索中包括您的路由器品牌和/或型号。不过,StackOverflow并不能真正为您提供太多帮助。

您可以尝试使用默认配置以及所需的模块交叉编译5.4内核。例如,假设您已经准备好正确的交叉编译工具链:

/proc/config.gz

无论如何,考虑从2.6内核升级到5.4内核是一个很大的变化,它很可能最终破坏所有功能,因此在尝试任何操作之前,请确保对路由器固件进行备份。

© www.soinside.com 2019 - 2024. All rights reserved.