Que consequências podem surgir do uso de uma versão alternativa do GCC para compilar o kernel?

Que consequências podem surgir do uso de uma versão alternativa do GCC para compilar o kernel?

Relacionado a:

Não é possível compilar o kernel: erro, o kernel não suporta o modo PIC

Eu também tive esse problema, em vez de corrigir;

Configurei alternativas com uma versão diferente do gcc, pulei da v4 para a v5, está compilando agora.

$ 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

Que problemas podem surgir, existe alguma prática recomendada para escolher uma versão do GCC para compilar o kernel?

O sistema é o Debian Stretch.

Responder1

De acordo comdocumentação do kernel, você poderá usar qualquer versão do GCC começando com 3.2. Na prática, porém, não acho que versões mais antigas do GCC tendam a ser muito testadas com compilações de kernel, então é melhor usar versões mais recentes do GCC (mas não muito novas, há problemas com o GCC 6).

No Debian, você pode descobrir a versão apropriada do GCC olhando nopacote fonte do kerneldependências de compilação ou as dependências do pacote de cabeçalho do kernel. Por isso,linux-headers-4.7.0-1-amd64depende delinux-compiler-gcc-5-x86que dependegcc-5.

Você pode recuperar o valor correto CCautomaticamente extraindo os valores de /usr/src/linux-headers-$(uname -r)/.kernelvariables(após a instalação, linux-headers-$(uname -r)se necessário). Por exemplo, meu sistema atualmente tem

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

Usar isso CCproduzirá um kernel funcional (ou módulo para o kernel em execução), independentemente do GCC padrão (eu uso o GCC 6 como padrão).

informação relacionada