【采坑篇】REHL6.5升级glic,支持C++11特性

场景需求

默认的Redhat 6.5 的glibc版本最高为2.12, 而在实际应用中引入了一个C++11编写的服务,项目运行所依赖的包往往需要更高版本的glibc库支持, 因此在不升级系统的前提下, 需要手动更新系统glibc库. 一般遇到错误libc.so.6: version GLIBC_2.14 not found时,表示需要对glibc进行升级了.

错误信息

执行程序报错:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
/lib64/libc.so.6: version `GLIBC2.14' not found
/lib64/libc.so.6: version `GLIBC2.17' not found

查看系统版本

[root@bogon ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.5 (Santiago)

查看glibc版本

[root@bogon ~]# strings /lib64/libc.so.6 |grep GLIBC

RedHat6.5输出如下glibc版本列表, 从此图可以看出系统最高支持glibc的2.12版本:
这里写图片描述

查看软连接:

ll /lib64/libc**

这里写图片描述

glibc升级至2.17

首先, 点击此处下载glibc, 得到glibc-2.17.tar.gz使用如下命令解压glibc-2.17.tar.gz:

[root@bogon upgrade_dir]# ls
glibc-2.17.tar.gz
[root@bogon upgrade_dir]# tar zxvf glibc-2.17.tar.gz

当前目录下得到目录glibc-2.17, 执行进入目录, 依次执行如下命令编译安装glibc-2.17:

[root@bogon upgrade_dir]# cd glibc-2.17
[root@bogon upgrade_dir]# mkdir build
[root@bogon upgrade_dir]# cd build/
[root@bogon upgrade_dir]# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin #注意了,别修改路径
[root@bogon upgrade_dir]# make -j23
[root@bogon upgrade_dir]# make install

请不要有其他骚操作!!!
至此,升级完成,验证结果:

[root@bogon ~]# strings /lib64/libc.so.6 |grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE

升级GLIBCXX版本

下载升级包

下载libstdc++6_4.7.2-5_amd64.deb

查看libstdc++版本

[root@bogon ~]# strings /usr/lib64/libstdc++.so.6 |grep GLIBCXX

RedHat6.5输出如下libstdc++版本列表, 从此图可以看出系统最高支持libstdc++的3.14.13版本:

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_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

解压升级包

ar -vx libstdc++6_4.7.2-5_amd64.deb && tar zxvf data.tar.gz

备份并升级

mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak
cp -rf ./usr/lib/x86_64-linux-gnu/libstdc++.so.6.17 /usr/lib64/
ln -s /usr/lib64/libstdc++.so.6.17 /usr/lib64/libstdc++.so.6

验证升级成功

[root@bogon ~]# strings /usr/lib64/libstdc++.so.6 |grep GLIBCXX
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_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

大功告成!

采坑篇

第一次升级时,仅仅以为直接引用编译出的动态库即可,不想升级整套环境,然后遇到了很多坑,以至于达到了系统无法登录,系统指令无法使用的地步,但是,本人有个好习惯,做任何修改之前会先行备份,才逐步恢复并按照上述步骤升级成功,以下错误是由什么引起的不再过多描述,仅仅记录错误以及如何解决。

错误一:系统指令不可用
错误信息:

ls: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument 

cp, clear, mv, rm等各种指令,均不可用,两种场景:
1)你把编译出的libc-2.17.so复制到了/lib64目录下,此时执行ldconfig重建软连接,此时:

/lib64/libc.so.6 -> /lib64/libc-2.17.so

解决办法(希望你已经将原来的libc.so.6和libc-2.12.so已经备份至其他目录下):
在控制台执行:

[root@bogon ~]# export LD_LIBRARY_PATH=/usr/lib64:/usr/local/lib64:/root/upgrade_back

这时,系统指令均可使用,然后删除/lib64下的libc-2.17.so,再执行ldconfig即可

[root@bogon ~]# rm -rf /lib64/libc-2.17.so

2)你没有做任何覆盖,仅仅建立软连接到/lib64/libc.so.6,那就处理简单了

-- 建立软连接
[root@bogon ~]# ln -sf /opt/glibc-2.17/lib/lib-2.17.so /lib64/libc.so.6

恢复方法:

[root@bogon ~]# export LD_LIBRARY_PATH=/usr/lib64:/usr/local/lib64:/root/upgrade_back
[root@bogon ~]# ldconfig

错误二:locale库报错
错误信息:

-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory

补充可参考解决:https://blog.csdn.net/absurd/article/details/1103869

猜你喜欢

转载自blog.csdn.net/changqing5818/article/details/79679104