私のユーザースペース(パッケージ)がgcc 4.7
でコンパイルされているとしましょう およびlibc6 2.13
(Debian Wheezy)
gcc 6.3
などの異なる開発環境でLinuxカーネルをコンパイルできますか? およびlibc6 2.24
(つまり、Debian Stretchの下で)?
パッケージとは異なり、カーネルはダイナミックライブラリとリンクされていないことを私は知っています。したがって、理論的には、どのgcc
でも違いはありません。 およびlibc
下でコンパイルされました。
これは本当ですか?
これを行うと問題が発生する可能性がありますか?
異なるgcc
によって引き起こされるいくつかの非互換性がある可能性があります バージョン?
一方、新しいgcc
いくつかの興味深い機能、より良いセキュリティがあります。したがって、おそらくカーネルは最新のgcc
でコンパイルする必要があります ?
承認された回答:
ご指摘のとおり、使用されているCライブラリはカーネルに影響を与えず、カーネルはCライブラリを使用しません。 (カーネルがビルドプロセス中に使用するツールをビルドするために使用されるため、間接的な影響がありますが、最終結果に影響を与える可能性はほとんどありません。)
カーネルは、さまざまなバージョンのコンパイラで構築できます。そのドキュメントによると、GCC3.2以降のみが必要です。また、カーネルが最新バージョンのGCCを公式にサポートするまでにはしばらく時間がかかる場合があり、ディストリビューションカーネルがそれを使用するまでにはさらに時間がかかる場合があります。たとえば、DebianLinuxカーネルパッケージはGCC6を使用し、正しいコンパイラバージョン(linux-compiler-gcc-6-x86
)を提供するための専用パッケージもあります。 amd64
で およびi386
)。カーネルに使用されるコンパイラとユーザースペースに使用されるコンパイラの間に接続はありません(また、すべてのユーザースペースに同じコンパイラを使用する必要はありません。GCC3または2で構築された古いプログラムは、最新のシステムでも動作します)。
新しいバージョンのコンパイラはより多くのセキュリティ機能を提供しますが、GCC 6は、カーネルで使用されるすべてではないにしてもほとんどのセキュリティ機能に十分対応できます。