1. ホーム
  2. linux

[解決済み】1つのホストで複数のglibcライブラリを使用する場合

2022-04-13 08:21:16

質問

私のlinux(SLES-8)サーバーは現在glibc-2.2.5-235を持っていますが、このバージョンでは動作しないプログラムがあり、glibc-2.3.3が必要なのですが、どうしたらいいですか?

同じホストに複数のglibcsをインストールすることは可能ですか?

古いglibcでプログラムを実行すると、このようなエラーが発生します。

./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./myapp)
./myapp: /lib/i686/libpthread.so.0: version `GLIBC_2.3.2' not found (required by ./myapp)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libxerces-c.so.27)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)

そこで、newglibcという新しいディレクトリを作り、以下のファイルをコピーしておきました。

libpthread.so.0
libm.so.6
libc.so.6
ld-2.3.3.so
ld-linux.so.2 -> ld-2.3.3.so

そして

export LD_LIBRARY_PATH=newglibc:$LD_LIBRARY_PATH

でも、エラーが出るんです。

./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libpthread.so.0)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by libstdc++.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libm.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./newglibc/libc.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libc.so.6)

ということで、まだリンクしているようです。 /lib というメッセージが表示され、その位置から拾えません。

解決方法は?

同じシステム上に複数のバージョンのglibcが存在することは非常によくあることです(私たちは毎日それを行っています)。

しかし、glibc は多くの部品 (200 以上の共有ライブラリ) から構成されており、そのすべてが一致する必要があることを知っておく必要があります。そのうちのひとつが ld-linux.so.2 であり、それは 必ず libc.so.6と一致しない場合は、このようなエラーが発生します。

ld-linux.so.2 への絶対パスは、リンク時に実行ファイルにハードコードされるため、リンク後に簡単に変更することはできません (Update: can be done with ``ld-linux.so.2'')。 パッチェルフ 参照 この回答 を参照)。

新しい glibc で動作する実行ファイルをビルドするには、次のようにします。

g++ main.o -o myapp ... \
   -Wl,--rpath=/path/to/newglibc \
   -Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2

-rpath リンカオプションは、ランタイムローダがライブラリを検索する際に /path/to/newglibc (そのため LD_LIBRARY_PATH を実行する前に)、そして -dynamic-linker オプションは、正しい ld-linux.so.2 をアプリケーションに組み込むことができます。

を再リンクできない場合は myapp アプリケーションがサードパーティのバイナリである場合など)、すべてが失われるわけではありませんが、よりやっかいなことになります。一つの解決策は、適切な chroot 環境を提供します。もう一つの可能性は rtldi バイナリエディタ . 更新:または パッチェルフ .