赞
踩
本文首发于我的个人网站: https://hewanyue.com/
本文作者: Hechao
本文链接: https://hewanyue.com/blog/133d68.html
之前在CentOS7 上源码编译安装过新内核,不过有次在6上编译就遇到问题了,提示错误如下
make[2]: *** [scripts/sign-file] Error 1 make[1]: *** [scripts] Error 2 make
搞了好久,好像是参数设置不正确。
error: #error Sorry, your compiler is too old - please upgrade it
好像是说gcc版本过低。
去epel源找了一下,已经是最新版了啊~
查看了下之前CentOS7的gcc版本,是gcc-4.8.5,再去一查这个CentOS6的gcc版本,是gcc-4.4.7,可能就差在这几个小版本上了。
于是升级gcc版本就成了当务之急。
那就源码编译安装个新版的gcc吧。(后来朋友说可以直接把CentOS7上gcc的rpm包直接拿来用的,未尝试)
gcc有三个依赖包gmp、mpfr、mpc,要首先编译安装(虽然原本就有,不过如果编译高版本gcc,这三个依赖包不装新版本的话也会报错)
先去下载好三个依赖包源码包及gcc源码包
mkdir /data/gcc #创建目录/data/gcc
cd /data/gcc
wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz #下载gmp6.1.2
wget http://www.mpfr.org/mpfr-current/mpfr-3.1.5.tar.gz #下载mpfr3.1.5
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz #下载mpc1.0.3
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.gz #下载gcc6.3.0
再挨个编译安装三个依赖包(注意这三个依赖包也有依赖关系,需先安装gmp,再安装mpfr,之后再装mpc)
先来第一个,编译安装装gmp
tar -xJf gmp-6.1.2.tar.xz gmp-6.1.2
cd gmp-6.1.2
./configure --prefix=/usr/local/gcc/gmp --build=x86_64-linux
make && make install
这当时有报错
error: could not find a working compiler
当时没有加参数 --build=x86_64-linux,加上之后成功解决,参考: 原文地址. http://www.voidcn.com/article/p-zsgyngma-ug.html
之后编译安装mpfr
tar -xJf mpfr-3.1.5.tar.xz mpfr-3.1.5
cd mpfr-3.1.5
./configure --prefix=/usr/local/gcc/mpfr --with-gmp=/usr/local/gcc/gmp
make && make install
然后编译安装mpc
tar -xzf mpc-1.0.3.tar.gz mpc-1.0.3
cd mpc-1.0.3
./configure --prefix=/usr/local/gcc/mpc --with-gmp=/usr/local/gcc/gmp -with-mpfr=/usr/local/gcc/mpfr
make && make install
之后也没有报错,那就开始编译安装gcc。
tar xvf gcc-6.3.0.tar.gz
cd gcc-6.3.0
./configure --prefix=/usr/local/gcc --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gcc/gmp --with-mpfr=/usr/local/gcc/mpfr --with-mpc=/usr/local/gcc/mpc
make && make install
gcc中途有几次报错,不过也都解决了。
错误提示[1]:
make: *** [sub-make] Error 2
显示这个问题编译不过去。这是因为找不到gmp依赖包导致的,可是我明明装了依赖包的,看来是路径设置有问题,因为当时我是把这三个依赖包都装在gcc下,不过在编译gcc的时候忘记改依赖包的地址了。
错误提示[2]:
configure: error: cannot compute suffix of object files: cannot compile
解决办法是:
在/etc/profile里面加上以下内容:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc/mpc-0.9/lib:/usr/local/gcc/gmp-5.0.1/lib:/usr/local/gcc/mpfr-3.1.0/lib
然后重新加载配置文件/etc/profile
source /etc/profile
/usr/local/lib #这个是默认系统的变量
/usr/local/gmp/lib
/usr/local/mpfr/lib
/usr/local/mpc/lib
/usr/local/mysql/lib
/usr/local/openssl/lib #openssl变量
添加保存后记得更新动态库的缓存:
ldconfig -v
mv /usr/bin/gcc /usr/bin/gcc-bak
mv /usr/bin/g++ /usr/bin/g++-bak
mv /usr/bin/c++ /usr/bin/c++-bak
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
ln -s /usr/local/gcc/bin/c++ /usr/bin/c++
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
ln -s /usr/local/gcc/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
高高兴兴cd linux-5.2.9
,进入解压好的内核目录,做好.config配置文件,准备用make menuconfig
对内核进行自定义配置的时候,报错了:
error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
这又是怎么回事。好像是gcc出问题了。返回去检查。
原来添加完库忘了更新动态库
ldconfig -v
~
结果还报错:
scripts/kconfig/mconf Kconfig
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[2]: *** [menuconfig] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [sub-make] Error 2
这是因为我的XSELL窗口太小了,把XSHELL放大最大化,果然就打开了熟悉的蓝色界面~
修改一些个性化的设置(例如改名、加NFS文件系统),就可以保存了。
因为编译内核时间比较长,为防止发生断网或者断电等意外,我们创建一个SCREEN来编译。
screen -S linuxkernel
yes | make -j 16
用一个yes命令省去一直手动y了,等待他编译完成就好了。
在这又遇到一个报错,贴出来和大家分享下:
You are building kernel with non-retpoline compiler.
去查了下,网上都说是因为gcc版本过低,或内核版本过高。可我这明显不是gcc版本低的问题(都那么高了),问题是内核版本应该也不是问题,毕竟之前CentOS7编译就没这么多事。正犯愁不知道怎么解决的时候,发现了一篇文章查看原文,发现这个报错可以通过修改参数直接不启用RETPOLINE从而跳过(具体后果未知),于是修改配置文件重新来过:
make clean
sed -ri 's@(CONFIG_RETPOLINE=).*@\1n@' .config
make -j 16
果然就顺利编译成功了。
然后安装模块:
make modules_ install
安装模块的时候,有报错:
ERROR: modinfo: could not find module *
不过查了相关文章查看原文,好像这些模块也都可以正常使用,于是乎无视之~
最后,安装内核相关文件。
make install
至此,新内核就装完啦~重启切换去去体验一下!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。