Kernel unterstützt keinen PIC-Modus zum Kompilieren?

14

Ich habe versucht, den neuesten Linux v4.8.9-Kernel unter Ubuntu 16.10 zu kompilieren, und dieser Fehler tritt immer wieder auf, nachdem ich die Standardkonfiguration .config erstellt, sie mit menuconfig geändert und make selbst ausgeführt habe. Ich habe auch make mrproper ausgeführt, sobald ich die Datei entkernt habe. Dies ist die Ausgabe direkt nach dem Ausführen von 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

Ich habe auch versucht, nach dem Befehl make mit der Option -no-pie zu kompilieren, aber es werden eine Reihe neuer Fehler angezeigt, die ständig darauf hinweisen, dass "Ziele fehlen". Ich habe gcc Version 6.2.0. Ich habe auch gcc-5 installiert, weil ich am Anfang angenommen habe, dass es daran liegen könnte, dass gcc zu neu war, aber das gleiche Problem in gcc-5 weiterhin besteht. Jemand in den Mailinglisten oder einem anderen Forum erwähnte, dass das Problem durch direktes Klonen von git behoben wurde, aber das half auch in meinem Szenario nicht.

Ich bin gespannt, ob jemand anderes auf dieses Problem gestoßen ist und wenn ja, welche mögliche Lösung könnte dies sein?

HINWEIS: Ich verwende Ubuntu in Virtualbox auf einem Mac, wenn dies eine mögliche Ursache für Probleme sein könnte.

John Long
quelle

Antworten:

13

Das Problem liegt bei Ihrer gcc-Installation. In gcc 6+ -Versionen ist PIE (positionsunabhängige ausführbare Dateien) standardmäßig aktiviert. Zum Kompilieren müssen Sie es also deaktivieren. Sogar gcc 5 hat das Problem. Dies ist ein bekannter Fehler für gcc. Bug Link .

Bisher gibt es keinen offiziellen Patch von der gcc-Seite, daher besteht die Problemumgehung darin, das Makefile der Kernelquelle zu patchen.

Wenn Sie mit dem Patchen der Quelldatei vertraut sind, verwenden Sie die Codes über diesen Link, um die Patch-Datei zu erstellen, und versuchen Sie dann, sie zu kompilieren. Patch-Datei

Lassen Sie mich wissen, wenn Sie Probleme bei der Installation des Patches haben.

Freude
quelle
Ich bin ein kompletter Linux-Neuling. Wie würde ich vorgehen, um den Patch auf der angegebenen Website zu installieren? Ich nehme an, ich kopiere und füge einen Teil in eine Datei ein und führe einen Befehl aus.
John Long
1
Leider habe ich nicht genügend Wiederholungspunkte, um Upvotes zu machen, aber ich habe dieselbe Frage gestellt, die Sie gerade auf Superuser beantwortet haben, und ich wollte fragen, ob Sie es vorziehen würden, diese Antwort mit der Superuser-Frage zu verknüpfen und sie als beantwortet zu markieren, oder Sie selbst könnte es auf Superuser beantworten. Ich möchte nur sicherstellen, dass Kredit gegeben wird, wo Kredit fällig ist!
John Long
1
Hallo Ninetainedo, bitte stellen Sie sicher, dass Sie es korrekt kopiert und nur von "Von" nach "2.8.1" kopiert haben.
Freude
1
@Joy Ich hatte den gleichen Fehler: Patching-Datei Makefile Hunk # 1 FAILED bei 608. 1 von 1 Hunk FAILED - Speichern von Ablehnungen in Datei Makefile.rej Patch endet unerwartet in der Mitte der Zeile
Rainman
1
Der Patch funktioniert nicht für 2.6.x-Versionen (ich habe es in 2.6.39 versucht). Erhalte dies in meiner Patch-Ablehnungsdatei - pastebin.com/Pmdv1MTT .
SatheeshJM
8

Öffnen Sie das Makefile, suchen Sie nach CFLAGS_EXTRA und fügen Sie die folgende Option hinzu -fno-pie

Ich hatte die Leitung:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Ich habe es geändert für:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Für das Erstellen von Kernel 4 steht über dem Flag : KBUILD_CFLAGS.

Und es fing wieder an zu kompilieren.

Natim
quelle
Dies funktioniert gut
King Stone