【问题标题】:Building kernel with -save-temps - Are these 9 MB of *.i files all that there is?使用 -save-temps 构建内核 - 这些 9 MB 的 *.i 文件是否全部存在?
【发布时间】:2021-04-05 13:50:25
【问题描述】:

我正在使用 gcc 选项 -save-temps=obj -o 构建 Linux 内核,以便准确了解所有 C 文件是如何被预处理的(并且,作为奖励,文件是如何变成汇编的)。

这是版本详情:

  • 在 Windows 10 版本 1909(内部版本 18363.1256)上运行 WSL 2
  • 发行版是 Ubuntu 20.04 LTS
  • 安装的内核版本是 4.19.128-microsoft-standard
  • 我使用的内核树来自 https://github.com/microhobby/linus-tree,它是用于构建内核的 this 教程的 WSL 内核的一个分支。
  • 当我在第一次构建时出现 [Y/n/?] 标志时,我(尝试)使用大写选项来回答。

我对使用或安装构建的内核不感兴趣,只是看看.i.s 文件的外观。

我在 Makefile 中添加了一些选项:

KBUILD_HOSTCFLAGS   := -Wall -Wno-error=deprecated-declarations -Wmissing-prototypes -Wstrict-prototypes -O2 \
        -fomit-frame-pointer -save-temps=obj -o -std=gnu89 $(HOST_LFS_CFLAGS) \
        $(HOSTCFLAGS)

具体来说,我添加了-save-temps=obj -o -Wno-error=deprecated-declarations 标志。运行此程序,但只生成了一小部分.i 文件,总共只有大约 9.9 MB,与内核中 494 MB 的.c 文件相比,这相形见绌。

我知道只有部分内核是基于您为其构建的体系结构构建的,但这是一个很大的差异。 真正由“标准”内核编译的.c 文件真的很少吗?如果没有,如何获取 gcc 生成的所有 .i.s 文件?

【问题讨论】:

    标签: c gcc linux-kernel windows-subsystem-for-linux preprocessor


    【解决方案1】:

    首先,您不希望出现-o。它设置输出文件的名称,因此,每次编译都会将其输出写入一个具有不寻常名称-std=gnu89 的文件。 (除非稍后添加正确的 -o 选项以覆盖它。)

    修复后...

    KBUILD_HOSTCFLAGS 是用于构建主机程序的CFLAGS,它只是内核源代码的一小部分。

    术语:host 是您正在构建内核的机器,而 target 是最终引导构建内核的机器。它们可能是不同的机器(想象一个软件分销商构建一个供所有客户使用的内核),甚至在交叉编译的情况下也可能是不同的架构。

    作为构建过程的一部分,有必要在主机上编译和运行一些相对较小的 C 程序。它们会解析内核配置文件以创建头文件,或者将二进制固件代码转换为 C 源代码以编译到内核中。 KBUILD_HOSTCFLAGS 选项仅设置在构建这些小程序时要使用的编译器标志。它不会影响编译内核本身时使用的标志。为此,根据https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt,您要添加到cflags-y 变量。如果你把-save-temps 放在那里,你应该会看到你所期望的一切。我希望你有足够多的磁盘空间。

    【讨论】:

    • 啊,它是 Makefile 的不同部分。看来,我需要重温一下我的化妆。谢谢!
    • 关于您的编辑:我可能弄错了,但我认为-save-temps=obj 需要-o 标志,否则所有.i.s 文件将保存到当前目录而不是每个目录,从而可能会覆盖具有相同名称的文件。根据stackoverflow.com/a/46256372/2709212 似乎这两个选项一起出现
    • @ChrisAkridge:嗯,-o 总是接受一个论点;可以像gcc -c -o foo.o foo.c 一样使用它来将输出写入foo.o。因此,如果没有争论,它根本没有意义。 [...]
    • @ChrisAkridge:但是在这里,内核版本要么已经使用-o dir/foo.o,要么没有。在前一种情况下,-save-temps=obj 做你想做的事。在后一种情况下,输出文件无论如何都会写入当前目录(构建必须随时更改到每个源目录),然后-save-temps=obj 再次减少到-save-temps=cwd 并将临时文件写入当前目录为好吧。所以在任何一种情况下,-save-temps=obj 没有任何额外的 -o 是您想要的,并且会将临时文件与目标文件放在同一位置。
    • 不知道在哪里添加cflags-y,所以我改为将save-temps=obj(没有-o,就像你说的那样)添加到KBUILD_CFLAGS,并且成功了!我在每个文件夹中都看到了 .i.s 文件,您希望标准内核构建可以在其中工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多