Jądro nie obsługuje trybu PIC do kompilacji?

14

Próbowałem skompilować najnowsze jądro Linux v4.8.9 na Ubuntu 16.10 i ten błąd pojawia się po utworzeniu domyślnego pliku .config, zmodyfikowaniu go za pomocą menuconfig i uruchomieniu go. Uruchomiłem make mrproper, jak tylko rozpakowałem plik. Oto wynik zaraz po uruchomieniu make:

scripts/kconfig/conf  --silentoldconfig Kconfig
  SYSTBL  arch/x86/entry/syscalls/../../include/generated/asm/syscalls_32.h
  SYSHDR  arch/x86/entry/syscalls/../../include/generated/asm/unistd_32_ia32.h
  SYSHDR  arch/x86/entry/syscalls/../../include/generated/asm/unistd_64_x32.h
  SYSTBL  arch/x86/entry/syscalls/../../include/generated/asm/syscalls_64.h
  SYSHDR  arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_32.h
  SYSHDR  arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_64.h
  SYSHDR  arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_x32.h
  HOSTCC  arch/x86/tools/relocs_32.o
  HOSTCC  arch/x86/tools/relocs_64.o
  HOSTCC  arch/x86/tools/relocs_common.o
  HOSTLD  arch/x86/tools/relocs
  CHK     include/config/kernel.release
  UPD     include/config/kernel.release
  WRAP    arch/x86/include/generated/asm/clkdev.h
  WRAP    arch/x86/include/generated/asm/cputime.h
  WRAP    arch/x86/include/generated/asm/dma-contiguous.h
  WRAP    arch/x86/include/generated/asm/early_ioremap.h
  WRAP    arch/x86/include/generated/asm/mcs_spinlock.h
  WRAP    arch/x86/include/generated/asm/mm-arch-hooks.h
  CHK     include/generated/uapi/linux/version.h
  UPD     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  UPD     include/generated/utsrelease.h
  CC      kernel/bounds.s
kernel/bounds.c:1:0: error: code model kernel does not support PIC mode
 /*

Kbuild:45: recipe for target 'kernel/bounds.s' failed
make[1]: *** [kernel/bounds.s] Error 1
Makefile:1015: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2

Próbowałem też kompilować z opcją -no-pie po komendzie make, ale wyświetla ona zestaw nowych błędów, ciągle mówiąc, że „brakuje celów”. Mam wersję gcc 6.2.0. Mam również zainstalowany gcc-5, ponieważ zakładałem, że na początku mogło być tak, ponieważ gcc był zbyt nowy, ale ten sam problem występuje w gcc-5. Ktoś z list dyskusyjnych lub innego forum wspomniał, że problem został rozwiązany przez bezpośrednie klonowanie z git, ale to również nie pomogło w moim scenariuszu.

Jestem ciekawy, czy ktoś jeszcze napotkał ten problem, a jeśli tak, to jaka może być możliwa poprawka?

UWAGA: Używam Ubuntu w Virtualbox na komputerze Mac, jeśli może to być możliwe źródło problemów.

John Long
źródło

Odpowiedzi:

14

Problem dotyczy instalacji gcc, w wersjach gcc 6+ PIE (pliki wykonywalne niezależne od pozycji) jest domyślnie włączony. Aby więc skompilować, musisz go wyłączyć. Problem ma nawet gcc 5. Jest to znany błąd gcc. Link do błędu .

Do tej pory nie ma oficjalnej łaty ze strony gcc, więc obejście polega na załataniu Makefile źródła jądra.

Jeśli jesteś zaznajomiony z łataniem pliku źródłowego, użyj kodów z tego linku, aby utworzyć plik łatki, a następnie spróbuj skompilować. Plik łatki

Daj mi znać, jeśli masz problemy z instalacją poprawki.

Radość
źródło
Jestem kompletnym Linuksem Noob, jak bym poszedł na temat instalowania łatki na danej stronie? Zakładam, że skopiuję i wkleję jakąś część do pliku i uruchomię polecenie?
John Long
1
Niestety, nie mam wystarczającej liczby punktów do powtórzenia, ale zadałem to samo pytanie, na które właśnie odpowiedziałeś w Superuser i chciałem zapytać, czy wolisz połączyć tę odpowiedź z pytaniem Superuser i oznaczyć ją jako odpowiedź mógł odpowiedzieć na superużytkownika. Po prostu chcę się upewnić, że kredyt jest należny!
John Long,
1
Cześć Ninetainedo, upewnij się, że skopiowałeś go poprawnie i skopiowałeś tylko z „Od” do „2.8.1”.
Radość
1
@Joy Miałem ten sam błąd: łatanie pliku Makefile Hunk # 1 FAILED na 608. 1 z 1 przystawki FAILED - zapisywanie odrzutów do pliku Makefile.rej niespodziewanie kończy się na środku linii
Rainman
1
łatka nie działa dla wersji 2.6.x (próbowałem w 2.6.39) otrzymując to w moim pliku odrzucania łatek - pastebin.com/Pmdv1MTT jakieś pomysły?
SatheeshJM
8

Otwórz plik Makefile, poszukaj CFLAGS_EXTRA i dodaj do niego następującą opcję -fno-pie

Miałem linię:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Zmieniłem to dla:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Dla jądra 4 Budynek przede flaga jest: KBUILD_CFLAGS.

I zaczęło się ponownie kompilować.

Natim
źródło
To działa dobrze
King Stone