上周,我一直在努力达到我尚未达到的目标。
我的最终目标是针对某些体系结构进行交叉编译(在这个问题中,我仅以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)之后,我尝试使用在GitHub上找到的与.miple设备相关的.config文件进行编译。我相同的内核版本。
在这里,我认为我们遇到了第一个问题,我试图找到设备的.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 Modules”,但是我不明白为什么,现在在/net/ipv4/netfilter
文件夹中,我有.o
个文件而不是.ko
,就像没有链接一样。
由于我生气了,经过几次尝试都不知道该怎么做,所以我决定使用主机的配置文件(ubuntu 2020,内核5.4.0.26),编译成功, 文件夹中包含.ko
个文件。
问题是,显然它们是为x86-64编译的模块,而不是MIPS和其他与我的x86-64机器的配置有关的明显“问题”。
所以,我现在想的是,我发现的.config
可能以某种方式被破坏了,我还尝试通过添加注释来禁用该SCSI模块,但是没有,我总是得到相同的东西
显然,每次尝试之间我总是做make distclean
和make clean
。
您建议我做什么?我什至都不会发布我已经阅读的有关该材料的所有参考,因为我可以用该数量的数据来标记StackOverflow的服务器。
谢谢大家,对墙贴感到抱歉。
答案 0 :(得分: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_PROC
(see also here)。如果找不到该文件,则最有可能是因为在构建内核时禁用了该配置选项。您可以尝试在/boot
下(就像您已经做过的那样)或在/lib/modules/$(uname -r)/build/.config
下看,但是不幸的是,除此之外没有太多其他事情可做。
我看到人们suggest试图运行modprobe configs
然后检查/proc/config.gz
,但这似乎很奇怪,因为据我所知,内核配置不应配置为作为可加载模块提供。
你建议我做什么?
好吧,您现在最想做的就是找到路由器(或兼容的路由器)的配置文件。如果找不到,将很难正确解决所有问题。您可能想搜索适用于您的路由器(如果有)或互联网上其他任何地方的OpenWRT版本,只要您找到合适的配置即可。在搜索中包括您的路由器品牌和/或型号。不过,StackOverflow并不能真正为您提供太多帮助。
您可以尝试使用默认配置以及所需的模块交叉编译5.4内核。例如,假设您已经准备好正确的交叉编译工具链:
cd /path/to/linux
make ARCH=mips CROSS_COMPILE=your-cross-toolchain-prefix- defconfig
make ARCH=mips CROSS_COMPILE=your-cross-toolchain-prefix- menuconfig
# ... enable the module, tune the config ...
make -j ARCH=mips CROSS_COMPILE=your-cross-toolchain-prefix-
无论如何,请考虑以下事实:从2.6内核跳到5.4内核是一个相当大的变化,它可能最终会破坏所有功能,因此在尝试任何操作之前,请确保对路由器固件进行备份。< / p>