2016-07-20 6 views
2

は、私が「dlopenする」別の共有ライブラリ(うち、私は著者/所有者ではないです)dlopenされたライブラリはどのように未定義シンボルを解決しますか?

私の共有ライブラリが、そのうち私は著者/所有者ではないです(実行によって「dlopenさ」されていることを共有ライブラリをオーサリング)

階層は:exe dlopenが私のライブラリ、私のライブラリdlopenが別のライブラリです。

私のライブラリdlopensがopensslを利用するライブラリ。しかし、このライブラリの作者は、おそらくライブラリのユーザがいると仮定して、opensslライブラリをリンクしていないように見えます。

したがって、ライブラリをdlopenしようとすると、未定義のシンボルエラーが発生します。

OpenSSLライブラリを自分のライブラリにリンクしても、未定義のシンボルエラーが表示されます。

私の質問は2つです:OpenSSLを必要とライブラリがdlopen'edされている場合

1)、それが唯一のシンボル解決を行うためのexeファイルへの「見た目」に知っているのですか?

2)ライブラリに欠けているかもしれない特別なリンカーフラグがありますか?必要なものはopensslでリンクしていますか?

ありがとうございました。

+0

おそらく、システムは単に 'SSL'ライブラリを見つけることができません。標準的な場所にありますか?あなたは 'SSL'libsに' LD_LIBRARY_PATH'を設定することができます。 – Galik

答えて

0

問題は実際には未定義シンボルを持つ共有ライブラリにあります。これは動作させることができますが、移植不可能であり、リンカを変更すると破損することがあります(例えば、金と平野の違い)。

シンボルが必要な場合は、opensslにリンクする必要があります。彼らがライブラリとは独立したものにしたいのであれば(おそらく、ABI互換のopensslフォークを動的に切り替えることができれば幸いです)、dlopenを使ってopensslの実装にアクセスし、dlsymを使って手動でシンボルを解決する必要があります。動的リンカが記号を魔法のように "伝播"すると仮定します。

ここで、この作業を行う方法があるかもしれません。

dlopenされたライブラリからのシンボルの「利用可能性」は、dlopenなどの間では、the RTLD_LOCAL/RTLD_GLOBAL flagsによって制御されます。

Ergo、あなたはopensslを必要とするライブラリをdlopenする前に、RTLD_GLOBALでopensslをdlopenすることができます。

+0

フィードバックありがとうございます。はい - それを必要とするライブラリをdlopenする前にopensslライブラリをdlopenすれば、すべて正常に動作します。私はそこにあるべきであるように思われるので、それをやり遂げることを避ける方法があるかどうか疑問に思っていました。ありがとう。 – user3472

+1

方法があります。あなたが依存しているライブラリのやり方とは違って、意図的に動的リンク処理を中断しないでください。 –

1

ほとんどの場合、OpenSSLに依存するライブラリは動的に動作します。ライブラリ.soldd commandを使用してこれを確認できます。 OpenSSLへの依存関係を見つけることができない場合は、ライブラリが手動でOpenSSLを手動でロードすること(つまり、手動でdlopenを呼び出すこと)を意味する可能性があります。

出力がldd出力の一部として表示される場合は、オペレーティングシステムがそれをロードすることを意味します。これに関するルールは長くて複雑ですが、あなたが知る必要がある最も重要なことはLD_LIBRARY_PATHrpathです。

前者では、ローダーが.soファイルを読み込むディレクトリのシステム全体のリストを指定できます。後者は、ローダによって考慮されるライブラリ自体に組み込まれているパスのリストです。

通常、すべての依存関係が正しくインストールされていれば、ライブラリが正しくロードされるように、ライブラリメンテナがrpathを設定することが期待されます。結局のところ、特定の方法で彼らのLD_LIBRARY_PATHを設定するユーザーに頼って非常に便利ではありません。 Here's how you can inspect the .sos rpath

OpenSSLがマシンにインストールされているかどうか、正しいバージョンであれば、ローダーが検索できる場所にあるかどうかを確認する必要があります。これはちょっと面倒なことがありますし、最終的に誰もが物事が読み込まれないということは明らかではないかもしれませんが、うまくいけば、これは解決策を見つけるのに十分な情報になります。

+0

うん、インストールされ、標準の場所 -/usr/lib64にある。フィードバックをお寄せいただきありがとうございます – user3472

関連する問題