LDから共有オブジェクトのシンボルを非表示にします
-
22-07-2019 - |
質問
エクスポートされる同じシンボル名を持つ2つのサードパーティライブラリがあります。実行可能ファイルがロードされると、通常 ld が間違ったものを選択し、結果としてクラッシュします。これらのライブラリのコンテンツについてあまり多くのことをすることはできないので、適切な実装を見つける方法を ld に指示する方法があるかもしれません。
OS-Solaris 10、私のプログラムはautoconf / autotools / gccによって構築され、競合するライブラリは libclntsh (Oracleドライバの一部)とOpenLDAPです。残念ながら、LDAPクライアントのOracleの実装は使用できません。OpenLDAPの多くの機能が欠けています。
編集済み:リンケージは次のとおりです:libclntsh.so-<!> gt; A.so-<!> gt; MAIN <!> lt; -B.so <!> lt; -libldap_r.so
解決
コンパイル時に両方の共有ライブラリをリンクする必要がない場合(質問から明らかではない)、共有ライブラリに-Bdirect
を使用できます。これにより、共有ライブラリのすべてのシンボルが検出された場所で記録されます。実行時に(他の共有ライブラリから)シンボルの2番目の定義が表示される場合、無視されます。
他のヒント
1つの解決策は、LD_PRELOAD
環境変数を、シンボルを優先するライブラリに設定することです。 (そのライブラリに独自の共有ライブラリ依存関係がある場合、その依存関係をすべてプリロードする必要がある場合があります。スペースで区切られた依存ライブラリのリストに<=>を設定するだけです。)
所属していません StackOverflow