我正在尝试使用自定义配置编译主线 Linux 内核。这个!
在 64 位系统上运行。
在最后一步,链接内核时失败,因为出现 OOM(错误 137)。
[...]
DESCEND objtool
INSTALL libsubcmd_headers
CALL scripts/checksyscalls.sh
LD vmlinux.o
Killed
make[2]: *** [scripts/Makefile.vmlinux_o:61: vmlinux.o] Error 137
make[2]: *** Deleting file 'vmlinux.o'
[...]
ulimit -a
说每个进程的内存是无限的。
我都试过了make
,make -j1
make -j4
没有任何区别。
使用 gcc 作为编译器而不是 clang 的结果相同。
有人知道为什么编译会消耗这么多内存吗?开发 Linux 的成本越来越高了:\
答案1
开发 Linux 的成本越来越高
恐怕一直如此。
32GB RAM 在内核开发桌面上很常见。然而他们中的一些人开始遇到ooms 在构建他们的 allyesconfig-ed 内核时。
幸运的是你…显然不是 allyesconfig-ing…你不应该需要超过 32G…;-)
顺便说一句,CONFIG_HAVE_OBJTOOL=y
作为 .config 文件的一部分阅读,您可能会从作为上面链接的讨论的一部分提交的补丁中获益。
有人知道为什么编译会消耗这么多内存吗?
你可能是唯一能准确说出这一点的人。 (考虑到各种 *.o 文件的大小后,您可能能够在内核源代码分发的每个顶级目录中找到(因为编译已成功实现))
根据您提供的信息(kernel.config 文件),我只能大胆推测:
A/ 内核的每个组件都将被静态链接:
(因为我注意到您选择的所有 OPTION_* 都标记为“=y”)
这本身没有任何问题,因为在内核中构建所有内容可能有很多充分的理由,但这肯定会显着增加链接所有内容时所需的 RAM这个一起。
=> 您可能应该考虑尽可能将内核部分构建为模块。
B/大量的CONFIG_调试出现设置。 再一次,这本身并没有什么问题,但是它可能会显着增加链接不同部分所需的 RAM,更不用说更多了,因为它意味着 CONFIG_KALLSYMS_*=y
顺便说一句,考虑到所选的调试功能,除了 CONFIG_HZ_100=y 之外,我还假设您不是在寻找最佳的延迟/性能。 => 然后我会考虑选择 CONFIG_CC_OPTIMIZE_FOR_SIZE