【问题标题】:Not compiling the whole kernel only part of it不编译整个内核,只编译它的一部分
【发布时间】:2015-08-14 14:02:07
【问题描述】:

我的兴趣是了解 Linux 内核。尤其是文件系统。 所以我所做的是,我在内核源代码的fs/ext3/文件夹中的文件(如inode.c、ialloc.c等)中放置了“printk”语句。

所以现在我想要的是,而不是编译整个内核,我只想编译与 ext3 文件系统有关的部分。 有没有办法只编译我在基于 debian 的系统中进行更改的部分(我使用的是 ubuntu 14.04)。尽管我只对其中的一小部分进行了更改,但我必须等待整个内核进行不必要的编译。 请在这方面帮助我。

P.S.- 我搜索了互联网,也找到了一些链接。但它们并不令人满意。他们的步骤表明编译完整的内核。

【问题讨论】:

  • 运行 make 应该只构建过时的部分。
  • 是的,我同意先生,但它构建了完整的内核。我想要的只是构建我进行更改的部分并将其添加到现有内核中。不要为了一点点改变而构建整个内核。
  • 也许值得尝试弄清楚为什么 make 认为你所有的对象都是过时的。一种可能性是某些内核头文件的时间戳晚于当前系统日期时间。

标签: linux-kernel filesystems ubuntu-14.04 ext3 debian-based


【解决方案1】:

我假设你已经修改了 fs/ext3/inode.c

假设你的内核源码目录是 linux-x.x.x 换个目录

cd linux-x.x.x

编译特定文件

制作./fs/ext3/inode.o

只会编译特定的文件。 对您更改的所有文件执行相同操作。

【讨论】:

  • 这是一个原本不应该存在的问题的解决方案。 make 将自动重新编译修改过的文件并跳过编译未更改的文件。如果没有,说明你的设置有问题,你应该修复它而不是解决它。
【解决方案2】:

是的,我同意先生,但它构建了完整的内核。而我想要的是 只构建我进行更改的部分并将其添加到 现有内核。不是为了一点点改变就构建整个内核。

如果我理解正确,您想为内核的文件系统部分编译目标代码,并以某种方式将其破解到您当前的内核中。

简答:

这是不可能的。只需编译整个内核。第一次编译后,make 将确保只重新编译更改的文件,以便以后的构建速度更快。

长答案:

如果您当前运行的内核已将 EXT3 支持编译为模块(我假设这是可能的 - 我没有检查过),您可以尝试将修改后的文件系统代码也编译为模块并将其交换到您正在运行的内核通过卸载当前文件系统模块并加载你的。当然,如果你在卸载时实际上没有使用 EXT3 驱动程序,你将能够做到这一点。

然后,您将遇到与构建和运行 OOT 内核模块相同的问题。您几乎可以肯定需要内核头文件、用于编译当前内核的相同编译器版本以及要匹配的内核源代码。您可能还需要摆弄 Makefile,以便将树内模块构建为 OOT 模块。

当然,这都是假设您当前的内核是使用 EXT3 驱动程序作为可加载内核模块构建的,但情况可能并非如此。

如果不是这样,那你就很不走运了。如果你很聪明,你也许可以使用一些链接器黑客技术将 EXT3 子系统与当前内核中修改后的目标文件交换出来。如果这对你来说没有意义,那就说不可能吧。

【讨论】:

    【解决方案3】:

    构建单个模块(在您的情况下为 ext3)。尝试 make M="path_to_module"

    cd linux-src 
    make M=fs/ext3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2017-03-09
      • 1970-01-01
      相关资源
      最近更新 更多