2016-03-21 8 views
0

実行時に共有オブジェクトobject.soをロードするhostapp.cppがあります。共有オブジェクトは、ホストアプリケーションから必要な.hファイルでのみコンパイルされますが、実行時に、それらの関数(ホストアプリケーションに存在する)にアクセスする必要があります。C++:共有アプリケーションとホストアプリケーションのランタイムリンク、シンボルテーブルの問題

-rdynamicでホストアプリケーションをコンパイルすると明らかにこの問題が解決されますが、ホストアプリケーションのフルシンボルテーブルにオブジェクトが不必要に公開されます。

どのようにホストオブジェクトのシンボルが共有オブジェクトによって認識されるのかを正確に指定できますか?

編集:私はGNUツールチェーンを使ってGNU/Linux上に構築して実行しています。

+0

あなたは '__attribute __((visibility(" default ")))' –

+0

を探していると思います。答えに対するあなたのコメントから、あなたを満足させるようです...もしそうなら、それを受け入れてください;もしそうでなければ、それを修正するか、別のコメントをしてください。 – einpoklum

答えて

1

ご質問は下に指定です:あなたは、あなたがのために構築されているプラ​​ットフォームと述べたことはありません、あなたが使用リンカー何など

あなたは、Linux用にビルドと仮定すると、あなたはいずれかを使用し、メイン実行ファイルからエクスポートするシンボルを指定することができます次の方法の:

  1. あなたは金(GNU ELFリンカ)を使用している場合は、何が必要でしょう--export-dynamic-symboldo
  2. binutilsリンカーを使用している場合は、リンカーバージョンスクリプトを使用して同じものを実行できます(example)。
  3. エクスポートするシンボルを__attribute__((visibility("default")))とマークし、-fvisibility-hiddenとコンパイルし、-rdynamicとリンクすることができます。それはシンボルのほとんどを隠すべきですが、あなたが再コンパイルできないライブラリにリンクするとうまくいきません。
+0

申し訳ありませんが、Linuxの下でg ++ツールチェーンを使用していることを忘れてしまいました – susdu

関連する問題