gcc升级后更新libstdc++.so.6动态库

Talk is cheap, show me the code.

一、问题描述

在执行某些程序时,会报错,如下:

./test4: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./test4)

二、问题分析

难道是gcc版本过低,于是安装升级:

su root
yum install libstdc++.so.6

结果显示:

Package libstdc++-4.4.7-17.el6.i686 already installed and latest version

说明gcc已经是最新版本了,那么再确认下目前/usr/lib64目录下的libstdc++.so.6中包含动态库版本有哪些:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

结果显示:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

发现确实没有3.4.21版本,那么很可能就是gcc升级后没有更新/usr/lib64下的libstdc++.so.6动态库,那么找下最新的libstdc++.so.6在哪里:

find / -name libstdc++.so.6

发现有两个可疑目录:

/usr/local/lib64/libstdc++.so.6
/home/gcc-6.1.0/gcc-temp/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6

然后检查了一下/usr/local/lib64目录下的动态库:

strings /usr/local/lib64/libstdc++.so.6 | grep GLIBC

结果如下:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

发现这个里面正是最新版本的动态库,可见,在升级gcc时,gcc编译会在gcc-temp目录中生成libstdc++.so.6,升级完毕,默认只会在/usr/local/lib64目录下包含最新的libstdc++.so.6动态库,而不会更新/usr/lib64目录下的libstdc++.so.6。而执行程序时,程序会优先从/usr/lib64目录下去寻找libstdc++.so.6,由于老版本的gcc在/usr/lib64中有一个旧版本的动态库libstdc++.so.6,导致程序以为自己找到了正确的动态库,实际上找到的却不是最新的。

三、解决方案

用最新的libstdc++.so.6替换旧的/usr/lib64/libstdc++.so.6:

cd /usr/lib64
rm -rf libstdc++.so.6
cp /usr/local/lib64/libstdc++.so.6 ./

注意:

linux下strings命令表示从文件中读取至少4个连续可打印字符,读取一直到非可打印字符。对于一般的纯本文文件,strings会输出整个文本内容,但是对于二进制文件,strings的效果就很明显,只打印二进制文件中连续刻度的字符。上面就用到了strings来查找libstdc++.so.6二进制文件中支持的GLIBC版本

string libstdc++.so.6 | grep GLIBC

你可能感兴趣的:(centos,linux,gcc)