Ядро не поддерживает режим PIC для компиляции?


14

Я пытался скомпилировать последнее ядро ​​Linux v4.8.9 на Ubuntu 16.10, и эта ошибка продолжает появляться после того, как я сделал .config по умолчанию, изменил его с помощью menuconfig и запустил make самостоятельно. Я также запустил make mrproper, как только разархивировал файл. Это вывод сразу после запуска 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

Я также попытался скомпилировать с параметром -no-pie после команды make, но он отображает множество новых ошибок, постоянно сообщая, что существуют «отсутствующие цели». У меня есть версия gcc 6.2.0. У меня также установлен gcc-5, потому что я предположил, что в начале это может быть потому, что gcc был слишком новым, но та же проблема сохраняется в gcc-5. Кто-то из списков рассылки или другого форума упомянул, что проблема была решена путем прямого клонирования из git, но это также не помогло в моем сценарии.

Мне любопытно, сталкивался ли кто-нибудь еще с этой проблемой, и если так, то какое возможное решение могло бы быть?

ПРИМЕЧАНИЕ: я запускаю Ubuntu в Virtualbox на Mac, если это может быть источником проблем.

Ответы:


13

Проблема связана с вашей установкой gcc, в версиях gcc 6+ PIE (позиционно-независимые исполняемые файлы) включен по умолчанию. Поэтому для того, чтобы скомпилировать, вам нужно отключить его. Даже у gcc 5 есть проблема. Это известная ошибка для gcc. Ошибка ссылка .

До сих пор не существует официального патча со стороны gcc, поэтому обходной путь должен патчить Makefile исходного кода ядра.

Если вы знакомы с исправлением исходного файла, используйте коды из этой ссылки для создания файла исправления, а затем попробуйте скомпилировать. Патч файл

Дайте мне знать, если у вас возникли проблемы с установкой патча.


Я полный Linux Noob, как бы я установить патч на данном сайте? Я предполагаю, что я копирую и вставляю некоторую часть в файл и запускаю команду?
Джон Лонг

1
К сожалению, у меня недостаточно точек повторения для голосования, но я задал тот же вопрос, на который вы только что ответили на Superuser, и я хотел бы спросить, не хотите ли вы, чтобы я связал этот ответ с вопросом Superuser и пометил его как ответивший или вы сами мог бы ответить на это на суперпользователя. Просто хочу удостовериться, чтобы дать кредит, где кредит должен!
Джон Лонг

1
Привет, Ninetainedo, пожалуйста, убедитесь, что вы скопировали его правильно и копировали только с «От» на «2.8.1».
Радость

1
@Joy У меня была та же ошибка: исправление файла Makefile Hunk # 1 FAILED на 608. 1 из 1 ломоть FAILED - сохранение отклоняет в файл Makefile.rej патч неожиданно заканчивается в середине строки
rainman

1
патч не работает для версий 2.6.x (я пытался в 2.6.39) получить это в моем файле отклонения патча - pastebin.com/Pmdv1MTT есть идеи?
SatheeshJM

8

Откройте Makefile, найдите CFLAGS_EXTRA и добавьте в него следующую опцию -fno-pie

У меня была строка:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Я изменил это для:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Для построения ядра 4, выше флаг: KBUILD_CFLAGS.

И он снова начал компилироваться.


Это работает хорошо
King Stone
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.