使用备用 GCC 版本编译内核可能会产生什么后果?

使用备用 GCC 版本编译内核可能会产生什么后果?

相关:

无法编译内核:错误,内核不支持 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)/.kernelvariableslinux-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 作为默认值),使用它都会生成一个工作内核(或正在运行的内核的模块)。

相关内容