Какие последствия могут возникнуть при использовании альтернативной версии 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

Согласнодокументация ядра, вы должны иметь возможность использовать любую версию GCC, начиная с 3.2. Однако на практике я не думаю, что старые версии 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 по умолчанию).

Связанный контент