カスタム構成でメインライン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
。
clangの代わりにgccをコンパイラとして使用すると、結果は同じです。
コンパイルがなぜそんなに多くのメモリを消費するのか知っている人はいますか? Linux開発コストがますます高まっています。\
答え1
Linux開発コストがますます高まっています。
いつもこんなことだったと思います。
32GB RAMはカーネル開発デスクトップで一般的です。しかし、それらのいくつかは出会い始めましたallesconfig-edカーネルを構築するときに非常に便利です。
運が良かったですね…確かにallesconfig-ingではありません…32G以上は必要ありません…;-)
ところで、CONFIG_HAVE_OBJTOOL=y
.configファイルの一部を読むことで、上記のリンクされたディスカッションの一部として送信されたパッチの利点を享受できます。
コンパイルがなぜそんなに多くのメモリを消費するのか知っている人はいますか?
これを正確に言える人はあなただけかもしれません。 (カーネルソースディストリビューションのすべての最上位ディレクトリにあるさまざまな* .oファイルのサイズを考慮して(コンパイルが正常に行われたため))
あなたが提供した情報(kernel.configファイル)に基づいて、次のように推測できます。
A/カーネルの各コンポーネントは静的にリンクされています。
(選択したすべてのOPTION_ *が「= y」とマークされていることがわかったので)
これ自体に問題はありません。カーネルからすべてをビルドしなければならない理由はたくさんあるからです。ただし、リンク時にはかなり追加されます。これに必要なすべてのRAMが付属しています。
=>可能であれば、カーネル部分をモジュールとして構築することを検討する必要があります。
B/多くのCONFIG_デバッグ設定が表示されます。 繰り返しますが、これ自体には問題はありませんが、CONFIG_KALLSYMS_*=y を意味するため、他の部分を接続するために必要なRAMが大幅に増える可能性があります。
しかし、CONFIG_HZ_100 = yに加えて、選択したデバッグ機能を考慮して最適なレイテンシ/パフォーマンスを探していないとします。 =>その場合は、CONFIG_CC_OPTIMIZE_FOR_SIZEの選択を考えてみましょう。