2

HP プラットフォームのみで LD_PRELOAD が強制され、他の UNIX フレーバー (AIX、Linux、および Solaris) では強制されません。

Perl モジュールXML::LibXML::Commonをすべての Unix フレーバーでビルドしました。特に、HP プラットフォームでのみ libcl.2 ライブラリに対して LD_PRELOAD を実行する必要がありました。他の UNIX プラットフォームでは、そのようなものは何も必要ありませんでした。

これは OS の動作によるものですか、それとも HP ローダー/コンパイラに欠けているものですか?

「XML::LibXML::SAX」の新しいオブジェクトを単純に作成する perl スクリプトを実行していました。

use XML::LibXML::SAX;
$x = XML::LibXML::SAX->new();

そしてそれは不平を言った

モジュール XML::LibXML::Common の 'site_perl/5.8.8/PA-RISC2.0-thread-multi/auto/XML/LibXML/Common/Common.sl' を読み込めません: Exec フォーマット エラー

そして、libcl.2 に対して LD_PRELOAD を実行すると、エラーはなくなり、Perl はマルチスレッド サポート用にビルドされます。

4

4 に答える 4

2

なぜそれを使う必要があるのか​​ を尋ねていると思います。Perl マルチスレッドを実行している場合、呼び出しているライブラリの 1 つが libc の前にロードされ、シングル スレッドである可能性があります。依存関係処理の一環として、マルチスレッド ライブラリを環境にロードしようとしています。LD_PRELOAD を使用することで、ライブラリ介入の原則を使用して、安全でないライブラリをロードする前にそのライブラリを強制的にロードしていると思います。介入の概念は複雑なものであり、次のリンクからいくつかの利点が得られる場合があります。

抜粋:

ライブラリ割り込みを使用するには、特別な共有ライブラリを作成し、LD_PRELOAD 環境変数を設定する必要があります。LD_PRELOAD が設定されている場合、ダイナミック リンカーは、共有ライブラリを検索するときに、指定されたライブラリを他のライブラリよりも先に使用します。

于 2009-04-21T06:32:45.210 に答える
1

これは古い話題ですが、現在、HP-UX で同様の現象が見られます。私の場合、Perl ではありませんが、Python の sqlite3 バインディングをビルドしているときに、/usr/lib/libcl.2 の動的ロードが失敗しています。

--with-libs='-lcl' を指定して configure スクリプトを実行しました。バイナリにリンクすることと LD_PRELOAD を使用することは同じではありませんが、/usr/lib/libcl.2 がロードされると両方が変わります。それは私のものを解決したので、それを試してください。

于 2013-04-03T20:58:08.733 に答える
1

あなたの質問は明確ではありません...なぜLD_PRELOADを使わなければならなかったのですか?

HP-UX が LD_LIBRARY_PATH ではなく SHLIB_PATH を使用しているため、間違った環境変数を設定していたのでしょうか?

他のプラットフォームでもスペルが異なります。Solaris と Linux はたまたま同じ環境セットを共有しています。変数。MacOS X は DYLIB_LIBRARY_PATH を使用します。AIX は LIBPATH を使用していると思います。

于 2009-04-15T16:51:24.590 に答える
0

これが適切かどうかはわかりませんが、おそらく関連しています。HP-UXに含まれているPerlは、標準のPerlではありませんが、ActiveState Perlのコピーであり、含まれている可能性のある奇妙なものも含まれています。他のすべての環境とは対照的に、PerlがHP-UXで奇妙に動作していることに気付いた場合は、ActiveStatePerlに障害があるかどうかを確認してください。

于 2009-06-04T06:24:11.503 に答える