アプリケーションの実行中に更新する必要のあるいくつかの共有ライブラリで構成されるプラグインがアプリケーションにあります。パフォーマンス上の理由から、古いプラグインをアンロードする前に新しいプラグインをロードして使用を開始し、すべてのスレッドが古いプラグインの使用を完了した場合にのみ、プラグインをアンロードします。新しいプラグインと古いプラグインのライブラリには同じシンボルが含まれているため、をdlopen()
使用しRTLD_LOCAL
ます。新しいプラグインが誤って内部関数から古いプラグインのシンボルを呼び出さない場合。
プラグインの1つのライブラリは、プラグインのdynamic_cast()
別のライブラリによって作成されたオブジェクトに対して実行されます。これは、HP-UX、AIX、Solaris、およびWindowsで機能しますが、Linuxでは機能しません。私が理解できる限り、これは、これらすべてのOS(コンパイラ)がクラスの名前を使用して(内のdynamic_cast()
)型を比較しているのに対し、Linuxは名前文字列アドレスを使用してこの比較を行っているため(パフォーマンスを向上させるため)、各ライブラリには独自のライブラリがあるためです。type_info
オブジェクト(でロードされたためRTLD_LOCAL
)アドレスが異なるため、等しいタイプは。と等しくないようdynamic_cast()
です。
次のいずれかを行う方法はありますか?
- 提供されたかのように、オブジェクトのみ
type_info
がロードされるようRTLD_GLOBAL
にします。 - コンパイラーに
type_info
、タイプ間の比較にアドレスではなくクラス名の比較を使用させる。
?使用しているコンパイラは次のとおりです。
$ icpc -V
Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 12.0.0.084 Build 20101006
Copyright (C) 1985-2010 Intel Corporation. All rights reserved.