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

14

J'ai essayé de compiler le dernier noyau Linux v4.8.9 sur Ubuntu 16.10 et cette erreur continue d'apparaître après avoir créé le fichier .config par défaut, 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. Ceci est la sortie juste après avoir exécuté 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 cela rend un ensemble de nouvelles erreurs, disant constamment qu'il y a des "cibles manquantes". J'ai la version 6.2.0 de gcc. J'ai également installé gcc-5 parce que j'ai supposé au début que c'était peut-être parce que gcc était trop nouveau mais 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 a été résolu en clonant directement depuis git mais cela n'a pas aidé dans mon scénario non plus.

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

REMARQUE: j'exécute Ubuntu dans Virtualbox sur un Mac si cela peut être une source possible de problèmes.

John Long
la source

Réponses:

13

Le problème vient de votre installation de gcc, dans les versions de gcc 6+, PIE (position indépendante des exécutables) est activé par défaut. Donc, pour compiler, vous devez le désactiver. Même gcc 5 a le problème. Il s'agit d'un bogue connu de gcc. Lien de bogue .

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

Si vous êtes familier avec l'application de correctifs au fichier source, utilisez les codes de ce lien pour créer le fichier correctif, puis essayez de compiler. Fichier de patch

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

Joie
la source
Je suis un noob linux complet, comment pourrais-je installer le correctif sur le site Web donné? Je suppose que je copie et colle une partie dans un fichier et exécute une commande?
John Long
1
Malheureusement, je n'ai pas assez de points de représentant pour faire des votes positifs, mais j'ai posé la même question à laquelle vous venez de répondre sur Superuser et je voulais vous demander si vous préférez que je lie cette réponse à la question Superuser et que je la marque comme répondue ou vous-même pourrait y répondre sur superutilisateur. Je veux juste m'assurer de donner du crédit là où il est dû!
John Long
1
Salut Ninetainedo, assurez-vous de l'avoir copié correctement et copié uniquement de "De" à "2.8.1".
Joy
1
@Joy J'ai eu la même erreur: correction du fichier Makefile Hunk # 1 FAILED à 608. 1 sur 1 hunk FAILED - l'enregistrement des rejets dans le fichier Makefile.rej se termine de manière inattendue au milieu de la ligne
rainman
1
le correctif ne fonctionne pas pour les versions 2.6.x (j'ai essayé en 2.6.39) obtenir ceci dans mon fichier de rejet de correctif - pastebin.com/Pmdv1MTT des idées?
SatheeshJM
8

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

J'avais la ligne:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Je l'ai changé pour:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Pour la construction du noyau 4, drapeau ci - dessus est: KBUILD_CFLAGS.

Et il a recommencé à compiler.

Natim
la source
Cela fonctionne bien
King Stone