我透過 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/
這應該可以解決問題!