Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z kompilacją kernela: code model kernel does not support PIC mode
#1
0
Usiłuję skompilować kernel 3.16.1 pod Linux Mint Cinamon 19.3 64 bit z kernelem defaultowym - 5.0.0.3 ponieważ mi ten kernel (3.16.1) pod swoim "macierzystym" Mintem 17.3 64bit - wspaniale i stabilnie pracuje. "Fabryczny" .config tego kernela (3.16.1) skompilowałem bez żadnych zmian i to właśnie  ten kernel tak fajnie na tym starym Mincie pracuje. Uzyskane paczki headers.xxx.deb i images.xxx.deb postanowiłem przenieść pod współczesny Mint 19.3 i w nim już bez kompilacji zainstalować wcześniej skompilowany kernel. Rzecz na tym samym laptopie. Niestety - zainstalowany kernel wyrzuca mi : (initramfs) - robiąc stop w uruchamianiu. Postanawiam więc na tym nowym Mincie skompilować na nowo te źródła. Polecienia które wydaję to:

make clean, make mrproper, make menuconfig, a w nim : load i  ładuję stary config173 (tak go nazwałem), potem save i zapisuję jako .config. Po wszystkim polecenie : make-kpkg clean i potem polecenie kompilacji :

make-kpkg --initrd --append-to-version=-short173 kernel_image kernel_headers

W "podziękowaniach" dostaję:

Kod:
  CC      kernel/bounds.s
cc1: error: code model kernel does not support PIC mode
Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[3]: *** [kernel/bounds.s] Error 1
Makefile:944: recipe for target 'prepare0' failed
make[2]: *** [prepare0] Error 2
make[2]: Opuszczenie katalogu '/usr/src/linux-3.16.1'
debian/ruleset/targets/common.mk:194: recipe for target 'debian/stamp/conf/kernel-conf' failed
make[1]: *** [debian/stamp/conf/kernel-conf] Error 2
make[1]: Opuszczenie katalogu '/usr/src/linux-3.16.1'
/usr/share/kernel-package/ruleset/minimal.mk:93: recipe for target 'debian/stamp/conf/minimal_debian' failed
make: *** [debian/stamp/conf/minimal_debian] Error 2

Szukałem rozwiązania na tym forum, ale nie znalazlem, szukałem na forach zagranicznych - trochę jest z takim subjectem w tytule, ale nie "pod tym kątem". Proszę o jakąś pomoc.

Znaczniki CODE mile widziane. /YB3
Odpowiedz
#2
0
Podążaj za błędem cc1: error: code model kernel does not support PIC mode, który jak się dowiesz jest związany z nowszą wersją kompilatora.
Obejścia są dwa: albo użyć starszego kompilatora gcc w wersji 5 lub do makefile dopisać odpowiednią flagę.
1. Instalacja starszej wersji gcc
Kod:
sudo apt install gcc-5
sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc

2.Dodanie flagi w pliku makefile
W pliku /usr/src/linux-headers-wersja_kernela/Makefile
odnajdź linijkę:
EXTRA_CFLAGS += $(CFLAGS_EXTRA)
i zmień na:
EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie
Odpowiedz
#3
0
Kod:
sudo apt install gcc-5
sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc

2.Dodanie flagi w pliku makefile
W pliku /usr/src/linux-headers-wersja_kernela/Makefile
odnajdź linijkę:
EXTRA_CFLAGS += $(CFLAGS_EXTRA)
i zmień na:
EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Do poszukiwań stringu EXTRA_CFLAGS zaprzęgnąłem najpierw MC, a jak nic nie znalazł to zleciłem to proggramow Krusader (podobny do windowsowego Total Commander ), ale on też nic nie znalazł w pliki Makefile. Zostaje pierwsza opcja, zrobię za kilka godzin bo muszę teraz wyjść.
Odpowiedz
#4
0
To ewentualnie flaga KBUILD_CFLAGS += -fno-pie
Zresztą pokaż co tam masz.
U mnie z kernela 3.16 mam tak:
Kod:
cat /usr/src/linux-headers-3.16.0-4-common/Makefile | grep _CFLAGS
KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
KBUILD_CFLAGS_KERNEL :=
KBUILD_CFLAGS_MODULE  := -DMODULE
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
KBUILD_CFLAGS    += $(call cc-option,-fno-delete-null-pointer-checks,)
KBUILD_CFLAGS    += -Os $(call cc-disable-warning,maybe-uninitialized,)
KBUILD_CFLAGS    += -O2
KBUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \
KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
KBUILD_CFLAGS += $(stackp-flag)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
KBUILD_CFLAGS    += -fno-omit-frame-pointer -fno-optimize-sibling-calls
KBUILD_CFLAGS    += -fomit-frame-pointer
KBUILD_CFLAGS   += $(call cc-option, -fno-var-tracking-assignments)
KBUILD_CFLAGS    += -g
KBUILD_CFLAGS     += $(call cc-option, -femit-struct-debug-baseonly) \
KBUILD_CFLAGS    += -pg $(CC_USING_FENTRY)
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
KBUILD_CFLAGS += $(call cc-disable-warning, pointer-sign)
KBUILD_CFLAGS    += $(call cc-option,-fno-strict-overflow)
KBUILD_CFLAGS   += $(call cc-option,-fconserve-stack)
KBUILD_CFLAGS   += $(call cc-option,-Werror=implicit-int)
KBUILD_CFLAGS   += $(call cc-option,-Werror=strict-prototypes)
KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)
    KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO
KBUILD_CFLAGS += $(KCFLAGS)
To bym się dopisał na koniec:
KBUILD_CFLAGS += $(KCFLAGS) -fno-pie
Odpowiedz
#5
0
OK - wykonałem to polecenie - oto wynik:

Kod:
cat /usr/src/linux-3.16.1/Makefile | grep  _CFLAGS
KBUILD_CFLAGS  := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
KBUILD_CFLAGS_KERNEL :=
KBUILD_CFLAGS_MODULE  := -DMODULE
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
KBUILD_CFLAGS += -O2
KBUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \
KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
KBUILD_CFLAGS += $(stackp-flag)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
KBUILD_CFLAGS += -fomit-frame-pointer
KBUILD_CFLAGS  += $(call cc-option, -fno-var-tracking-assignments)
KBUILD_CFLAGS += -g
KBUILD_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \
KBUILD_CFLAGS += -pg $(CC_USING_FENTRY)
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
KBUILD_CFLAGS += $(call cc-disable-warning, pointer-sign)
KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
KBUILD_CFLAGS  += $(call cc-option,-fconserve-stack)
KBUILD_CFLAGS  += $(call cc-option,-Werror=implicit-int)
KBUILD_CFLAGS  += $(call cc-option,-Werror=strict-prototypes)
KBUILD_CFLAGS  += $(call cc-option,-Werror=date-time)
KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO
KBUILD_CFLAGS += $(KCFLAGS)
Odpowiedz
#6
0
No masz praktycznie to samo co ja.
Dopisz się do ostatniej znalezionej linijki jak to już zaproponowałem.
Odpowiedz
#7
0
(29-04-2020, 18:15)dedito napisał(a): No masz praktycznie to samo co ja.
Dopisz się do ostatniej znalezionej linijki jak to już zaproponowałem.
Przerobiłem oba te warianty, ale żaden z nich nie "poszedł" dobrze. Po dopisaniu -fno-pie dostałem co poniżej:
Kod:
include/linux/compiler-gcc.h:106:1: fatal error: linux/compiler-gcc7.h: Nie ma takiego pliku ani katalogu
#include gcc_header(__GNUC__)
^~~~
compilation terminated.
Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[3]: *** [kernel/bounds.s] Error 1
Makefile:944: recipe for target 'prepare0' failed
make[2]: *** [prepare0] Error 2
make[2]: Opuszczenie katalogu '/usr/src/linux-3.16.1'
debian/ruleset/targets/common.mk:194: recipe for target 'debian/stamp/conf/kernel-conf' failed
make[1]: *** [debian/stamp/conf/kernel-conf] Error 2
make[1]: Opuszczenie katalogu '/usr/src/linux-3.16.1'
/usr/share/kernel-package/ruleset/minimal.mk:93: recipe for target 'debian/stamp/conf/minimal_debian' failed
make: *** [debian/stamp/conf/minimal_debian] Error 2
Failed to create a ./debian directory: No such file or directory at /usr/bin/make-kpkg line 970.
Przy drugiej opcji  - czyli instalacja gcc-5 i zmiana dowiązania symbolicznego i wycofanie zmian z pierwszej opcji dostałem to co poniżej:
Kod:
kernel/bounds.c:1:0: error: code model kernel does not support PIC mode
/*
^
Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[3]: *** [kernel/bounds.s] Error 1
Makefile:944: recipe for target 'prepare0' failed
make[2]: *** [prepare0] Error 2
make[2]: Opuszczenie katalogu '/usr/src/linux-3.16.1'
debian/ruleset/targets/common.mk:194: recipe for target 'debian/stamp/conf/kernel-conf' failed
make[1]: *** [debian/stamp/conf/kernel-conf] Error 2
make[1]: Opuszczenie katalogu '/usr/src/linux-3.16.1'
/usr/share/kernel-package/ruleset/minimal.mk:93: recipe for target 'debian/stamp/conf/minimal_debian' failed
make: *** [debian/stamp/conf/minimal_debian] Error 2
Failed to create a ./debian directory: No such file or directory at /usr/bin/make-kpkg line 970.
Odpowiedz
#8
0
Co do pierwszej opcji: z tego co doczytałem, te starsze kernele nie skompilują się na GCC-7, potrzeba starszego kompilatora, z tego co piszą to nawet GCC-5 jest zbyt wysoką wersją i trzeba użyć GCC serii 4..
W drugim przypadku wygląda, że może tu trzeba jeszcze dodatkowo ustawić te flagi z pierwszej opcji.
Mam jakiś bardzie szczegółowy poradnik do tych opcji https://lists.ubuntu.com/archives/kernel...77178.html
Cytat:1 file changed, 6 insertions(+)

diff --git a/Makefile b/Makefile
index dda982c..f96b174 100644
--- a/Makefile
+++ b/Makefile
@@ -608,6 +608,12 @@ endif # $(dot-config)
# Defaults to vmlinux, but the arch makefile usually adds further targets
all: vmlinux

+# force no-pie for distro compilers that enable pie by default
+KBUILD_CFLAGS += $(call cc-option, -fno-pie)
+KBUILD_CFLAGS += $(call cc-option, -no-pie)
+KBUILD_AFLAGS += $(call cc-option, -fno-pie)
+KBUILD_CPPFLAGS += $(call cc-option, -fno-pie)
+
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
# values of the respective KBUILD_* variables
ARCH_CPPFLAGS :=
--
2.8.1
Odpowiedz
#9
0
(30-04-2020, 13:40)dedito napisał(a): Co do pierwszej opcji: z tego co doczytałem, [..]
Zastanawia mnie fakt dlaczego dobrze skompilowany i dobrze pracujący kernel pod Mint 17.3 64bit o którym napisałem inicjując wątek - nie chce pracować pod nowym Linuxem 19.3 64 bit. Jeśli by znaleźć powód to pewno była by najkrótsza droga do osiągnięcia celu bo zainstalowanie  Mint 17.3  to jest moment - potem kompilacja - może z jakimiś opcjami, może też z parametrami w poleceniu kompilacji.
Odpowiedz
#10
0
A jakiś konkretny komunikat się pojawia poza tym initrams?
Odpowiedz


Skocz do:




Użytkownicy przeglądający ten wątek: 14 gości