Home

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.gzhttps://ftp.gnu.org/gnu/gcc/
mpfr-2.4.2https://gcc.gnu.org/pub/gcc/infrastructure/gcc 依赖
gmp-4.3.2https://gcc.gnu.org/pub/gcc/infrastructure/gcc 依赖
mpc-0.8.1https://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,流程就是常规的 configuremakemake install

需要注意的是,configure 时要加上参数,才能采集 sa 历史监控信息:

./configure --enable-install-cron
make
make install

总结

这次处理的关键不是单独安装某个工具,而是先解决老系统上的编译链问题。对于这类环境,比较稳妥的思路通常是:

  1. 先确认报错到底卡在源码本身,还是编译器版本
  2. 选择一个和系统年代更匹配的 GCC 版本
  3. 先把编译器升级好,再继续编译业务工具

这样做比直接在老系统上硬编新程序要稳得多。

Linux