web-dev-qa-db-fra.com

Le noyau ne prend pas en charge le mode PIC pour la compilation?

J'ai essayé de compiler la dernière version du noyau Linux v4.8.9 sur Ubuntu 16.10 et cette erreur persiste après que j'ai créé le fichier .config par défaut, que je l'ai modifié avec menuconfig et exécuté make par lui-même. J'ai également exécuté make mrproper dès que j'ai décompressé le fichier. Voici le résultat juste après que je lance 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

J'ai également essayé de compiler avec l'option -no-pie après la commande make, mais elle génère un ensemble de nouvelles erreurs, indiquant constamment qu'il y a des "cibles manquantes". J'ai la version 6.2.0 de gcc. J'ai aussi installé gcc-5 parce que je pensais au début que c’était peut-être parce que gcc était trop récent mais que le même problème persiste dans gcc-5. Quelqu'un dans les listes de diffusion ou un autre forum a mentionné que le problème avait été résolu en clonant directement à partir de git, mais que cela ne m'a pas aidé non plus.

Je suis curieux de savoir si quelqu'un d'autre a rencontré ce problème et si oui, quelle solution pourrait être?

NOTE: J'utilise Ubuntu dans Virtualbox sur un Mac si cela pourrait être une source possible de problèmes.

11
John Long

Le problème est lié à votre installation de gcc. Dans les versions gcc supérieures à 6, PIE (exécutable indépendant de la position) est activé par défaut. Donc, pour compiler, vous devez le désactiver. Même gcc 5 a le problème. C'est un bug connu pour gcc. lien de bogue .

Jusqu'à présent, il n'y a pas de correctif officiel du côté de gcc. La solution consiste donc à corriger le fichier Makefile de la source du noyau.

Si vous êtes habitué à corriger le fichier source, utilisez les codes de ce lien pour créer le fichier de correctif, puis essayez de le compiler . Fichier de correctif

Faites-moi savoir si vous rencontrez des difficultés pour installer le correctif.

10
Joy

Ouvrez le Makefile, recherchez CFLAGS_EXTRA et ajoutez-lui l'option suivante -fno-pie

J'ai eu la ligne:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Je l'ai changé pour:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Pour la construction du noyau 4, l'indicateur ci-dessus est: KBUILD_CFLAGS.

Et la compilation a recommencé.

4
Natim