幾乎沒有命令工作 - 重定位錯誤:符號 __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/







這應該可以解決問題!

相關內容