我想知道是否有可能在配置内核后知道哪些文件将被编译以及以什么顺序编译?
我想知道这一点,因为我对根据架构的构建过程的变化感兴趣,并且我不想拥有与架构一样多的工具链......
谢谢
我想知道是否有可能在配置内核后知道哪些文件将被编译以及以什么顺序编译?
我想知道这一点,因为我对根据架构的构建过程的变化感兴趣,并且我不想拥有与架构一样多的工具链......
谢谢
完全重新编辑:
您可以修改内核源代码中的 Make 进程以使用
-n, --just-print, --dry-run, --recon
这样做的最终结果是永远不会调用编译器或任何可执行文件。它只是伪造它并告诉你它会做什么。
选项并从中 grep 文件而不构建源代码。这可能就像在 shell 中设置 MAKE 环境以使用上述选项一样简单。然后只需 grep 出所有涉及 .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 > 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
运行正常配置后进行编辑并使用它步骤(无论架构如何,都需要生成一些 config.h 类型的文件。因此,将内核源代码获取到您将要进行实际编译、模块和所有内容的地步)。哇!
现在,当您进行伪造以枚举源文件时,发布内核源配置(指定驱动程序/模块等)LD 将失败,正如您所发现的那样。您可以从
LD = $(CROSS_COMPILE)ld
至
LD = -$(CROSS_COMPILE)ld
注意“-”字符。这告诉 Makefile 忽略警告。显然,您尝试做的事情是不寻常的,但非常酷:) 可以通过查找 Makefile 部分并调整执行的命令来抑制进一步的错误。我建议您对 Makefiles 非常友好,因为您可能需要稍后更改 IF 语句。整理完所有内容后,您将拥有一个“哑”的 makefile,它将吐出 .c 文件,因此您可以执行
make | grep -E "[a-zA-Z0-9_-]+\.[ch]"
管他呢。
我还有一个很酷的建议来验证你的结果......实际构建内核......但使用 Linux 的 inotify API(你可以在此处获取 Python 绑定http://pyinotify.sourceforge.net/)并注意文件系统事件编译窗口(例如 gcc 正在读取的 .c 文件)。然后将其与“哑”makefile 中的列表进行比较。
好吧,我希望这不是太多的华夫饼!祝你好运