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