我想知道一旦内核配置了哪些文件将被编译以及按什么顺序可以知道?
我想知道,因为我对建筑过程的变化感兴趣,而且我不希望拥有与建筑一样多的工具链......
谢谢
答案 0 :(得分:3)
完成redit:
您可以修改内核源代码中的Make过程以使用
-n, --just-print, --dry-run, --recon
这样做的最终结果是永远不会调用编译器或任何可执行文件。它只是伪造它并告诉你它会做什么。
从中选择并grep文件,而不构建源代码。这可能就像在shell中设置MAKE环境以使用上面的选项一样简单。然后只需查看涉及.c和.h文件的所有编译器命令。下载2.6.29.2的内核源代码,以便了解如何执行此操作。编辑来。
祝你好运
回复你的表现。也许发布shell脚本! :)
<强>后续强>:
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&gt; 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,则某些ASM和体系结构特定文件会与真正的构建不同。
从评论中修改
要抑制ld失败,您需要在内核make文件中找到以下部分(或类似部分)。
# Make variables (CC, etc...)
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
在尝试枚举前面步骤中使用的源文件(管道和干运行中的grepping)之前,您需要运行配置步骤来配置源,因此您可以在Makefile.enum
和LD = $(CROSS_COMPILE)ld
中进行编辑。在运行正常的配置步骤之后使用它(无论架构如何,都需要生成一些config.h类型的文件。因此,将内核源代码放到您要进行实际编译的位置,模块和所有内容)。呼!
现在当你在伪造make枚举源文件时,发布内核源代码配置(指定驱动程序/模块,无论如何),LD会在你发现时失败。您可以从
更改LDLD = -$(CROSS_COMPILE)ld
到
make | grep -E "[a-zA-Z0-9_-]+\.[ch]"
注意' - '字符。这告诉Makefile忽略警告。显然你试图做的是不寻常的,但非常酷:)通过找到Makefile部分并调整执行的命令,可以避免进一步的错误。我建议你对Makefiles非常友好,因为你可能需要稍后改变IF语句。一旦你把所有东西都整理好了,你就会有一个'哑'的makefile,它会吐出.c文件,这样就可以了。
{{1}}
或者其他什么。
我也有一个很好的建议来验证你的结果......实际构建内核......但是使用Linux的inotify API(你可以在这里获得Python绑定http://pyinotify.sourceforge.net/)并在编译中监视文件系统事件窗口(例如gcc读取的.c文件)。然后将其与'dumb'makefile中的列表进行比较。
好的,我希望这不是太多的华夫饼干! 祝你好运