我尝试在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?
非常感谢你的帮助!任何建议都非常感谢。
答案 0 :(得分:3)
我想我找到了一个解决方案。
我们不必安装旧版本的gcc。我们只需要将文件compiler-gcc5.h from here或from 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。