strings
- lists printable ASCII strings from files
strings
命令是用来打印出二进制文件中的ASCII字符集组成的字符串。
strings
命令默认只输出长度不小于4
的ASCII字符集组成的字符串。 长度小于4
的不予打印,我们可以通过-n
参数调整:
strings -n 2 filename
在使用某些由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.x
,x
是数字,3.4.x
是libstdc++
项目的版本号。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