SUSE 11 SP3 编译更新 GCC 并安装 sysstat

这篇文章记录在 SUSE 11 SP3 上为了编译安装 sysstat,先手动升级 GCC 的处理过程。核心原因不是系统不能装 sysstat,而是系统自带的 gcc 4.0.3 版本太老,已经无法满足新版本源码的编译要求。
报错如下:
gcc -std=gnu99 -o sadc.o -c -g -O2 -Wall -Wstrict-prototypes -pipe -O2 -fno-tree-slp-vectorize -DSA_DIR="/var/log/sa" -DSADC_PATH="/usr/local/lib64/sa/sadc" -DHAVE_SYS_SYSMACROS_H -DHAVE_LINUX_SCHED_H -DHAVE_SYS_PARAM_H sadc.c
cc1: error: unrecognized command line option "-fno-tree-slp-vectorize"所以这里的顺序是先源码编译更新 GCC,再继续编译安装 sysstat。
本次打算从 gcc 4.0.3 升级到 gcc 5.5.0。
尝试过直接升级到 gcc 10.1.0,但会遇到更多依赖和兼容问题,所以这里先选择相对稳妥的 gcc 5.5.0。

准备安装介质
| 文件名 | 地址 | 备注 |
|---|---|---|
| :---: | :---: | :---: |
| gcc-5.5.0.tar.gz | https://ftp.gnu.org/gnu/gcc/ | |
| mpfr-2.4.2 | https://gcc.gnu.org/pub/gcc/infrastructure/ | gcc 依赖 |
| gmp-4.3.2 | https://gcc.gnu.org/pub/gcc/infrastructure/ | gcc 依赖 |
| mpc-0.8.1 | https://gcc.gnu.org/pub/gcc/infrastructure/ | gcc 依赖 |
新建一个目录统一存放安装介质:
mkdir /gccupdate && cd /gccupdate
解压 GCC 源码
tar -zvxf gcc-5.5.0.tar.gz -C /usr/local/ && ls -la /usr/local/
当前版本 GCC 依赖哪些基础包,可以先通过下面的脚本查看:
vim /usr/local/gcc-5.5.0/contrib/download_prerequisites
解压依赖并创建软链接
把下载的三个依赖都解压到 GCC 源码目录 /usr/local/gcc-5.5.0:
gmp-4.3.2.tar.bz2
tar -jxvf gmp-4.3.2.tar.bz2 -C /usr/local/gcc-5.5.0
---------------
mpc-0.8.1.tar.gz
tar -zxvf mpc-0.8.1.tar.gz -C /usr/local/gcc-5.5.0
---------------
mpfr-2.4.2.tar.bz2
tar -jxvf mpfr-2.4.2.tar.bz2 -C /usr/local/gcc-5.5.0进入 /usr/local/gcc-5.5.0 后执行以下命令:
ln -sf gmp-4.3.2 gmp
ln -sf mpc-0.8.1 mpc
ln -sf mpfr-2.4.2 mpfr检查创建是否成功
ls -l | grep ^l
编译并安装 GCC
建议单独创建 build 目录做 out-of-tree 编译,不要直接在源码目录里堆构建文件:
mkdir build && cd build
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib然后在 build 目录下执行编译安装命令。make -jX 里的 X 需要根据 CPU 核心数和机器性能调整:
make -j4 && make install
如果中间没有明显报错,这一步就算完成了。
切换到新版本 GCC
原来的 gcc 命令位于 /usr/bin 下面。为了不直接覆盖旧版本,先把原有命令备份:
mv /usr/bin/gcc /usr/bin/gcc403
mv /usr/bin/g++ /usr/bin/g++403
mv /usr/bin/c++ /usr/bin/c++403
mv /usr/bin/cc /usr/bin/cc403
mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak新版本 gcc 安装在 /usr/local/bin,再为它创建新的软链接:
ln -s /usr/local/bin/gcc /usr/bin/gcc
ln -s /usr/local/bin/g++ /usr/bin/g++
ln -s /usr/local/bin/c++ /usr/bin/c++
ln -s /usr/local/bin/gcc /usr/bin/cc
ln -s /usr/local/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6最后执行 gcc -v 确认当前生效版本:
gcc -v
编译安装 sysstat
GCC 就绪后,再回头编译 sysstat,流程就是常规的 configure、make、make install。
需要注意的是,configure 时要加上参数,才能采集 sa 历史监控信息:
./configure --enable-install-cron
make
make install总结
这次处理的关键不是单独安装某个工具,而是先解决老系统上的编译链问题。对于这类环境,比较稳妥的思路通常是:
- 先确认报错到底卡在源码本身,还是编译器版本
- 选择一个和系统年代更匹配的
GCC版本 - 先把编译器升级好,再继续编译业务工具
这样做比直接在老系统上硬编新程序要稳得多。