2009-08-17 8 views
6

plugin_name.so(通常通り)から関数を動的にロードすることで、プラグインシステムを実装したプログラムがあります。GCC/Linux:.soに静的ライブラリを追加していますか?

しかし、私はプラグインのメインプログラムとメイン関数の両方から関数を使用する静的な "ヘルパー"ライブラリ(helper.aと呼ぶことができます)を持っています。彼らはどんな方法でも相互運用する必要はなく、テキスト操作などのためのヘルパー関数です。

このプログラムは、一度起動すると再読み込みや再起動ができないため、メインプログラムからではなく、プラグインから新しい "ヘルパー"機能を期待しています。

私のクエストは..soの "プラグイン関数コード"をメインプログラムとは違う(おそらくもっと新しい)バージョンの "ヘルパー"を使うように強制できますか?

どうすればいいですか?おそらく静的にリンクしたり、helper.aをplugin_name.soに追加することによって、

+0

私は、メインプログラムから新しいヘルパーライブラリを使用したくないと思っています。新しいプラグインを新しい/優れたヘルパーライブラリにリンクしたいだけです。 – conejoroy

+0

ヘルパー機能にダイナミックリンクを使用できない理由はありますか? –

+0

が一度起動すると、メインプログラムは実行を停止することができず、新しいヘルパーをリロードすることさえできません。プログラムはプラグインのプレースホルダなので基本ヘルパー機能が必要です。だから私は、新しい/改良されたヘルパーライブラリや拡張ヘルパーライブラリがあれば、プラグイン全体をもう一度コンパイルすることを好む。 2つの.so(プラグインとそのプラグインが使用する最新のヘルパー)よりも1つの.so(プラグイン)を配布するほうが現実的だと思います – conejoroy

答えて

6

Nick Meyerの答えはWindowsとAIXでは正しくありますが、他のすべてのUNIXプラットフォームではデフォルトでは正しいとは思われません。

ほとんどのUNIXプラットフォームで

、ランタイム・ローダは、あなたがa.outfoo_helperを定義するので、もし、すべてのシンボルについて単一名前空間を維持し、またplugin.soで、その後のいずれかからfoo_helperを呼び出し、実行時に見える最初の定義ローダー(通常はa.outから)がにデフォルトで使用されます。が呼び出されます。また

、絵はそれをあなたが-rdynamicフラグを使用しない限り、foo_helpera.outからエクスポートすることはできません(したがって、ランタイム・ローダには見えないかもしれない)という事実によって複雑、あるいは何らかの共有ライブラリ参照されます。つまり、と表示され、Nickがそれらを記述してから、a.outというリンク行に共有ライブラリを追加すると、そのように動作しなくなります。

ELFプラットフォーム(Linuxなど)では、シンボルの可視性とバインディングを大幅に制御できます。リンカのマニュアルページの-fvisibility=hidden-rdynamicの説明をGCCのマニュアルページに、また-Bsymbolicを参照してください。

他のほとんどのUNIXプラットフォームには、シンボルのバインディングも制御する方法がありますが、これは必ずプラットフォーム固有のものです。

1

メインプログラムとダイナミックライブラリが両方とも静的にhelper.aにリンクしている場合、helper.aのバージョンを混在させる心配はありません(ヘルパーで割り当てられたパスポインタのようなことをしない限り.a .exeと.soの境界の間)。

helper.aから必要なコードは、リンクするときに実際のバイナリに挿入されます。したがって、.exeからhelper.aを呼び出すと、実行可能イメージのコードセグメントからコードを実行し、.soからhelper.aを呼び出すと、コードの部分からコードを実行します。 .soがロードされたアドレス空間。 helper.aの中で同じ関数を呼び出す場合でも、呼び出しが.exeか.soかに応じて、その関数の2つの異なる 'インスタンス'を呼び出すことになります。

+0

私は参照してください。コンパイル時にlibhelper.aのコードをplugin.soにどのように追加することができますか? plugin.soをコンパイルするときに "gcc -lhelper.a -static"のようなものを指定する必要がありますか? – conejoroy

+0

ライブラリがlibhelper.aの場合は、plugin.soをコンパイルするときに-L * dir * -lhelperをgccに渡します。* dir *はlibhelper.aへのパスです。 -staticを指定する必要はありません。これは、静的ライブラリを作成するときに使用されます。 –

+0

この回答は、限定された条件のもとでのみ正しいものであり、記載されていません。 –

関連する問題