Il kernel non supporta la modalità PIC per la compilazione?


14

Ho provato a compilare l'ultimo kernel Linux v4.8.9 su Ubuntu 16.10 e questo errore continua a comparire dopo aver creato il .config predefinito, modificato con menuconfig ed eseguito da solo. Ho anche eseguito make mrproper non appena ho decompresso il file. Questo è l'output subito dopo aver eseguito 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

Ho anche provato a compilare con l'opzione -no-pie dopo il comando make ma rende una serie di nuovi errori, dicendo costantemente che ci sono "target mancanti". Ho la versione 6.2.0 di gcc. Ho anche installato gcc-5 perché ho ipotizzato che all'inizio potrebbe essere perché gcc era troppo nuovo ma lo stesso problema persiste in gcc-5. Qualcuno nelle mailing list o in un altro forum ha affermato che il problema è stato risolto clonando direttamente da Git ma che non ha aiutato neanche nel mio scenario.

Sono curioso di sapere se qualcun altro ha riscontrato questo problema e, in tal caso, quale possibile soluzione potrebbe essere?

NOTA: sto eseguendo Ubuntu in Virtualbox su un Mac se questa potrebbe essere una possibile fonte di problemi.

Risposte:


13

Il problema è con l'installazione di gcc, nelle versioni 6+ di gcc PIE (posiziona eseguibili indipendenti) è abilitato di default. Quindi per compilare devi disabilitarlo. Anche gcc 5 ha il problema. Questo è un bug noto per gcc. Bug Link .

Finora non esiste una patch ufficiale dal lato gcc, quindi la soluzione è quella di correggere il Makefile del sorgente del kernel.

Se si ha familiarità con l'applicazione di patch al file sorgente, utilizzare i codici da questo collegamento per creare il file patch, quindi provare a compilare. File patch

Fammi sapere se hai difficoltà a installare la patch.


Sono un noob completo di Linux, come potrei fare per installare la patch in un determinato sito Web? Presumo di copiare e incollare una parte in un file ed eseguire un comando?
John Long,

1
Sfortunatamente, non ho abbastanza punti rep per fare voti, ma ho posto la stessa domanda a cui hai appena risposto su Superuser e volevo chiederti se preferisci, collego questa risposta alla domanda di Superuser e la contrassegno come risposta o tu stesso potrebbe rispondere su superutente. Voglio solo assicurarti di dare credito dove è dovuto il credito!
John Long,

1
Ciao Ninetainedo, assicurati di averlo copiato correttamente e copiato solo da "Da" a "2.8.1".
Gioia

1
@Joy ho avuto lo stesso errore: patching file Makefile Hunk # 1 FAILED at 608. 1 hunk su 1 FAILED - il salvataggio degli scarti nel file Makefile.rej patch termina inaspettatamente nel mezzo della riga
rainman

1
la patch non funziona per le versioni 2.6.x (ho provato in 2.6.39) ottenendo questo nel mio file di rifiuto della patch - pastebin.com/Pmdv1MTT qualche idea?
SatheeshJM,

8

Apri il Makefile, cerca CFLAGS_EXTRA e aggiungi la seguente opzione -fno-pie

Ho avuto la linea:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

L'ho cambiato per:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Per la costruzione del kernel 4, sopra la bandiera è: KBUILD_CFLAGS.

E ha ricominciato a compilare.


Funziona bene
King Stone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.