Относится к:
Невозможно скомпилировать ядро: ошибка, ядро не поддерживает режим 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 по умолчанию).