Kernel không hỗ trợ chế độ PIC để biên dịch?


14

Tôi đã cố gắng biên dịch kernel Linux v4.8.9 mới nhất trên Ubuntu 16.10 và lỗi này vẫn xuất hiện sau khi tôi tạo .config mặc định, sửa đổi nó bằng menuconfig và tự chạy. Tôi cũng đã chạy make mrproper ngay khi tôi gỡ bỏ tệp. Đây là đầu ra ngay sau khi tôi chạy 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

Tôi cũng đã thử biên dịch với tùy chọn -no-pie sau lệnh make nhưng nó lại xuất hiện một tập hợp các lỗi mới, liên tục nói rằng có "các mục tiêu bị thiếu". Tôi có phiên bản gcc 6.2.0. Tôi cũng đã cài đặt gcc-5 vì tôi cho rằng ngay từ đầu có thể là do gcc còn quá mới nhưng vấn đề tương tự vẫn tồn tại ở gcc-5. Một người nào đó trong danh sách gửi thư hoặc diễn đàn khác đã đề cập rằng vấn đề đã được giải quyết bằng cách nhân bản trực tiếp từ git nhưng điều đó cũng không giúp ích gì trong kịch bản của tôi.

Tôi tò mò liệu có ai khác gặp phải vấn đề này không và nếu có thì cách khắc phục có thể là gì?

LƯU Ý: Tôi đang chạy Ubuntu trong Virtualbox trên máy Mac nếu đó có thể là một vấn đề có thể xảy ra.

Câu trả lời:


13

Vấn đề là với cài đặt gcc của bạn, trong phiên bản gcc 6+ PIE (vị trí thực thi độc lập vị trí) được bật theo mặc định. Vì vậy, để biên dịch bạn cần phải vô hiệu hóa nó. Ngay cả gcc 5 cũng có vấn đề. Đây là một lỗi được biết đến cho gcc. Liên kết lỗi .

Cho đến nay không có bản vá chính thức từ phía gcc, vì vậy cách giải quyết là vá Makefile của nguồn kernel.

Nếu bạn quen với việc vá tệp nguồn, hãy sử dụng mã từ liên kết này để tạo tệp vá sau đó thử biên dịch. Patch File

Hãy cho tôi biết nếu bạn gặp khó khăn khi cài đặt bản vá.


Tôi là một linux noob hoàn chỉnh, làm cách nào để cài đặt bản vá trong trang web cụ thể? Tôi giả sử tôi sao chép và dán một số phần vào một tập tin và chạy một lệnh?
John Long

1
Thật không may, tôi không có đủ điểm rep để thực hiện upvote nhưng tôi đã hỏi cùng một câu hỏi mà bạn vừa trả lời trên Superuser và tôi muốn hỏi liệu bạn có thích tôi liên kết câu trả lời này với câu hỏi Superuser không và đánh dấu nó là câu trả lời hoặc chính bạn có thể trả lời nó trên superuser. Chỉ muốn đảm bảo cung cấp tín dụng khi tín dụng đến hạn!
John Long

1
Xin chào Ninetainedo, vui lòng đảm bảo rằng bạn đã sao chép chính xác và chỉ sao chép từ "Từ" sang "2.8.1".
Niềm vui

1
@Joy Tôi cũng gặp lỗi tương tự: vá tệp Makefile Hunk # 1 FAILED ở 608. 1 trên 1 hunk FAILED - lưu từ chối vào tệp Makefile.rej bất ngờ kết thúc ở giữa dòng
rainman

1
Bản vá không hoạt động cho các phiên bản 2.6.x (tôi đã thử trong 2.6,39) nhận được điều này trong tệp từ chối bản vá của tôi - pastebin.com/Pmdv1MTT có ý tưởng nào không?
SediteshJM

8

Mở Makefile, tìm CFLAGS_EXTRA và thêm tùy chọn sau vào nó -fno-pie

Tôi đã có dòng:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Tôi đã thay đổi nó thành:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Để xây dựng kernel 4, cờ trên là : KBUILD_CFLAGS.

Và nó bắt đầu biên dịch lại.


Điều này đang hoạt động tốt
King Stone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.