関連:
カーネルをコンパイルできません: エラー、カーネルは PIC モードをサポートしていません
私も、パッチを当てる代わりに、この問題が発生しました。
異なる gcc バージョンで代替を構成し、v4 から v5 にジャンプしたところ、コンパイルできるようになりました。
$ update-alternatives --config gcc
There are 3 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-6 30 auto mode
1 /usr/bin/gcc-4.8 10 manual mode
* 2 /usr/bin/gcc-5 20 manual mode
3 /usr/bin/gcc-6 30 manual mode
どのような問題が発生する可能性がありますか? カーネルをコンパイルするための GCC バージョンを選択するためのベスト プラクティスはありますか?
システムはDebian Stretchです。
答え1
によるカーネルドキュメント、3.2 以降のどのバージョンの GCC でも使用できるはずです。ただし、実際には、古いバージョンの GCC はカーネル ビルドであまりテストされていないと思うので、新しいバージョンの GCC を使用する方がよいでしょう (ただし、あまり新しいものは避けてください。GCC 6 には問題があります)。
Debianでは、適切なGCCのバージョンは、カーネルソースパッケージのビルド依存関係、またはカーネルヘッダーパッケージの依存関係。つまり、linux-headers-4.7.0-1-amd64
依存するlinux-compiler-gcc-5-x86
それはgcc-5
。
の正しい値を自動的に取得するには、 (必要に応じてインストール後に)CC
から値を取得します。たとえば、私のシステムでは現在、/usr/src/linux-headers-$(uname -r)/.kernelvariables
linux-headers-$(uname -r)
override ARCH = x86
override KERNELRELEASE = 4.7.0-1-amd64
CCACHE = ccache
CC = $(if $(DEBIAN_KERNEL_USE_CCACHE),$(CCACHE)) $(CROSS_COMPILE)gcc-5
ifneq ($(DEB_BUILD_ARCH),$(DEB_HOST_ARCH))
override CROSS_COMPILE = $(DEB_HOST_GNU_TYPE)-
endif
これを使用すると、CC
デフォルトの GCC (私はデフォルトで GCC 6 を使用しています) に関係なく、動作するカーネル (または実行中のカーネルのモジュール) が生成されます。