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

Я пытался скомпилировать последнее ядро ​​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, если это может быть источником проблем.

2 ответа

Решение

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

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

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

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

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

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

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

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

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Для сборки ядра 4 флаг выше: KBUILD_CFLAGS,

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

Другие вопросы по тегам