libc (最も基本的なシステム ライブラリ) をアップグレードしましたが、プログラムが動作しません。正確に言うと、動的にリンクされたプログラムは機能しません。
特定のシナリオでは、再起動が機能するはずです。現在インストールされている libc には新しいカーネルが必要です。再起動すると、その新しいカーネルを入手できます。
実行中のシェルがある限り、多くの場合、回復する方法がありますが、計画していなかった場合は困難になる可能性があります。シェルがない場合、通常、再起動以外に解決策はありません。
ここでは、再起動しないと回復できない場合がありますが、少なくともどのカーネルが実行されているかを簡単に見つけることができます。 /proc/version
を読み取る方法を使用するだけです 外部コマンドを必要としません。
read v </proc/version; echo $v
echo $(</proc/version) # in zsh/bash/ksh
古い libc のコピーがまだ手元にある場合は、それを使用してプログラムを実行できます。たとえば、古い libc が /old/lib
にある場合 /old/bin
には、この古い libc で動作する実行可能ファイルがあります。 、実行できます
LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname
静的にリンクされたバイナリがある場合、それらは引き続き機能します。この種の問題には、統計的にリンクされたシステム ユーティリティをインストールすることをお勧めします (ただし、問題が発生する前にインストールする必要があります)。たとえば、Debian/Ubuntu/Mint/… では、1 つまたは複数の busybox-static (シェルを含む基本的な Linux コマンド ライン ツールのコレクション)、sash (追加のビルトインを含むシェル)、zsh-static (単なるシェルですが、かなりの数の便利なツールが組み込まれています)。
busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
これは、ライブラリがサポートするようにコンパイルされたものよりも古いカーネルで実行されている場合に glibc がスローするエラーのようです。エラーメッセージは DL_SYSDEP_OSCHECK(FATAL)
にあります sysdeps/unix/sysv/linux/dl-osinfo.h
のマクロ
これにはコンパイル時のオプションがあります:
<ブロック引用>
--enable-kernel=version
このオプションは現在、GNU/Linux システムでのみ有効です。バージョン パラメータは、X.Y.Z の形式で、生成されたライブラリがサポートすると予想される Linux カーネルの最小バージョンを示します。バージョン番号が高いほど、追加される互換性コードが少なくなり、コードの取得が速くなります。
何らかの理由で、古いカーネルを使用しているシステムを実行しているようですが、古いカーネルをサポートしていない glibc がインストールされているようです。それがどのシステムであるかについての情報がなければ、どのように入手したかを知るのは難しいですが、ライブラリが更新されてもカーネルが更新されていない場合に発生する可能性があると考える人もいるかもしれません。
file
実行可能ファイルまたはライブラリに必要な最小バージョンが表示されているようです (ただし、もちろん、それを実行するには作業ライブラリが必要です):
/lib/x86_64-linux-gnu/libc-2.23.so: ELF 64-bit LSB shared object, x86-64, ..., for GNU/Linux 2.6.32, stripped
私の半現在の Debian システムでは、必要なカーネル バージョンは 2.6.32
です。 上記のように、私がチェックしたすべてのバイナリで、カーネル バージョンで問題が発生する可能性はほとんどありません。
これを試してください:
cat /proc/version