在Ubuntu 16.04 LTS上编译旧的Linux内核

时间:2016-06-14 03:28:19

标签: linux ubuntu gcc linux-kernel

我尝试在Ubuntu 16.04 LTS上编译Linux内核3.10.31。 我曾经在Ubuntu 12.04 LTS上编译完全相同的内核,一切运行良好。

在Ubuntu 16.04上,gcc版本为gcc-5; 在Ubuntu 12.04上,gcc版本为gcc-4.6

3.18之前的Linux内核似乎无法使用gcc-5进行编译。内核3.10.31在make

编译时报告以下错误
 fatal error: linux/compiler-gcc5.h: No such file or directory

我尝试将gcc-4.7安装到Ubuntu 16.04上,并将/usr/bin/gcc更改为指向gcc-4.7。这可以解决上述错误。但是,在我运行make

之后,它会导致新问题
$linux/arch/x86/Makefile:98: stack protector enabled but no compiler support
make[1]: Nothing to be done for 'all'.
make[1]: Nothing to be done for 'relocs'.
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CC      kernel/bounds.s
gcc-4.7.real: error: unrecognized command line option ‘-no-pie’
linux/./Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[1]: *** [kernel/bounds.s] Error 1
Makefile:835: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2

我的问题是:

有没有一种巧妙的方法来使用旧的编译链来编译Ubuntu 16.04上的旧内核3.10.31?

非常感谢你的帮助!任何建议都非常感谢。

3 个答案:

答案 0 :(得分:3)

我想我找到了一个解决方案。

我们不必安装旧版本的gcc。我们只需要将文件compiler-gcc5.h from herefrom here复制到include / linux /中。它将解决编译问题。

答案 1 :(得分:0)

Ubuntu 16.04现在仍然支持gcc-4.7,因此您可以安装它,然后可以通过update-alternatives使用gcc的版本。

例如:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
sudo update-alternatives --config gcc # here you choose by hint

如果直接下载compiler-gcc5.h,则可能会遇到在Ubuntu 16.04.3 x64中编译arch/x86/kvm/svm.c error invalid character时遇到的类似问题3.3.8

答案 2 :(得分:0)

打开 Makefile,查找 CFLAGS_EXTRA 并向其添加以下选项 -fno-pie。 看,https://askubuntu.com/questions/851433/kernel-doesnt-support-pic-mode-for-compiling