系统环境:CentOS 64 位。
先把最重要的话放在最前面:
千万不要把这篇文章当成“正常升级 glibc 的步骤”。这里记录的是机器已经被错误升级搞坏之后的应急恢复办法。如果你现在系统还是健康的,请回到上一篇,优先使用容器、新系统或独立前缀方案。
典型故障现象
错误升级 glibc 后,常见报错包括:
Segmentation fault
或者:
error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
遇到这类错误时,不要急着退出当前 SSH 会话。一旦当前 shell 也断掉,而系统命令已经起不来,恢复会更麻烦。
应急恢复思路
如果系统里仍然存在一份可用的旧版 libc-*.so,可以先借助 LD_PRELOAD 把命令临时拉起来,再修正 libc.so.6 链接:
cd /lib64
LD_PRELOAD=/lib64/libc-2.15.so ln -sf /lib64/libc-2.15.so libc.so.6
这里的 libc-2.15.so 只是示例,实际要根据机器上还剩哪一个可用版本决定。可以先观察:
ls -l /lib64/libc-*.so
如果有多个候选版本,逐个尝试通常比盲目重启更安全。
恢复后要做什么
软链接修回后,先确认基础命令是否恢复,再检查:
ldd --version
strings /lib64/libc.so.6 | grep GLIBC_
如果系统恢复了,也不要继续尝试“再升级一次碰碰运气”。更稳妥的做法是:
- 停止对系统 glibc 的原地替换
- 改用容器或新系统
- 或者把目标 glibc 安装到独立前缀,只让特定程序显式使用
原理简述
Linux 加载动态库时,LD_PRELOAD 可以让指定 so 文件优先于系统默认搜索路径被加载。因此在系统半损坏但仍保有一份可用 libc 时,LD_PRELOAD 常常能帮你把“修链接”的那条命令先执行起来。
但这只是应急手段,不是长期运行方案。修完后应尽快把系统恢复到稳定、可维护的状态。
FEATURED TAGS
Git
Cheat Sheet
Markdown
Tools
C++
Linker
Thread
Linux
TCP
Network
GDB
Debug
leetcode
链表
WSL
Ubuntu
Windows
Linux Kernel
GCC
Android
adb
Troubleshooting
Profiling
Sanitizer
glibc
MySQL
Database
Python
curl
Build
ELF
clang-format
CMake
Graphviz
Performance
vcpkg
Protobuf
排查
速查
内存
STL
调试
性能分析
性能
读书笔记
方法论
架构
网络
Timer
mbedTLS
TLS
安全
负载均衡
脚本
工具
LRU
二叉树
BST
中序遍历
回溯
二分查找
优先队列
排序
旋转数组
jenkins
部署