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

标签 build-process makefile linux-kernel

我想知道配置内核后是否可以知道哪些文件将被编译以及以什么顺序编译?

我想知道这一点,因为我对根据架构的构建过程的变化感兴趣,并且我不想拥有与架构一样多的工具链......

谢谢

最佳答案

完成编辑:

可以修改内核源码中的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

您需要先运行配置步骤来配置源,然后再尝试枚举前面步骤中使用的源文件(从空运行中进行管道传输和 grep),以便您可以在 Makefile.enum 中进行编辑。并在运行正常配置步骤后使用它(无论架构如何,都需要生成一些 config.h 类型的文件。因此,获取内核源代码以进行实际编译、模块等)。哇!

现在,当您进行 fake-make 来枚举源文件时,后内核源配置(指定驱动程序/模块等)LD 将失败,正如您发现的那样。您可以从

更改 LD
LD              = $(CROSS_COMPILE)ld

LD              = -$(CROSS_COMPILE)ld

注意“-”字符。这告诉 Makefile 忽略警告。显然,您尝试做的事情很不寻常,但很酷:)可以通过查找 Makefile 部分并调整执行的命令来抑制进一步的错误。我建议您对 Makefile 非常友好,因为稍后您可能需要更改 IF 语句。一旦你把所有的事情都搞清楚了,你就会有一个“哑”的makefile,它会吐出.c文件,这样你就可以做

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

或者其他什么。

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

好吧,我希望这不是太胡扯! 祝你好运

关于build-process - 了解构建 Linux 内核时要编译的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/899659/

相关文章:

sublimetext2 - 我可以使用命令行构建 Processing 草图的 "JavaScript Mode"版本吗?

c++ - 是否可以将 cmake 项目链接到子项目?

c - 仅在 debian 中覆盖我的应用程序的系统调用

软件可以在裸机上执行吗?

c - mmap 实际上返回什么?

android - 更改或升级内置 org.json 库是否可能且是个好主意?

build-process - tfs2010 本地构建

linux - Makefile 错误地混淆了不存在的文件夹

c++ - Makefile 模式规则 : Circular makefile. o <- makefile 依赖项已删除

docker - 将docker命令结果存储在Makefile中的变量中