strings命令
1.0、参考
1.1、strings命令的作用

strings - lists printable ASCII strings from files

strings命令是用来打印出二进制文件中的ASCII字符集组成的字符串。

strings命令默认只输出长度不小于4ASCII字符集组成的字符串。 长度小于4的不予打印,我们可以通过-n参数调整:

strings -n 2 filename
1.2、使用案例

在使用某些由C++编写的应用的时候, 会出现如下的提示:

libstdc++.so.6: version `GLIBCXX_3.4.21' not found

这意思是:当前应用程序加载了libstdc++.so.6这个动态库, 但是该应用程序要求libstdc++.so.6支持的libstdc++的版本不能低于3.4.21, 因为libstdc++的版本是向前兼容的。

那这个问题就转化为:看看这个libstdc++.so.6是否支持3.4.21

不过,问题又来了,libstdc++.so.6在文件系统的哪个位置呢? 这个问题好像很好解决,我们使用find命令查找一下:

sudo find / -name "libstdc.so.6"

你会发现,这个文件在很多地方都有。那应用程序是如何知道,该加载哪个libstdc++.so.6呢? 也就是说,应用程序是如何加载.so的。弄清楚这个就好办了。

glibc中提供了一个工具——ldconfig, 该工具能打印出所有缓存的.so文件的路径,应用程序就是按照这个缓存的路径加载.so文件的, 即便有很多同名的libstdc++.so.6,排在最前面的被加载。

定位到该应用程序加载的是哪个libstdc++.so.6之后,我们就看看该.so中是否有GLIBCXX_3.4.21字符串:

strings /usr/lib/libstdc.so.6 | grep "GLIBCXX_3.4.21"

libstdc++的作者为了让当前的libstdc++.so.6使用者知道它兼容哪些版本, 就在libstdc++.so.6中定义了一些字符串常量,这些字符串常量的格式就是GLIBCXX_3.4.xx是数字,3.4.xlibstdc++项目的版本号。libstdc++.so.6实际上是libstdc++.so.6.0.y的软连接, 也就是说,libstdc++.so.6也是有版本的,至于为啥不等同于libstdc++项目的版本号,这个没有去深究,反正就是这两个有个对应关系。 如果libstdc++.so.6里有GLIBCXX_3.4.x字符串, 就表示这个libstdc++.so.6支持3.4.x版本。参考

运行的结果,当然是没找到啦。也就是验证了当前的这个/usr/lib/libstdc.so.6不支持libstdc++ 3.4.21版本。

libstdc++是被包含在GCC中的,它并不是一个独立的存在。

GCC版本与libstdc++.so.6版本的对应关系、GCC版本与GLIBCXX_3.4.x的对应关系

GCC的编译是非常消耗时间的,我们不可能去自己编译一下对应版本。所以只能去网上找现成的编译好的libstdc++.so.6.0.y文件,下载到自己的系统中,将libstdc++.so.6重新指向这个新的版本:

sudo ln -s ~/libstdc++.so.6.0.24 /usr/lib/libstdc.so.6