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

时间:2020-04-30 15:30:05

标签: linux-kernel kernel cross-compiling kernel-module mips32

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

我的最终目标是针对某些体系结构进行交叉编译(在这个问题中,我仅以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 distcleanmake clean

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

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

1 个答案:

答案 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_PROCsee 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>

相关问题