8

同じシンボル名がエクスポートされることがある 2 つのサードパーティ ライブラリがあります。実行可能ファイルがロードされると、通常、ldは間違ったものを選択し、結果としてクラッシュします。私はこれらのライブラリの内容についてあまり多くを行うことができないので、ldに適切な実装を見つける方法を指示する方法があるかもしれません。

OS - Solaris 10、私のプログラムは autoconf/autotools/gcc でビルドされています。競合するライブラリはlibclntsh (Oracle ドライバーの一部) と OpenLDAP です。残念ながら、Oracle の LDAP クライアントの実装は使用できません。OpenLDAP が持つ多くの機能が欠けています。

編集: リンクは次のとおりです: libclntsh.so->A.so->MAIN<-B.so<-libldap_r.so

4

2 に答える 2

10

コンパイル時に両方の共有ライブラリにリンクする必要がない場合(質問からは明らかではありません)、-Bdirect共有ライブラリに使用できます。これにより、見つかった共有ライブラリのすべてのシンボルが記録されます。その後、実行時にシンボルの2番目の定義が(他の共有ライブラリから)表示された場合、それは無視されます。

于 2008-12-02T19:39:52.590 に答える
4

LD_PRELOAD1 つの解決策は、シンボルが優先されるライブラリに環境変数を設定することです。(そのライブラリに独自の共有ライブラリ依存関係がある場合は、すべての依存関係をプリロードする必要がある場合がありLD_PRELOADます。依存ライブラリのリストをスペースで区切って設定するだけです。)

于 2008-12-02T20:09:31.047 に答える