1

それほど新しくない RHEL 5.6 で比較的新しいパッケージを実行する必要があります。

lib3rdparty.soRHEL 5.6 には 2.5 しかインストールされていませんが、glibc 2.6 に対してコンパイルされたサードパーティ ライブラリ ( ) があります。しかし、ライブラリには への参照が 2、3 しかありませんsched_getcpu@@GLIBC_2.6。こんな感じで調べました

readelf -s lib3rdparty.so | egrep "@GLIBC_2.[6-9]"

GLIBC_2.5インストールされているものよりも新しいものへの参照を見つけるため。出力は

0 FUNC    GLOBAL DEFAULT  UND sched_getcpu@GLIBC_2.6 (62)
0 FUNC    GLOBAL DEFAULT  UND sched_getcpu@@GLIBC_2.6

したがって、 からの関数は 1 つだけGLIBC_2.6です。今、ライブラリにこの機能があると思わせたいと思います。その目的のために、ここlibcheat.soで述べたような小さなライブラリ () を作成しました。これで、を実行すると、次の文字列が表示されるファイルがあります。libcheat.soreadelf

10 FUNC    GLOBAL DEFAULT   11 sched_getcpu@@GLIBC_2.6

このライブラリを使用して、動的にリンクされた実行可能ファイルを正常にビルドできましたlib3rdparty.soldこのライブラリがなければ、への参照が見つからないため、何も構築できませんsched_getcpu

しかし、問題はこのファイルの実行にあります。実行しようとすると、次のエラーが発生します。

 ./hello_world: version `GLIBC_2.6' not found (required by ./lib3rdparty.so)

ですから、それを機能させるための最後のステップがあると思いますが、何をすべきかわかりません。私は使用/etc/ld.conf.preloadしてエクスポートしようとしLD_LIBRARY_PATHたので、他のライブラリより先にロードするライブラリを指すようになりました。しかし、それは実行されません。実行しようとしましstraceたが、意味のある出力がありません。

何か案は?

4

2 に答える 2

0

わかりました、「最後のステップ」に言及する必要があると思います。これには、私の場合、サードパーティのバイナリ ライブラリのパッチが含まれていました。

  1. を使用して検索objdumpするアドレスが見つかりましたlib3rdparty.soGLIBC_2.6
  2. を使用して、このアドレスをエクスポートさhexeditれたアドレスに置き換えましたGLIBC_2.5(逆の順序でバイトを検索する必要があります)。また、シンボルを2.5に置き換えました。
  3. を使用しobjdumpて、現在使用しているすべての参照を確認しましたGLIBC_2.5
  4. を参照libcheat.soしていたので再構築する必要があったため、アセンブラインラインとして使用しましたsched_getcpuGLIBC_2.5sched_getcpu@@GLIBC_2.5

その後、私はlibcheat.so近くに置きlib3rdparty.so、に設定LD_LIBRARY_PATHする.と、バイナリが機能し始めました。これが完全に正しく機能するかどうかはわかりませんが、この種の問題に遭遇した場合は、この質問と回答が役立つかもしれません.

于 2012-03-20T04:21:57.917 に答える
0

あなたが選択した回避策が最善の方法であるかどうかはわかりません。アプリケーションに新しい glibc を提供しないのはなぜですか? LD_PRELOAD環境変数を使用してそれを渡すことができます。最適なバイナリ互換性を得るには、新しいディストリビューション バージョンから glibc バイナリを取得するか、RHEL 5.6 用の新しい glibc バージョンを再構築します。

また、LD_DEBUG環境変数をいじって、動的リンカーが何をするかを確認してください。

于 2011-11-03T13:08:38.457 に答える