代码之家  ›  专栏  ›  技术社区  ›  LB40

了解构建Linux内核时要编译的文件

  •  2
  • LB40  · 技术社区  · 16 年前

    我想知道,一旦配置了内核,是否有可能知道哪些文件将被编译,以及以什么顺序编译?

    我想知道这一点,因为我对根据体系结构的构建过程的变化感兴趣,我不想有体系结构那样多的工具链……

    谢谢

    1 回复  |  直到 16 年前
        1
  •  3
  •   Aiden Bell    16 年前

    完整重拨:

    您可以修改内核源代码中的make进程以使用

    -n, --just-print, --dry-run, --recon
    

    这样做的最终结果是编译器或任何可执行文件都不会被调用。只是假装告诉你 做。

    选项并从中grep文件,而不构建源文件。这可能与在shell中设置make环境以使用上面的选项一样简单。然后把所有涉及.c和.h文件的编译器命令都删除。下载内核源代码2.622.2,看看如何做到这一点。编辑来吧。

    祝你好运

    回邮你的进展。或许可以贴出贝壳脚本!:)

    追随 :

    2.6.29.2内核源代码的第13行包含在/2.6.19.2/makefile中

    # Do not:
    # o  use make's built-in rules and variables
    #    (this increases performance and avoids hard-to-debug behaviour);
    # o  print "Entering directory ...";
    MAKEFLAGS += -rR --no-print-directory
    
    # We are using a recursive build, so we need to do a little thinking
    # to get the ordering right.
    

    编辑 MAKEFLAGS 包含dryrun标志的变量 应该 允许您保存特定make配置的输出,然后稍后对其进行grep。ala make>save.txt文件

    我把我的改成了

    MAKEFLAGS += -rR --no-print-directory --just-print
    

    例如(可能更好):

    [aiden@host linux-2.6.29.2]$ \
    make > build_out.txt; grep -o -E "[a-zA-Z0-9_-]+\.[ch]" build_out.txt 
    

    不是很完美,但我的工作方式很差劲,应该能让你走。同样的基本过程将有望应用于带有配置内核的盲make。

    警告 在不维护特定于体系结构的工具链或在目标体系结构上运行make的情况下,某些特定于asm和体系结构的文件与真正的构建不同。

    从评论编辑

    要抑制ld失败,需要在kernel make文件中找到以下部分(或类似部分)。

    # Make variables (CC, etc...)
    
    AS              = $(CROSS_COMPILE)as
    LD              = $(CROSS_COMPILE)ld
    CC              = $(CROSS_COMPILE)gcc
    CPP             = $(CC) -E
    AR              = $(CROSS_COMPILE)ar
    

    您需要先运行配置步骤来配置源,然后再尝试枚举先前步骤中使用的源文件(管道和从干运行重新映射),以便可以在 Makefile.enum 在运行正常的配置步骤之后使用它(不管体系结构如何,需要生成一些config.h类型的文件)。因此,将内核源代码设置到您将要进行实际编译的位置(模块和全部)。唷!

    现在,当您使用伪make枚举源文件时,post kernel source configuration(指定驱动程序/模块,不管是什么)ld将失败。您可以从

    LD              = $(CROSS_COMPILE)ld
    

    LD              = -$(CROSS_COMPILE)ld
    

    注意“-”字符。这告诉makefile忽略警告。显然,你试图做的是不寻常的,但很酷:通过找到MaFixFipe部分和调整执行的命令可以进一步抑制错误。我建议您对makefile非常友好,因为以后可能需要更改if语句。一旦你把所有的东西都分类了,你会有一个“哑巴”的Mag文件,将吐出.c文件,这样你就可以做了。

    make | grep -E "[a-zA-Z0-9_-]+\.[ch]"
    

    或者什么。

    我也有一个很酷的建议来验证你的结果…实际上构建内核…但是使用Linux的API(您可以在这里获得Python绑定) http://pyinotify.sourceforge.net/ )并在编译窗口中监视文件系统事件(例如gcc正在读取的.c文件)。然后将其与“dumb”makefile中的列表进行比较。

    好吧,我希望那不是太多华夫饼! 祝你好运