今天由于需要在环境中使用到node,所以准备下载并安装使用,但是安装完成后提示如下信息:
于是就按照网上的教程下载并安装了对应的glibc库,而且删除了/lib64/目录下的libc.so.6文件之后,和新的glibc库建立了软连接,结果悲剧发生了,接下来我执行的所有Linux命令几乎都报错:
error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
然后我在网上搜了解决办法,清一色的告诉我备份然后重装系统!!!
我当时慌的一批!!!貌似备份也挺麻烦,而且这个系统我捣鼓了一个多月,解决了各种bug,不能就这么毁了!!!于是我不死心的继续找解决办法,功夫不负有心人,找到如下一种解决办法,来自博客:
https://www.jianshu.com/p/216b28535c6b
大概意思如下:
如果发生了和我类似的情况,或者报出如下另外两种错误之一:
Segmentation fault
或者:
error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
那么这个时候千万不要关掉你的终端(包括SSH),执行如下命令可以挽救你于水火之中:
cd /lib64
LD_PRELOAD=/lib64/libc-2.12.so ln -sf /lib64/libc-2.12.so libc.so.6
那么请注意,上述命令中/lib64/libc-2.12.so这个文件是因系统版本有所差异的,我的系统版本是centOS6.10,而且在删除libc.so.6之前,我特意观察了它原始的软连接是指向libc-2.12.so的,所以我使用的是它,如果你不知道,你可以依次降低文件版本去尝试,总有一个能执行完成,成功之后你会发现Linux命令能恢复使用了!!!
至于它的原理大致是这样的:
linux调用so的库文件时,搜索路径为当前路径,再是系统lib目录。
但是如果指定了一个LD_PRELOAD系统变量就能改变这个顺序。
设置LD_PRELOAD了后,库加载的顺序就变成这样了:
LD_PRELOAD —> 当前路径 —> 系统lib目录
总结
像这样的要修改系统基础运行库的操作,慎用!!!特别是随便从网上找来的解决方法,一定要慎重,操作之前做好必要的备份工作,并且要多次考察对比(多找几篇博文去比对),找出最可靠的方案去解决!!!
但是,我是说但是,最好不要去修改系统相关的依赖,除非你知道这将给你带来什么样的后果!!!