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

我一直在尝试在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。

问题在于你的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

它又开始编译了。