升级libstdc++、libgcc_s.so、libc.so.6

时间:2022-02-26 15:28:45

参考资料:
https://blog.csdn.net/ltl451011/article/details/7763892/

https://blog.csdn.net/na_beginning/article/details/53413997


一、为什么要升级?

有时候在链接外部动态库的时候,会出以下类似的问题:
./bin/mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./bin/mysqld)
./bin/mysqld: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./bin/mysqld)

出现这种问题就是因为“编译库的编译器” 和 “编译当前程序的编译器” 版本是不一样的,在具体一点就是因为,当前程序的编译器的版本是比较低的,只要升级一下就可以了。


二、查询库的版本
1、
可通过strings /lib64/libc.so.6 | grep GLIBC_ 查看系统 GLIBC 支持的版本
可通过strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX 查看系统 GLIBCXX 支持的版本

2、指令安装的,可以这种查询方式
rpm -qa | grep gdb
rpm -qa |grep glibc


3、指令安装的,可以这种卸载方式(以卸载gdb为例)
rpm -e --nodeps gdb-7.2-83.el6.x86_64


二、libgcc_s.so跟libstdc++.so的升级,通过升级GCC来实现

1、下载GCC5.4.0的源码进行编译
GCC完成升级之后,在系统库目录下,删除旧库的软链接,创建新的软链接,指向新版本的库。

2、检查系统库目录,配置新的libstdc++.so
根据编译gcc时的配置,在指向目录下,找到生成的库为libstdc++.so.6.0.21

在系统库目录下 /lib64/ 检查存不存在libstdc++.so.6.0.21
不存在 则复制libstdc++.so.6.0.21 到 /lib64/

检查存不存在libstdc++.so的软连接,将旧的软链接全部删除掉。
创建新的软链接,指向 /lib64/libstdc++.so.6.0.21

检查其他的系统库目录


3、检查系统库目录,配置新的libgcc_s.so
仿照上面libstdc++.so的操作

 

三、libc.so.6升级
参考
https://blog.51cto.com/12077732/2125618
https://blog.csdn.net/superyzh/article/details/79472190
https://www.cnblogs.com/Mrhuangrui/p/7766554.html
https://www.jianshu.com/p/513e01fbd3e0

glibc是gnu发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。
glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
很多linux的基本命令,比如cp, rm, ll,ln等,都得依赖于它,如果操作错误或者升级失败会导致系统命令不能使用,
严重的造成系统退出后无法重新进入,所以操作时候需要慎重。

1、下载glibc的源码进行编译
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
使用下面的镜像应该会快点
wget http://mirrors.ustc.edu.cn/gnu/libc/

2、检查系统库目录,配置新的libc.so
根据编译时的配置,在指向目录下,找到生成的库

检查系统库目录,删除旧库的软链接,创建新库的软链接。


问题:
1、https://blog.csdn.net/zhenyuhe/article/details/86737328
这种方式,相当于从网上下载了一个较新版本的libstdc++.so库,
替换了系统的旧库,这种方式没有进行验证。