我通过 SSH 连接到一台没有 root 访问权限的计算机。为了安装一些东西,我从我的机器上传了库并将它们放在~/lib
远程主机的目录中。
现在,对于我运行的几乎所有命令,我都会收到以下错误(示例是 for ls
)或一条Segmentation fault (core dumped)
消息。
ls: relocation error: /lib/libpthread.so.0: symbol __getrlimit, version
GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
到目前为止,我成功运行的唯一命令是cd
和。pwd
我几乎可以通过使用 TAB 自动完成来查找目录中的文件ls
,因此我可以在目录中移动。
uname -r
也返回Segmentation fault (core dumped)
消息,所以我不确定我正在使用什么内核版本。
答案1
既然你可以登录,就没有什么大问题;大概您的 shell 的启动脚本添加到~/lib
,LD_LIBRARY_PATH
并且它与 中的错误库一起~/lib
导致了您所看到的问题。
要解决此问题,请运行
unset LD_LIBRARY_PATH
这将允许您运行rm
等vim
来删除麻烦的库并编辑您的启动脚本(如果适用)。
答案2
问题是您已将 的副本放入目录glibc
中~/lib
,并且该库与您将其上传到的系统不兼容。正在按照~/lib
中指定的方式引用该库$LD_LIBRARY_PATH
。
要暂时解决这个问题,很简单- 这将像内置的 shellunset LD_LIBRARY_PATH
一样工作。unset
然后,您将能够运行您最喜欢的文本编辑器,以便删除启动文件中首先设置变量的所有内容。
答案3
我在 Linux Yocto Sumo v4.14 上发现的内容,但应该与所有 Linux 内核相同:
- 您可以在主要库的 2 个版本之间交换,在 /lib 中默认版本,在 /usr/lib 中用户发布安装的版本,或发布附加版本。
- 为此,只需在每个命令上设置 LD_LIBRARY_PATH 变量即可。或者从一开始就调用导出,即
export LD_LIBRARY_PATH=/lib
# now everything should work again since there should
be a valid backup version of glibc in /lib
# try use a command again
ls ./
#if this works you can overwrite the broken version of glibc in /usr/lib
cp -faL /lib/libc.so* /usr/lib/
cp -faL /lib/libc-*so* /usr/lib/
#should be optional but for the sake of completeness, as the libc package
# installs all of the following:
# direct dependencies and are versioned using
# the same version number as glibc
cp -faL /lib/ld*.so* /usr/lib/
cp -faL /lib/libdl*.so* /usr/lib/
cp -faL /lib/libm*.so* /usr/lib/
cp -faL /lib/libnsl*.so* /usr/lib/
cp -faL /lib/libnss*.so* /usr/lib/
cp -faL /lib/librt*.so* /usr/lib/
cp -faL /lib/libutil*.so* /usr/lib/
cp -faL /lib/libpthread*.so* /usr/lib/
cp -faL /lib/libcrypt*.so* /usr/lib/
cp -faL /lib/libresolv*.so* /usr/lib/
这应该可以解决问题!