Kernel tidak mendukung mode PIC untuk kompilasi?

14

Saya sudah mencoba mengkompilasi kernel Linux v4.8.9 terbaru di Ubuntu 16.10 dan kesalahan ini terus muncul setelah saya membuat default .config, memodifikasinya dengan menuconfig dan menjalankannya dengan sendirinya. Saya juga menjalankan make mrproper segera setelah saya membatalkan pengarsipan file. Ini adalah output tepat setelah saya menjalankan 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

Saya juga telah mencoba mengkompilasi dengan opsi -no-pie setelah perintah make tetapi membuat serangkaian kesalahan baru, terus-menerus mengatakan bahwa ada "target yang hilang". Saya punya gcc versi 6.2.0. Saya juga sudah menginstal gcc-5 karena saya berasumsi pada awalnya mungkin karena gcc terlalu baru tetapi masalah yang sama masih ada di gcc-5. Seseorang di milis atau forum lain menyebutkan bahwa masalah diselesaikan dengan langsung mengkloning dari git tetapi itu tidak membantu dalam skenario saya juga.

Saya ingin tahu apakah ada orang lain yang mengalami masalah ini dan jika demikian, perbaikan apa yang mungkin dilakukan?

CATATAN: Saya menjalankan Ubuntu di Virtualbox pada Mac jika itu mungkin menjadi sumber masalah.

John Long
sumber

Jawaban:

13

Masalahnya adalah dengan instalasi gcc Anda, dalam versi GCC 6+ PIE (executable posisi independen) diaktifkan secara default. Jadi untuk mengkompilasi Anda harus menonaktifkannya. Bahkan gcc 5 memiliki masalah. Ini adalah bug yang dikenal untuk gcc. Tautan Bug .

Sejauh ini tidak ada tambalan resmi dari sisi gcc, jadi solusinya adalah menambal Makefile dari sumber kernel.

Jika Anda terbiasa menambal file sumber gunakan kode dari tautan ini untuk membuat file patch kemudian coba kompilasi. Patch File

Beri tahu saya jika Anda kesulitan menginstal tambalan.

Kegembiraan
sumber
Saya noob linux yang lengkap, bagaimana cara menginstal tambalan di situs web yang diberikan? Saya menganggap saya menyalin dan menempelkan sebagian ke dalam file dan menjalankan perintah?
John Long
1
Sayangnya, saya tidak memiliki cukup poin rep untuk melakukan upvote tapi saya mengajukan pertanyaan yang sama yang baru saja Anda jawab pada Superuser dan saya ingin bertanya apakah Anda lebih suka saya menautkan jawaban ini ke pertanyaan Superuser dan menandainya sebagai jawaban atau Anda sendiri bisa menjawabnya di superuser. Hanya ingin memastikan untuk memberikan kredit di mana kredit jatuh tempo!
John Long
1
Hai Ninetainedo, pastikan Anda menyalinnya dengan benar dan hanya menyalin dari "Dari" ke "2.8.1".
Sukacita
1
@Joy Saya memiliki kesalahan yang sama: menambal file Makefile Hunk # 1 GAGAL di 608. 1 dari 1 hunk GAGAL - menyimpan menolak untuk mengajukan Makefile.rej patch tiba-tiba berakhir di tengah baris
Rainman
1
tambalan tidak bekerja untuk versi 2.6.x (saya mencoba 2.6.39) mendapatkan ini di file tambalan tambalan saya - pastebin.com/Pmdv1MTT ada ide?
SatheeshJM
8

Buka Makefile, cari CFLAGS_EXTRA dan tambahkan opsi berikut ini -fno-pie

Saya memiliki garis:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Saya mengubahnya untuk:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Untuk membangun kernel 4, bendera di atas adalah: KBUILD_CFLAGS.

Dan itu mulai mengkompilasi lagi.

Natim
sumber
Ini bekerja dengan baik
King Stone