2012-06-12 14 views
7

共有オブジェクトA.soがlibssl.a &に静的にリンクしています。別の共有オブジェクトB.soはlibssl.aに静的にリンクしています。スタティックライブラリが2回ロードされました

A.so & B.soにはlibssl.aのシンボルがGLOBALスコープであります。私はこれをreadelf -s A.soによって確認しました

私はA.soとB.soをロードする実行可能ファイルa.outを持っています。 a.outが終了すると、A.soのlibssl.aのシンボルの1つに 二重空きエラーが発生します。

libssl.aは各共有オブジェクトに静的にリンクされていますが、 が公開されているため、同じシンボルがローカルコピーを選択する代わりに共有される可能性があります。

これはどのような回避策ですか?ここのシンボルをローカルにするには?

助けてください

+0

あなたの理論を確認するためにデバッガを使用することをお勧めします。 – jdigital

+0

あなたは精巧にできますか? – KodeWarrior

+0

あなたの状況にどのように適用するのかわからないので、ちょっとしたことです: 'dlopen'はRTLD_LOCALフラグを持っています。ですから、 'dlopen'でこれらのライブラリを開いた場合、おそらくそれを妨害すべきではありません。 – liori

答えて

5

これは本当に期待されています。 libssl.aの1つのインスタンスは、他のもの(おそらくサブセット)を介在させ、その結果はかなりのものではありません。 A.soB.soからエクスポートするものを制御するには、バージョンスクリプト(--version-scriptをldに、-Wl,をccに使用)を使用できます。何かがエクスポートされていない場合は、それを挿入することもできません。

また、-fvisibility=hiddenなどの可視性フラグを使用してlibssl.aをコンパイルすることもできます。これらのフラグは、静的リンクではなくダイナミックリンカにのみ影響します。いずれにしても、出荷される.aファイルには実行ファイルにリンクするための位置依存コードが含まれているため、コンパイルする必要がありました。 32ビットx86などの一部のプラットフォームでのみ、このようなコードを共有オブジェクトにリンクすることができます。ただし、テキストの再配置を犠牲にしてください。

dlopenRTLD_LOCALがコメントで示唆されているように機能するはずですが、この目的でdlopenを使用するのはハッキリです。

もう1つの方法は、両方のライブラリで同じ共有libssl.soを使用することです。

関連する問題