内核不支持PIC模式进行编译?


14

我一直在尝试在Ubuntu 16.10上编译最新的Linux v4.8.9内核,在我设置默认.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

我还尝试在make命令后使用-no-pie选项进行编译,但它会呈现出一组新错误,并不断说“缺少目标”。我有gcc版本6.2.0。我还安装了gcc-5,因为我在一开始就认为这可能是因为gcc太新了,但gcc-5仍然存在相同的问题。邮件列表或另一个论坛中的某个人提到,通过直接从git克隆解决了问题,但这对我的情况也没有帮助。

我很好奇是否有人遇到了这个问题,如果可以,可能的解决方法是什么?

注意:如果这可能是问题的根源,我正在Mac上的Virtualbox中运行Ubuntu。

Answers:


13

问题出在您的gcc安装上,在gcc 6+版本中,默认情况下启用了PIE(位置无关可执行文件)。因此,为了进行编译,您需要将其禁用。甚至gcc 5都有问题。这是gcc的已知错误。错误链接

到目前为止,还没有gcc方面的官方补丁,因此解决方法是修补内核源代码的Makefile。

如果您熟悉修补源文件,请使用此链接中的代码创建修补文件,然后尝试进行编译。补丁文件

如果您在安装补丁程序时遇到困难,请告诉我。


我是一个完整的linux新手,如何在给定的网站上安装补丁?我假设我将某些部分复制并粘贴到文件中并运行命令?
约翰·隆

1
不幸的是,我没有足够的代表分数来进行投票,但我问了您刚才在超级用户上回答的问题,我想问一下您是否希望将此答案链接到超级用户问题并将其标记为已回答,或者您自己可以在超级用户身上回答。只是想确保在应得的信用额中给予信用!
约翰·隆

1
嗨Ninetainedo,请确保您正确复制了它,并且仅从“从”复制到了“ 2.8.1”。
乔伊

1
@Joy我也遇到了相同的错误:在608修补文件Makefile Hunk#1失败。1中的1失败:失败-保存拒绝到文件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

然后它再次开始编译。


这运作得很好
Stone Stone国王
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.