[解決済み】1つのホストで複数のglibcライブラリを使用する場合
質問
私の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
と
バイナリエディタ
. 更新:または
パッチェルフ
.
関連
-
Linuxにおけるxinetdサービスの管理方法に関するケーススタディ
-
ロックされたdeepinファイルを削除する方法は?deepinのロック付きファイルを削除する方法のヒント
-
deepin linuxでroot権限に切り替えるには?Deepinでrootに切り替えるためのヒント
-
Kali Linuxのデスクトップの外観スタイルを変更するには? KALIの外観の最適化のヒント
-
Linux Mintでフェード効果をオンにする方法は?
-
TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み] ビーコン待ちでハングアップしたリーバー
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] find .コマンドでディレクトリを除外する方法
-
[解決済み] bashスクリプトでset -eはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linux ddコマンド詳細説明:データのバックアップ、およびバックアッププロセスでのフォーマット変換のケース
-
Linux sarコマンドによるシステム性能の詳細解析事例
-
deepin20にフォントを追加する方法は?deepin20にフォントをインストールする方法は?
-
Linux Mintでフェード効果をオンにする方法は?
-
Kali Linuxのマウスを左利き用に設定する方法は?Linuxマウス左利き操作選択方法
-
[解決済み] libstdc++.so.5: 共有オブジェクトファイルを開くことができない - しかしライブラリはインストールされており最新である
-
[解決済み] bash sh - command not found [重複].
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] ディレクトリへのシンボリックリンクを削除する
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する