2017-01-12 2 views
1

シンボルをdlsymに公開し、静的リンクと動的リンクの間に非表示にする方法はありますか?静的リンクと動的リンクの間にシンボルを隠す、動的ロードのためにdlsymに公開する

私がしたいのは、共有ライブラリまたはプラグインとして変更なしで使用できるオブジェクトファイルを許可することです。オブジェクトファイルがライブラリとして使用可能になる場合、シンボルの衝突を避けなければなりません。残念ながら、これは、プラグインとして使用された場合、プラグインを初期化するために使用する関数の名前は、各プラグインごとに異なる必要があることを意味します。 CPythonは、シンボル名dlsymを共有オブジェクトのファイル名に関連付けることによってこれを解決します。これは問題ありませんが、共有オブジェクトの名前が変更された場合は破損します。

プラグインで共通の初期化関数名をdlsymに公開することをお勧めしますが、共有オブジェクトが動的にリンクされている場合、この名前は無視されます。 (この場合、初期化は別の方法で行われます)

編集:私は質問の前提について間違いました。同じシンボルをエクスポートするダイナミックライブラリAとBでは、プログラムが両方のライブラリにリンクすると、リンカエラーは発生しません。

+0

私はそれが可能だとは思わない、唯一の解決策は2つのライブラリを作成することです。 http://stackoverflow.com/questions/2222162/how-to-apply-gcc-fvisibility-option-to-symbols-in-static-libraries – Stargateur

+0

最も簡単な解決策は、あなたのライブラリに対して*リンクしないことです。 – tofro

+0

@tofro Huh?問題は文字通り、これらのライブラリをどのようにリンクさせることができるかを尋ねています。 – Praxeolitic

答えて

3

いいえ、dlsymとダイナミックリンカは実装を共有していますので、シンボルを他のものに公開しながら非表示にすることはできません。

具体的なケースではなく、と同じ機能名(または、より良い、エクスポートされた文字列リテラル)をすべてのプラグインに使用してください。次にをすべて反復して共有ライブラリをロードし、dlsym(handle, common_name)経由でこの関数を問い合わせることができます。

関連する問題