几乎没有命令工作 - 重定位错误:符号 __getrlimit,版本 GLIBC_PRIVATE 未在 libc.so.6 中定义

几乎没有命令工作 - 重定位错误:符号 __getrlimit,版本 GLIBC_PRIVATE 未在 libc.so.6 中定义

我通过 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 的启动脚本添加到~/libLD_LIBRARY_PATH并且它与 中的错误库一起~/lib导致了您所看到的问题。

要解决此问题,请运行

unset LD_LIBRARY_PATH

这将允许您运行rmvim来删除麻烦的库并编辑您的启动脚本(如果适用)。

答案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/







这应该可以解决问题!

相关内容