私はルートアクセス権のないマシンに SSH で接続しています。何かをインストールするために、自分のマシンからライブラリをアップロードし、~/lib
リモート ホストのディレクトリに配置しました。
現在、実行するほぼすべてのコマンドで、以下のエラー (例は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
。TABpwd
キーを押して を自動補完すると、ディレクトリ内のファイルをほぼ見つけられるのでls
、ディレクトリ間を移動できます。
uname -r
というメッセージも返されるSegmentation fault (core dumped)
ので、使用しているカーネルのバージョンがわかりません。
答え1
ログインできるので、大きな問題は発生していません。おそらく、シェルの起動スクリプトが に追加され~/lib
、LD_LIBRARY_PATH
それが 内の不良ライブラリとともに~/lib
、発生している問題の原因となっていると考えられます。
これを修正するには、
unset LD_LIBRARY_PATH
rm
これにより、vim
などを実行して問題のあるライブラリを削除し、必要に応じて起動スクリプトを編集できるようになります。
答え2
問題は、 のコピーをディレクトリglibc
に配置した~/lib
が、そのライブラリがアップロード先のシステムと互換性がないことです。ライブラリは~/lib
で指定されているとおりに参照されています$LD_LIBRARY_PATH
。
これを一時的に修正するには、シェルに組み込まれているものと同じようunset LD_LIBRARY_PATH
に、単にこれを実行しますunset
。その後、お気に入りのテキスト エディターを実行して、起動ファイル内で最初に変数を設定しているものをすべて削除できます。
答え3
Linux Yocto Sumo v4.14 で見つけたものですが、すべての Linux カーネルで同じであるはずです:
- 主要ライブラリの 2 つのバージョン (/lib 内のデフォルト バージョンと、/usr/lib 内のユーザーがインストール後または追加後に作成したバージョン) を切り替えることができます。
- そのためには、各コマンドでLD_LIBRARY_PATH変数を設定するだけです。または、最初からexportを呼び出します。
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/
これでうまくいくはずです!