[我上周一直在努力达到我尚未达到的目标。
我的最终目标是针对某些体系结构进行交叉编译(在这个问题中,我仅以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 distclean
和make clean
。
您建议我做什么?我什至不会发布我已经阅读的有关该材料的所有参考书,因为我可以用该数量的数据来标记StackOverflow的服务器。
感谢大家,为墙贴感到抱歉。
嗯,您只能编译单个模块,但是编译模块需要已经构建内核。但是,一旦执行了一次,就应该能够单独编译其他模块。也就是说,当然,如果您不希望将它们嵌入内核本身(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_PROC
(CONFIG_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内核是一个很大的变化,它很可能最终破坏所有功能,因此在尝试任何操作之前,请确保对路由器固件进行备份。